Autor Beitrag
BigAl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
BeitragVerfasst: Mi 18.05.11 10:34 
Hallo zusammen,

bin gerade am Suchen eines elegenaten Wegs um eine Parameterliste zu kopieren. Diese Liste wird übergeben:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  THelp = record
    ... irgendwas ...
    Params: array of TVarRec;
  end;


Der erste Gedanke war dieser:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 18.05.11 13:01 
Nimm einfach keinen Record, sondern eine Klasse, dann kannst du bequem AssignTo implementieren und Assign benutzen, fertig...
BigAl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 18.05.11 21:51 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
BeitragVerfasst: 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