Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Records dynamisch verschachteln (https://www.delphipraxis.net/115335-records-dynamisch-verschachteln.html)

psycore 10. Jun 2008 15:23


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:
type
   THauptrecord = record
     id: Integer;
     SubRec: TRecord;
   end;

type
   TSubRec1 = record
     Value1: Integer;
     Value2: String;
     [...]
   end;

type
   TSubRec2 = record
     Value1: Integer;
     Value2: String;
     [...]
   end;
Soviel zur deklaration. Beim Versenden:

Delphi-Quellcode:
Hauptrecord.id := 5;
Hauptrecord.SubRec := SubRec2;

SubRec2.Value1 := 17;
SubRec2.Value2 := 'bla';
...und dann wird Hauptrecord an den Server geschickt.


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

tomsel 10. Jun 2008 15:34

Re: Records dynamisch verschachteln
 
Für deinen Zweck könnte vielleicht eher ein varianter Record in Frage kommen??

gammatester 10. Jun 2008 15:35

Re: Records dynamisch verschachteln
 
Zitat:

Zitat von psycore
Das Problem: TRecord existiert nicht

Da hat der Compiler doch wohl auch recht :) Zumindestest hast Du uns die Deklaration auch nicht verraten.

Du kannst mal unter Variant parts in records in der Hilfe nachsehen und prüfen, ob Dir diese weiterhelfen.

Gruß Gammatester

TeronG 10. Jun 2008 15:35

Re: Records dynamisch verschachteln
 
Du hast aber schon sowas wie
Delphi-Quellcode:
Var
  Hauptrecord : THauptrecord;

...

SetLength(Hauptrecord,0815);
SetLength(Hauptrecord.SubRec,4711);
gemacht oder?

Namenloser 10. Jun 2008 15:38

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.

psycore 10. Jun 2008 15:52

Re: Records dynamisch verschachteln
 
Zitat:

Zitat von TeronG
Du hast aber schon sowas wie
Delphi-Quellcode:
Var
  Hauptrecord : THauptrecord;

...

SetLength(Hauptrecord,0815);
SetLength(Hauptrecord.SubRec,4711);
gemacht oder?


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

psycore 11. Jun 2008 11:00

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:

tomsel 11. Jun 2008 11:31

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 (?).

gammatester 11. Jun 2008 12:27

Re: Records dynamisch verschachteln
 
Zitat:

Zitat von psycore
Ach Mist
Typ 'TSubRec1' benötigt Finalization - nicht im varianten Record erlaubt.

Und nu? :gruebel:

Warum willst Du denn Finalization im varianten Record machen? (Was immer das bedeuten soll, geht das bei den 'neuen' extended Records)

Selbstverständlich kann man Teile eines varianten Records im Finalizationteil ansprechen (zumindest bei D3 bis D10):

Delphi-Quellcode:
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.
Gruß Gammatester

sirius 11. Jun 2008 12:32

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 09:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz