Field in einem Recrod prüfen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Field in einem Recrod prüfen

Beitragvon mtbf40 » 13. Jan 2020, 15:28 Field in einem Recrod prüfen

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??
mtbf40
 
Beiträge: 63
Registriert: 3. Nov 2011, 16:39

Beitragvon theo » 13. Jan 2020, 16:50 Re: Field in einem Recrod prüfen

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:
theo
 
Beiträge: 8247
Registriert: 11. Sep 2006, 18:01

Beitragvon Warf » 13. Jan 2020, 17:10 Re: Field in einem Recrod prüfen

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]]).
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon mtbf40 » 14. Jan 2020, 09:38 Re: Field in einem Recrod prüfen

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:
mtbf40
 
Beiträge: 63
Registriert: 3. Nov 2011, 16:39

Beitragvon fliegermichl » 14. Jan 2020, 13:31 Re: Field in einem Recrod prüfen

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.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 464
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Socke » 14. Jan 2020, 15:01 Re: Field in einem Recrod prüfen

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
Socke
Lazarusforum e. V.
 
Beiträge: 2667
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried