| Autor |
Beitrag |
BigAl
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Mi 18.05.11 10:34
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
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 18.05.11 13:01
Nimm einfach keinen Record, sondern eine Klasse, dann kannst du bequem AssignTo implementieren und Assign benutzen, fertig...
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: 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
|
|
|