Einzelnen Beitrag anzeigen

bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#1

XE2 GENERIC RECORDS als Funktionsparameter

  Alt 28. Jun 2012, 08:59
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;
  Mit Zitat antworten Zitat