Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - array of TVarRec kopieren
BigAl - Mi 18.05.11 10:34
Titel: array of TVarRec kopieren
Hallo zusammen,
bin gerade am Suchen eines elegenaten Wegs um eine Parameterliste zu kopieren. Diese Liste wird übergeben:
Delphi-Quelltext
1:
| procedure X.Y(AParams: array of TVarRec); |
Innerhalb der Funktion muss ich die Paramaterliste für eine spätere Verwendung zwischenspeichern. Dafür gibt es eine Definition:
Delphi-Quelltext
1: 2: 3: 4: 5:
| type THelp = record ... irgendwas ... Params: array of TVarRec; end; |
Der erste Gedanke war dieser:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure X.Y(AParams: array of TVarRec); var I: Integer; LogRecPtr: THelp; begin New(LogRecPtr); SetLength(LogRecPtr^.Params, Length(AParams)); for I := 0 to Length(AParams) do LogRecPtr^.Params[I] := AParams[I];
... weitere Verarbeitung (LogRecPtr wird an eine Liste angefügt) ... end; |
Anmerkung: Ehe Diskussionen losgehen wie "so macht man das nicht" - der Code ist nur schematisch um das Problem zu erklären...
Leider funktioniert das Ganze nur bei ordinalen (einfachen) Typen. Alles was etwas komplexer ist oder variable Länge hat (strings, widestrings etc.) funktionieren hier ja nicht. Hat jemenad eine Idee wie man eine Paramaterliste für spätere Verwendung speichern könnte? Der oben angebenene "LogRecPtr" wird an anderer Stelle - nachdem er ausgewertet wurde - wieder frei gegeben.
Danke schonmal
Alex
jaenicke - Mi 18.05.11 13:01
Nimm einfach keinen Record, sondern eine Klasse, dann kannst du bequem AssignTo implementieren und Assign benutzen, fertig...
BigAl - Mi 18.05.11 21:03
Hmm. Wenn es darum geht, dann könnte ich auch eine entsprechende Funktion implementieren. Wäre evtl. eine Möglichkeit. Nicht ganz so elegeant aber es würde gehen.
Vielen Dank für den Tipp.
Alex
Martok - Mi 18.05.11 21:51
jaenicke hat folgendes geschrieben : |
| Nimm einfach keinen Record, sondern eine Klasse, dann kannst du bequem AssignTo implementieren und Assign benutzen, fertig... |
TVarRec ist nichts selbstgebautes, sondern das was entsteht, wenn man ein "array of const" deklariert.
Mir fällt leider auch nix anderes ein, als die Daten in ein Array of Variant zu übertragen. Das Problem ist ja, dass in TVarRec die Daten von allem was > 4Byte ist nur als Pointer enthalten sind (Siehe auch das Beispiel zum Array of Const in der Hilfe). Diese werden dann auch direkt abgeräumt, wenn der Parameter nicht mehr gebraucht wird (Magic). Daher dürfte auch das direkte umkopieren nicht funktionieren.
BigAl - Di 24.05.11 06:07
Hi,
ich habe nun alles umgestellt und den Programmteil mit "array of string" realisiert. Hintergrund ist, dass ich die Parameter später an einen "Format" übergeben muss. Dieser tut sich auch mit Varianten schwer. Das ganze wird aus verschiedenen Programmteilen angestossen (befüllt) und wird dann in einer Thread abgearbeitet. Diese Thread läd sich diverse Texte aus einer Datenbank und speichert dann die formatierten Texte ebenfalls in einer Datenbank ab. Ich muss also die Parameter irgendwo zwischenspeichern und dann in der Thread wieder abräumen. Das Ganze geschieht in einer Thread-festen Liste. Im Moment werden halt nur noch Strings als Parameter untertützt.
Vielleicht fällt mir ja in nächster Zeit noch eine bessere Lösung ein. Bin auf jeden Fall für alle Tipps dankbar.
Alex
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!