![]() |
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! |
AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
Hier gibt es kein TByteBuffer. :gruebel:
Ich hoffe mal es ist nicht sowas ![]() [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) ![]() |
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: |
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; |
AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
Zitat:
|
AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
@Uwe Raabe,
danke, dann weiß ich Bescheid und muss da noch mal nachhaken. :dp: |
AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
die gibts nicht mal in XE5
![]() vielleicht hat der schon XE6? ;-) |
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. |
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
![]()
Delphi-Quellcode:
Kommentar des Autors (M.Heydon) in der Unit:
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; 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 ![]() |
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 18:51 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