Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?) (https://www.delphipraxis.net/177122-suche-die-tbytebuffer-klasse-aus-sysutils-ab-xe-3-a.html)

juergen 17. Okt 2013 18:25

Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Hallo zusammen,

ich benötige die komplette Definition der TByteBuffer Klasse aus SysUtils. In der SysUtils von meinem Delphi XE ist diese leider nicht implementiert.
Ich hoffe das verletzt keine Lizenzbedingungen.

Wäre sehr nett wenn mir jemand die Implementierung der Klasse hier bereitstellen könnte.

Vielen Dank schon mal vorab!

himitsu 17. Okt 2013 18:31

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Hier gibt es kein TByteBuffer. :gruebel:


Ich hoffe mal es ist nicht sowas
http://www.domis.de/cms///modules.ph...Ctr+bgcolor%3D

[edit]
Aber nach diesem, würde ich sagen, daß es soein statisches ByteArray ist. (jedenfalls, wenn ich mir die Zugriffe/Verwendung im Code so anseh)
https://forums.embarcadero.com/messa...ssageID=383651

juergen 17. Okt 2013 18:41

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
@himitsu,
danke für deine Mühe.
Ich verlass mich da auf die Aussage eines Lieferanten, zu welchem ich eine Schnittstelle erstellen muss.
Der meinte diese Klasse wäre in SysUtils....:gruebel:

juergen 17. Okt 2013 18:51

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Delphi-Quellcode:
function SendRequest(var AData: string): boolean;
var
  len: integer;
  bytes: TBytes;
  temp_buffer: TByteArray;
  buffer: TByteBuffer;  //<-- das hier kennt mein Delphi nicht. In SysUtils finde ich nur etwas von TByte


  begin
  Result := false;

  if AData <> '' then
  begin
    // FClient = ScktComp.TClientSocket;
    if FClient.Active then
    begin
      len := Length(AData);

      SetLength(bytes,Length(AData));

      bytes := BytesOf(AData);

      if FClient.Socket.SendBuf(bytes[0],Length(bytes)) = len then
      begin
        buffer := TByteBuffer.Create;

        try
          if not WaitForResponse(FClient.Socket,1) then
          begin
            len := FClient.Socket.ReceiveLength;

            // Nutzdaten übernehmen und zurückgeben
            if not WaitForResponse(FClient.Socket,len) then
            begin
              ZeroMemory(@temp_buffer,SizeOf(temp_buffer));

              AData := '';

              repeat
                len := FClient.Socket.ReceiveLength;

                if FClient.Socket.ReceiveBuf(temp_buffer,len) > 0 then
                begin
                  buffer.AddBytes(temp_buffer[0],len);
                  ZeroMemory(@temp_buffer,SizeOf(temp_buffer));
                  Delay(1);
                end;
              until (len = 0);

              ZeroMemory(@bytes,SizeOf(bytes));
              SetLength(bytes,buffer.Size);
              CopyMemory(@bytes[0],@buffer.Data[0],buffer.Size);
              AData := AData + TEncoding.Unicode.GetString(bytes);

              if AData <> '' then
              begin
                // In AData steht die Antwort
                Result := true;
              end;
            end;
          end;
        finally
          buffer.Free;
          Screen.Cursor := crDefault;
        end;
      end;
    end;
  end;
end;

Uwe Raabe 17. Okt 2013 18:58

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Zitat:

Zitat von juergen (Beitrag 1232339)
Ich verlass mich da auf die Aussage eines Lieferanten, zu welchem ich eine Schnittstelle erstellen muss.
Der meinte diese Klasse wäre in SysUtils....:gruebel:

Dann irrt sich der...

juergen 17. Okt 2013 19:08

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
@Uwe Raabe,

danke, dann weiß ich Bescheid und muss da noch mal nachhaken. :dp:

Lemmy 17. Okt 2013 19:11

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
die gibts nicht mal in XE5
http://docwiki.embarcadero.com/RADSt...uffer&go=Seite

vielleicht hat der schon XE6? ;-)

jaenicke 17. Okt 2013 20:15

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Einen TByteBuffer mit der Methode AddBytes gibt es weder irgendwo im Internet zu finden noch im Delphi Quelltext, das muss etwas eigenes sein.

Zudem sollte eine Schnittstellenbeschreibung eigentlich auf unterer Ebene passieren. Wenn ich das richtig verstehe, ist das nur ein Beispiel, oder? Dann kannst du das auch ohne diese Klasse machen. Einfacher ist es sicherlich, wenn du diese bekommst.

ASM 18. Okt 2013 11:33

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Eine Klasse TByteBuffer gab es schon: wurde 2010 innerhalb einer von Mike Heydon entwickelten und hier veröffentlichten Unit vorgestellt:
Delphi-Quellcode:
Type
  TByteBuffer = class(TObject)
  strict private type
    PByteArray = ^TByteArray;
    TByteArray = array [0..0] of byte;
  strict private
    FBufLen : integer;
    FBuffer : PByteArray;
    function GetFAddress : pointer;
    function GetFValue(AIndex : integer) : byte;
    procedure SetFValue(AIndex : integer; AValue : byte);
  public
    constructor Create(ABufferSize : integer);
    destructor Destroy; override;
    procedure Assign(ABufferPointer : pointer);
    procedure FillBytes(AValue : byte);
    // Properties
    property Address : pointer read GetFAddress;
    property BufferSize : integer read FBufLen;
    property Value[AIndex : integer] : byte read GetFValue write SetFValue;
  end;
Kommentar des Autors (M.Heydon) in der Unit:
TByteBuffer - Creates a a simple static byte array buffer that can be used as pointers to API calls or I/O functions. The Delphi dynamic "TBytes : array of byte" does not always react in the way you think when passing it as a buffer to API or I/O calls.
TByteBuffer uses GetMem and FreeMem as opposed to SetLength(arr,x) and thus passes a TRUE pointer to the actual data. TBytes will sometimes act as a pointer to a pointer to the data.


Allerdings ist in seiner Klasse keine Methode AddBytes() deklariert. Zudem wird der Puffer in der Instanz von TByteBuffer als statisches Array angelegt. Jedoch ohne größeres Problem lässt sich die Klasse derart abändern und erweitern (cf. Methode AddBytes()), dass man eine dynamische Pufferverwaltung erreicht (was ja für ein AddBytes() zwingend erforderlich ist), ohne die im o.g. Kommmentar des Autors formulierten, besonderen Ziele zu verlieren.

Leider aber ist www.delphi3000.com (bereits spätestens seit 2012) nicht mehr im INet vorhanden. Insoweit die (ursprüngliche) Implementierung genau dieser Klasse TByteBuffer zur weiteren Modifizierung von Interesse wäre, könnte ich sie zur Verfügung stellen.

Blup 18. Okt 2013 12:36

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Einfach durch TMemoryStream ersetzen (ungetestet):
Delphi-Quellcode:
function SendRequest(var AData: string): boolean;
var
  len: integer;
  bytes: TBytes;
  temp_buffer: TByteArray;
  buffer: TMemoryStream;
begin
  Result := false;

  if AData <> '' then
  begin
    // FClient = ScktComp.TClientSocket;
    if FClient.Active then
    begin
      len := Length(AData);

      SetLength(bytes,Length(AData));

      bytes := BytesOf(AData);

      if FClient.Socket.SendBuf(bytes[0],Length(bytes)) = len then
      begin
        buffer := TMemoryStream.Create;

        try
          if not WaitForResponse(FClient.Socket,1) then
          begin
            len := FClient.Socket.ReceiveLength;

            // Nutzdaten übernehmen und zurückgeben
            if not WaitForResponse(FClient.Socket,len) then
            begin
              ZeroMemory(@temp_buffer,SizeOf(temp_buffer));

              AData := '';

              repeat
                len := FClient.Socket.ReceiveLength;

                if FClient.Socket.ReceiveBuf(temp_buffer,len) > 0 then
                begin
                  buffer.WriteBuffer(temp_buffer[0],len);
                  ZeroMemory(@temp_buffer,SizeOf(temp_buffer));
                  Delay(1);
                end;
              until (len = 0);

              ZeroMemory(@bytes,SizeOf(bytes));
              SetLength(bytes,buffer.Size);
              CopyMemory(@bytes[0],buffer.Memory,buffer.Size);
              AData := AData + TEncoding.Unicode.GetString(bytes);

              if AData <> '' then
              begin
                // In AData steht die Antwort
                Result := true;
              end;
            end;
          end;
        finally
          buffer.Free;
          Screen.Cursor := crDefault;
        end;
      end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz