Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN (https://www.delphipraxis.net/164392-indy-10-project-trecord-im-funktionsaufruf-entfernen.html)

bernhard_LA 10. Nov 2011 12:11

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.

SirThornberry 10. Nov 2011 12:12

AW: INDY 10 Project, TRECORD im FUNKTIONSAUFRUF ENTFERNEN
 
entweder untypisiert
Delphi-Quellcode:
procedure xyz(var yourRecord);
oder eben einen Pointer verwenden (nicht TPointer)

bernhard_LA 10. Nov 2011 12:44

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;

Bummi 10. Nov 2011 12:48

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;

bernhard_LA 10. Nov 2011 12:53

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