![]() |
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. |
Re: Records dynamisch verschachteln
Zitat:
(Wenn man in seine Records string durch string[xx] ersetzt, wird's compiliert) Gruß Gammatester |
Re: Records dynamisch verschachteln
Ich versteh aber nicht warum das nicht geht.
Zitat:
*edit* Zitat:
|
Re: Records dynamisch verschachteln
Zitat:
Das ist anders, wenn man string[200] o.ä. nimmt, dann werden zB 201 chars reserviert. Gammtester |
Re: Records dynamisch verschachteln
Nein, der Punkt ist, dass am Ende jeder Prozedur, die direkt oder indirekt Ansistrings, dynamische Arrays, Variants oder Interfaces verwendet, aufgeräumt werden muss, damit der Referenzzähler stimmt, eben im Gegensatz zu einfachen Typen oder Objektinstanzen. In varianten Records weiß Delphi dann natürlich nicht, ob jetzt ein String oder ein Integer im Record steht, und entsprechend, ob ein Referenzzähler aktualisiert werden muss.
|
Re: Records dynamisch verschachteln
Also mir kommt dass so vor, als das in eine Endlose diskusion geht.
Ich würde es auch mit Streams versuchen. Einen Record vieleicht, denn du dan in den Stream schreibst und dan rausliest. |
Re: Records dynamisch verschachteln
Darf man fragen, welchen Weg der Kommunikation zwischen Client und Server du dir gedacht hast?
Bedenke dabei, dass Client und Server in unterschiedlichen Adressbereichen laufen... Ergo wirst du dir bestimmt überlegt habe, wie die Daten vom Client zum Server und anders herum gelangen. |
Re: Records dynamisch verschachteln
Client:
Delphi-Quellcode:
Server:procedure TMainForm.ConnectBtnClick(Sender: TObject); var buffer: TIdBytes; begin MsgRec.id := 1; MsgRec.auth.version := '0.1'; MsgRec.auth.nickname := nick_input.text; MsgRec.auth.password := pw_input.text; try Client.Connect; buffer := RawToBytes(MsgRec, SizeOf(TMsgRec)); Client.IOHandler.Write(buffer); except ShowMessage('Verbindung konnte nicht hergestellt werden'); end; end;
Delphi-Quellcode:
procedure TMainForm.ServerExecute(AContext: TIdContext); var MsgRec: TMsgRec; buffer: TIdBytes; begin AContext.Connection.IOHandler.ReadBytes(buffer, SizeOf(TMsgRec)); BytesToRaw(buffer, MsgRec, SizeOf(TMsgRec)); case MsgRec.Id of 1: ClientAuth(MsgRec, AContext); end; end; procedure TMainForm.ClientAuth(MsgRec: TMsgRec; Client: TIdContext); var i: Integer; begin for i := 0 to concnt do begin //Namenszuweisung für IP! if Connections[i].client.Binding.PeerIP = Client.Binding.PeerIP then begin Connections[i].name := MsgRec.auth.nickname; WriteProtocol('Client #' + IntToStr(concnt) + ': ' + Connections[i].client.Binding.PeerIP + ' changed Name to "' + Connections[i].name + '"'); end; end; UpdateClientList; end; Klappt auch super :] Muss jetzt nur noch einen Weg finden die Clients eindeutig zu identifizieren, auch wenn die IP dieselbe ist (das Anhängen der Identifizierungsinformationen an das Data Object scheint nicht zu klappen da der Client bei Indy 10 kein Data Objekt besitzt) |
Re: Records dynamisch verschachteln
Hmmm ich würde für den Zweck COM+/DCOM verwenden, aber wenns funtioniert, dann hau rein :D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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-2025 by Thomas Breitkreuz