![]() |
XE2 GENERIC RECORDS als Funktionsparameter
ich möchte mit INDY 10 verschiedene Records zwischen Client und Server austauschen. Die Frage bezieht sich nur auf die Verwendung von Generics. Die Funktion IdTCPServerReadCommandRecord(AContext: TIdContext; ReceiveRecord : TGenericRecord<TCommBlock> ); erlaubt es mir den Generic Record Type TCommBlock vom Client zu empfangen. Soweit ist alles OK.
Die Definition von TGenericRecord findet Ihr unten. Da ich ja verschiedene Record Typen senden und empfangen will wäre es toll wenn ich die procedure IdTCPServerReadCommandRecord(AContext: TIdContext; ReceiveRecord : TGenericRecord) umschreiben könnte und damit eine Serverfunktion zum empfangen aller verschiedener RecordTypen verwenden könnte. Geht dies mit Generics? (und unter Verwendung meiner bisherigen Datentype ...)
Delphi-Quellcode:
procedure TServerMainForm.IdTCPServerReadCommandRecord(AContext: TIdContext; ReceiveRecord : TGenericRecord<TCommBlock> ); var LBuffer: TBytes; begin if (ReceiveBuffer(AContext, LBuffer) = False) then begin TIdNotify.NotifyMethod(ShowCannotGetDataErrorMessage); Exit; end else begin ReceiveRecord.value := ReceiveRecord.ByteArrayToMyRecord(LBuffer); Global_Receive_Record := ReceiveRecord.Value; TIdNotify.NotifyMethod(ShowDataReceivedMessage); end; end; procedure TServerMainForm.IdTCPServerExecute(AContext: TIdContext); var aSendrecord : TGenericRecord<TCommBlock>; /// verschiedene generic records aReceiveRecord : TGenericRecord<TCommBlock>; aReceiveDataRecord : TGenericRecord<TDataBlock>; ...... LBuffer: TBytes; begin aSendrecord := TGenericRecord<TCommBlock>.Create; aReceiveRecord := TGenericRecord<TCommBlock>.Create; .... /// /// TIdNotify.NotifyMethod(ShowStartServerMessage); IdTCPServerReadCommandRecord(AContext, aReceiveRecord); Die Definition des generic records :
Delphi-Quellcode:
type TGenericRecord<TRecordType> = class private FValue : TRecordType ; FIsNil : Boolean; public /// <summary> /// Convert Byte to Record , outputtype : TRecordType /// </summary> /// <param name="ABuffer"> /// Byte Array /// </param> function ByteArrayToMyRecord(ABuffer: TBytes): TRecordType; // class function ByteArrayToMyRecord(ABuffer: TBytes): TRecordType; static; /// <summary> /// Store a Record into a BYTE Array /// </summary> /// <param name="aRecord"> /// adjust this record definition to your needs /// </param> function MyRecordToByteArray(aRecord: TRecordType): TBytes; // class function MyRecordToByteArray(aRecord: TRecordType): TBytes; static; property Value : TRecordType read FValue write FValue; property IsNil : Boolean read FIsNil write FIsNil; end; |
AW: XE2 GENERIC RECORDS als Funktionsparameter
Evtl <T> ergänzen bei der Deklaration der Funktion:
Delphi-Quellcode:
Dann kannst Du jeden Record übergeben der vom Typ TGenericRecord ist
TServerMainForm.IdTCPServerReadCommandRecord<T: TGenericRecord>(.., MyRecord : T) //muss vom Typ TGenericRecord sein
|
AW: XE2 GENERIC RECORDS als Funktionsparameter
mag der compiler alles nicht
Delphi-Quellcode:
procedure IdTCPServerReadCommandRecord<T : TGenericRecord<TRecordType>>(AContext: TIdContext; ReceiveRecord : T );
hier sagt mir der compiler unbekanntes feld TRecordType und bei
Delphi-Quellcode:
procedure IdTCPServerReadCommandRecord<T : TGenericRecord >(AContext: TIdContext; ReceiveRecord : T );
sagt mir der compiler unbekannt TGenericRecord ... die definition von TGenericRecord ist aber definitiv eingebunden , denn die Version
Delphi-Quellcode:
procedure IdTCPServerReadCommandRecord(AContext: TIdContext; ReceiveRecord : TGenericRecord<TCommBlock> );
macht ja was sie soll und hier kennt der compiler alles |
AW: XE2 GENERIC RECORDS als Funktionsparameter
So müsste es aber tun:
Delphi-Quellcode:
type
TGenRec<TRecordType>=class private FRecTyp: TRecordType; public property Rec : TRecordType read FRecTyp write FRecTyp; end; type TForm6 = class(TForm) private { Private declarations } public { Public declarations } procedure doit<T>(rec:TGenRec<T>); end; |
AW: XE2 GENERIC RECORDS als Funktionsparameter
Aber so sollte es gehen:
Delphi-Quellcode:
procedure IdTCPServerReadCommandRecord<T>(AContext: TIdContext; ReceiveRecord : TGenericRecord<T> );
begin end; ... var aSendrecord : TGenericRecord<TCommBlock>; /// verschiedene generic records aReceiveRecord : TGenericRecord<TCommBlock>; aReceiveDataRecord : TGenericRecord<TDataBlock>; Context: TIdContext; begin ... IdTCPServerReadCommandRecord<TCommBlock>(context, AReceiveRecord); IdTCPServerReadCommandRecord<TDataBlock>(context, AReceiveDataRecord); ... end; |
AW: XE2 GENERIC RECORDS als Funktionsparameter
DANKE !! !!!!
wenn man die Lösung sieht ist eigentlich alles ganz einfach und logisch .... |
AW: XE2 GENERIC RECORDS als Funktionsparameter
Zitat:
Delphi-Quellcode:
IdTCPServerReadCommandRecord<T>
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 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