![]() |
Records dynamisch verschachteln
Hallo,
ich programmiere derzeit eine Client/Server Anwendung und habe mir überlegt, die Kommunikation über Records laufen zu lassen, welche ineinander verschachtelt sind. Einen Standardtyp mit einigen Arrays festzulegen ist mir zu unflexibel. Mal ein Beispiel damit ihr seht was ich meine:
Delphi-Quellcode:
Soviel zur deklaration. Beim Versenden:
type
THauptrecord = record id: Integer; SubRec: TRecord; end; type TSubRec1 = record Value1: Integer; Value2: String; [...] end; type TSubRec2 = record Value1: Integer; Value2: String; [...] end;
Delphi-Quellcode:
...und dann wird Hauptrecord an den Server geschickt.
Hauptrecord.id := 5;
Hauptrecord.SubRec := SubRec2; SubRec2.Value1 := 17; SubRec2.Value2 := 'bla'; Das Problem: TRecord existiert nicht :mrgreen: Gibts eine Möglichkeit sowas zu machen oder bin ich mit der ganzen Idee am Holzweg? mfg & danke psycore |
Re: Records dynamisch verschachteln
Für deinen Zweck könnte vielleicht eher ein varianter Record in Frage kommen??
|
Re: Records dynamisch verschachteln
Zitat:
Du kannst mal unter Variant parts in records in der Hilfe nachsehen und prüfen, ob Dir diese weiterhelfen. Gruß Gammatester |
Re: Records dynamisch verschachteln
Du hast aber schon sowas wie
Delphi-Quellcode:
gemacht oder?
Var
Hauptrecord : THauptrecord; ... SetLength(Hauptrecord,0815); SetLength(Hauptrecord.SubRec,4711); |
Re: Records dynamisch verschachteln
Kann man echt Längen von Records manuell setzen oO? Ich jedenfalls würde dir in disem Fall eindeutig zu Klassen und Streams raten. Mit Records wird das hier nur unnötig kompiziert.
|
Re: Records dynamisch verschachteln
Zitat:
Nein, hätte mich das irgendwie weiter gebracht? :-] Wenn ich eure Reaktionen so lese, scheint mir es ginge auf diese Weise nicht, richtig? Naja, werde mir dann erstmal variante Records näher anschauen. psycore |
Re: Records dynamisch verschachteln
Ach Mist :(
Delphi-Quellcode:
type
THauptrecord = record case Id: integer of //Eigentlicher Datenrecord 1: (SubRec1: TSubRec1); 2: (SubRec2: TSubRec2); end; type TSubRec1 = record Value1: Integer; Value2: String; end; type TSubRec2 = record Value1: Integer; Value2: String; end; Typ 'TSubRec1' benötigt Finalization - nicht im varianten Record erlaubt. Und nu? :gruebel: |
Re: Records dynamisch verschachteln
Oh, dann funktioniert das nur mit Strings fester Länge. Aber die benötigst du ohnehin, wenn du das Ganze als Packet über's Netz schicken willst (?).
|
Re: Records dynamisch verschachteln
Zitat:
Selbstverständlich kann man Teile eines varianten Records im Finalizationteil ansprechen (zumindest bei D3 bis D10):
Delphi-Quellcode:
Gruß Gammatester
type
vr = record fix: integer; case integer of 1: (v1: integer); 2: (v2: boolean); end; var xx: vr; Initialization fillchar(xx, sizeof(xx), 0); finalization xx.fix := 42; xx.v1 := 7; xx.v2 := false; end. |
Re: Records dynamisch verschachteln
@gammatester:
Es geht darum, dass in varianten Records keine dynamischen Variablen enthalten sein drüfen (also Strings oder dynamische Arrays). Das hat nix mit dem Finalization-Abschnitt einer Unit zu tun, sondern mit dem Ende des Gültigkeitsbereiches einer Variable. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz