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;