Field in einem Recrod prüfen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Field in einem Recrod prüfen

Beitrag von mtbf40 »

Hallo,

ich bin auf der Suche nach einer Lösung für folgendes Problem:

ich habe zwei Records

Code: Alles auswählen

 
 
test1 = record
  feld1 : TStrings;
  feld2 : Strings;
  feld3 : Strings;
end;
 
test2 = record
  feld3 : TStrings;
  feld4 : Strings;
  feld5 : Strings;
end;
 


1.
Ich lese ein xml-File aus und ermittel einzelne Nodes. Bei bestimmten Nodes möchte ich überprüfen ob der Name des Nodes als Feld im Record vorhanden ist.
Das mache ich deshalb, weil ich die Unit für das auslesen des xml-Files generisch halten will. Als Übergabeparameter an die Funktion z.B. ReadXML dient der Record (test1).
Wenn ein Node, mit z.B. feld1 übereinstimmt, dann wird feld1 der Wert des Nodes übergeben.
Bsp. xml: <feld1>test1</feld1>
unit: if feld1 in test then...

2.
jetzt lese ein anderes xml-File ein und übergebe test2
in diesem Schritt muss jetzt folgendes übereinstimmen:
Bsp. xml: <feld4>test4</feld4>
unit: if feld4 in test2 then...

Gibt es eine Möglichkeit dies zu ermitteln??

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Field in einem Recrod prüfen

Beitrag von theo »

Klingt für mich nach Krampf / Designfehler.
Wahrscheinlich ist das sogar machbar...
https://stackoverflow.com/questions/497 ... g-variable
https://stackoverflow.com/questions/278 ... on-records
...aber ich würde da nochmals über die Bücher gehen. :wink:

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Field in einem Recrod prüfen

Beitrag von Warf »

Erstmal, Pascal ist eine kompilierte Sprache, keine Scriptsprache. Du solltest keine annahmen über das aussehen deines Source Codes nach dem Kompilieren machen.

Aber, seit version 2.7 oder so unterstüzt der FPC RTTI, Run-Time Type Information, also informationen über das aussehen des Typs zur laufzeit. Schau mal hier: Link. Kompliziert aber machbar.

Aber, das was du machen willst schreit nach schlechtem Design. RTTI ohne Polymorphie macht gar keinen Sinn, wenn du test2 benutzt, weißst du doch das du test2 benutzt (es gibt ja keine möglichkeit einen Test1 in diese funktion zu stecken), daher macht RTTI an dieser stelle keinen Sinn. Würdest du einen poymorphen typen benutzen der entweder test1 oder test2 sein könnte, würde das schon eher Sinn machen (Wobei dann natürlich eine klasse mit einer virtuellen funktion mehr sinn machen würde).

Ich würde das was du machen willst so machen:
1. XML parsen und die Nodes in eine String-String Map schreiben (StringList mit Key, Value oder TFPGMap oder gMap)
2. Für jeden möglichen record eine funktion wie folgt schreiben (angenommen Stringlist als Map, wegen einfach und so):

Code: Alles auswählen

function WriteToTest1(const data: TStringList): test1;
begin
  Result.feld1 := data.Values['feld1'];
  Result.feld2 := data.Values['feld2'];
  Result.feld3 := data.Values['feld3'];
end;


Wenn du den record bearbeitest musst du nur die Funktion WriteToTest1 bearbeiten.

Aber, generell klingt dein Problem für mich so als wölltest du die Idee einer String-String Map neu erfinden. Statt nem Record test1 würde ich einfach eine StringList mit den Keys benutzen (also einfach ne liste 'feld1', 'feld2', 'feld3'), und dann die benutzen um in der String-Map die values abzurufen (also statt test1.feld1 schreibst du dann data['feld1'] oder data[test1[0]]).

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Field in einem Recrod prüfen

Beitrag von mtbf40 »

ok ok - war nur eine Frage - werde diese "Herausforderung" jetzt mit einem Übergabeparameter lösen.

Auf der anderen Seite bin ich noch nicht so richtig überzeugt das man die Feld-Namen eine Records nicht abfragen kann - ob Sinn oder Unsinn ist erst einmal zweitranig :roll:

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Field in einem Recrod prüfen

Beitrag von fliegermichl »

mtbf40 hat geschrieben:Auf der anderen Seite bin ich noch nicht so richtig überzeugt das man die Feld-Namen eine Records nicht abfragen kann


Kann man nicht. Die werden vom Compiler in Adressen umgewandelt.
Ich hab damit schon viel Krampf gehabt weil ein Kunde auf Records bestanden hat. Bei Klassen ist das kein Problem.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Field in einem Recrod prüfen

Beitrag von Socke »

fliegermichl hat geschrieben:Kann man nicht. Die werden vom Compiler in Adressen umgewandelt.
Ich hab damit schon viel Krampf gehabt weil ein Kunde auf Records bestanden hat. Bei Klassen ist das kein Problem.

Der FPC kann doch mittlerweile auch für Records RTTI-Informationen anlegen; siehe auch Links in den vorherigen Beiträgen. Fehlt da etwas?
Niemand hat gesagt, dass es einfach ist; die RTTI-Strukturen sind entsprechend komplex.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten