![]() |
Re: Buffer beibringen von Indys akzeptiert zu werden
danke für diese zustimmungen ... habe schon an mir selbst gezweifelt :mrgreen:
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Als Puffer kann man ein Array of Byte oder auch einen normalen (Ansi-)string verwenden:
Delphi-Quellcode:
Die Schreibweise buf[0] sieht zwar gewöhnungsbedürftig aus, ist aber so.
var
buf : TArray of Byte; readcount : integer; begin SetLength(buf, 1000); readcount := TransferBuffer.Read(buf[0], 1000); Der Compiler setzt im Prinzip den Adressoperator vornean, um daraus einen Zeiger zu gewinnen:
Delphi-Quellcode:
Hier noch das Beispiel mit einem String:
.Read(@buf[0], 1000);
Delphi-Quellcode:
Hier muss buf[1] geschrieben werden, weil Strings in Delphi mit dem Index 1 beginnen.
var
buf : string; readcount : integer; begin SetLength(buf, 1000); readcount := TransferBuffer.Read(buf[1], 1000); // ... ein kleiner Trick... SetLength(buf, readcount); // String auf die tatsächliche Grösse verkürzen // jetzt kann mit dem String buf bequem weitergearbeitet werden Und jetzt noch mit Zeiger:
Delphi-Quellcode:
Hier muss der Zeiger nach PChar gecastet werden, weil man einen neutralen Zeiger nicht dereferenzieren kann.
var
buf : Pointer; readcount : integer; begin Getmem(buf, 1000); readcount := TransferBuffer.Read(PChar(buf)^, 1000); ... FreeMem(buf); |
Re: Buffer beibringen von Indys akzeptiert zu werden
danke sx2008
an diese Möglichkeiten hab ich auch schon gedacht nur das Problem ist eben das ich aus Performancegründen nicht noch einen Buffer verwenden will. Also ich würde meinen TransferBuffer gerne direkt verwenden:
Delphi-Quellcode:
Nur wie bring ich Delphi bei es zu akzeptierten?
IOHandler.Write(TransferBuffer, cFileSplitSize);
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Die Methode braucht einfach einen zusammenhängenden Speicher. Also müsstest du bei dir den Speicher in deiner eigenen Klasse irgendwo zusammenhängend haben und musst diesen dann übergeben. Anders geht es nicht denn woher sollte eine Methode die Daten am Stück braucht wissen wie sie Funktionen deiner Klasse aufrufen muss?
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Mir ist gerade noch was eingefallen:
Bei den Indys gibt es eine überladene Version für Streams:
Delphi-Quellcode:
Würde es also funktionieren wenn ich meine Klasse ein bisschen umschreib und daraus ein Child von der TStream Klasse mache:
procedure Write(AStream: TStream; ASize: Int64 = 0; AWriteByteCount: Boolean = False); overload; virtual;
Delphi-Quellcode:
Bin nicht so gut in OOP, funktioniert sowas? Ist es empfehlenswert sowas zu machen?
TTransferBuffer = class(TSream)
|
Re: Buffer beibringen von Indys akzeptiert zu werden
hat einer noch eine idee?
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Ja, wen du deinen Puffer von TStream ableitest, kannst du ihn an die Funktion übergeben. Und wenn du die TStream-Methoden richtig implementierst, sollte das dann auch gehen ;)
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Zitat:
|
Re: Buffer beibringen von Indys akzeptiert zu werden
hi Leute
tut mir leid das ich mich nicht so lang gemeldet habe aber ich habe bin immer noch dabei den Buffer richtig umzubauen. Also den eigentlichen umbau hat nicht lang gedauert aber nun habe ich das Problem das der Pointer interessante weiße nicht richtig übergeben wird. Ich habe dafür einen neuen Thread gemacht da es nicht mehr viel mit diesem zu tun hat. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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