![]() |
INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
ich bin auf der Suche bei den Funktionen (siehe unten) nicht TMyRecord sondern ein beliebiges TRecord übergeben zu können, muss ich als Übergabe Parameter TPointer wählen oder gibt es eine andere Möglichkeit hier flexibel zu sein?
(Function overload eher nicht)
Delphi-Quellcode:
/// another record for demonstration issues TMyRecord = record Details: string[255]; FileName: string[255]; FileSize: Integer; Recordsize : Integer; end; type TMyThreadSafeRecord = class (TIdThreadSafe) MyRecord : TMyRecord; end; function ByteArrayToMyRecord(ABuffer: TBytes): TMyRecord; var LDest: PAnsiChar; begin LDest := PAnsiChar(@Result); Move(ABuffer[0], LDest[0], SizeOf(TMyRecord)); end; function MyRecordToByteArray(AMyRecord: TMyRecord): TBytes; var LSource: PAnsiChar; begin LSource := PAnsiChar(@AMyRecord); SetLength(Result, SizeOf(TMyRecord)); Move(LSource[0], Result[0], SizeOf(TMyRecord)); end; end. |
AW: INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
entweder untypisiert
Delphi-Quellcode:
oder eben einen Pointer verwenden (nicht TPointer)
procedure xyz(var yourRecord);
|
AW: INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
geht das auch für den Rückgabewert einer Funktion ?
function ByteArrayToMyRecord(ABuffer: TBytes): var AnyRecord; ????
Delphi-Quellcode:
function MyRecordToByteArray(var AMyRecord ): TBytes; var LSource: PAnsiChar; begin LSource := PAnsiChar(@AMyRecord); SetLength(Result, SizeOf(TMyRecord)); Move(LSource[0], Result[0], SizeOf(aMyRecord)); end; function ByteArrayToMyRecord(ABuffer: TBytes): TMyRecord; var LDest: PAnsiChar; begin LDest := PAnsiChar(@Result); Move(ABuffer[0], LDest[0], SizeOf(TMyRecord)); end; |
AW: INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
getestet
Delphi-Quellcode:
Procedure ByteArrayToMyRecord(ABuffer: TBytes;out MyRecord;size:Integer);
begin Move(ABuffer[0], MyRecord, size); end; procedure TForm1.Button1Click(Sender: TObject); type Tr=Record i:Integer; s:Array[0..9] of AnsiChar; end; var B:TBytes; r:Tr; begin r.i := 0; r.s := ''; SetLength(b,14); b[0] := 255; b[1] := 0; b[2] := 0; b[3] := 0; b[4] := Ord('A'); b[5] := Ord('B'); ByteArrayToMyRecord(b,r,SizeOf(r)) end; |
AW: INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
meine Lösung sieht jetzt so aus
Delphi-Quellcode:
function ReceiveBuffer(AClient: TIdTCPClient; var ABuffer: TBytes): Boolean; function SendBuffer(AClient: TIdTCPClient; ABuffer: TBytes): Boolean; implementation function ReceiveBuffer(AClient: TIdTCPClient; var ABuffer: TBytes): Boolean; var LSize: LongInt; begin Result := False; LSize := AClient.IOHandler.ReadLongInt(); AClient.IOHandler.ReadBytes(ABuffer, LSize, False); Result := True; end; function SendBuffer(AClient: TIdTCPClient; ABuffer: TBytes): Boolean; begin Result := True; try AClient.IOHandler.Write(LongInt(Length(ABuffer))); AClient.IOHandler.WriteBufferOpen; AClient.IOHandler.Write(ABuffer, Length(ABuffer)); AClient.IOHandler.WriteBufferFlush; finally AClient.IOHandler.WriteBufferClose; end; Result := True; end; "Out" Kannte ich noch gar nicht, Danke für die Tips !!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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