AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)

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

Ein Thema von juergen · begonnen am 17. Okt 2013 · letzter Beitrag vom 18. Okt 2013
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.026 Beiträge
 
Delphi 10.3 Rio
 
#1

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

  Alt 17. Okt 2013, 19:25
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.939 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 17. Okt 2013, 19:31
Hier gibt es kein TByteBuffer.


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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (17. Okt 2013 um 19:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.026 Beiträge
 
Delphi 10.3 Rio
 
#3

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

  Alt 17. Okt 2013, 19:41
@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....
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.026 Beiträge
 
Delphi 10.3 Rio
 
#4

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

  Alt 17. Okt 2013, 19:51
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;
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.933 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 17. Okt 2013, 19:58
Ich verlass mich da auf die Aussage eines Lieferanten, zu welchem ich eine Schnittstelle erstellen muss.
Der meinte diese Klasse wäre in SysUtils....
Dann irrt sich der...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.026 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 17. Okt 2013, 20:08
@Uwe Raabe,

danke, dann weiß ich Bescheid und muss da noch mal nachhaken.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.296 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 17. Okt 2013, 20:11
die gibts nicht mal in XE5
http://docwiki.embarcadero.com/RADSt...uffer&go=Seite

vielleicht hat der schon XE6?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.177 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 17. Okt 2013, 21:15
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 18. Okt 2013, 12:33
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.348 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 18. Okt 2013, 13:36
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf