![]() |
Buffer beibringen von Indys akzeptiert zu werden
Hi Leute,
ich hab in den letzten Tagen einen Buffer für meine Übertragung gebaut. Dieser funktioniert auch soweit ganz gut nur hab ich jetzt ein Problem beim Übertragen von dem Buffer. Wenn ich den Buffer so benutzen will:
Delphi-Quellcode:
dann bekomme ich folgende Fehlermeldung
IOHandler.Write(TransferBuffer, cFileSplitSize);
E2250 Es gibt keine überladene Version von 'Write', die man mit diesen Argumenten aufrufen kann Der Buffer ist im Grundlegenden so aufgebaut:
Delphi-Quellcode:
wie kann ich ihm beibringen das er diese Funktionen benutzt wenn ich IOHandler.Write mit dem Buffer aufrufe?
TTransferBuffer = class(TThread)
public function Read(var Buffer; Count: integer): integer; function Write(const Buffer; Count: integer): integer; end; |
Re: Buffer beibringen von Indys akzeptiert zu werden
Welchen Typ hat Buffer?
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Also der TransferBuffer ist vom Typ TTransferBuffer ...
oder was meinst du? |
Re: Buffer beibringen von Indys akzeptiert zu werden
Nein, die Parameter dessen Methoden
|
Re: Buffer beibringen von Indys akzeptiert zu werden
function Write(const Buffer; Count: integer): integer;
aso du meinst diesen Buffer ... der hat keinen typ er ist genau so deklariert wie oben angegeben. |
Re: Buffer beibringen von Indys akzeptiert zu werden
Er muss aber einen Typ haben
|
Re: Buffer beibringen von Indys akzeptiert zu werden
müssen tut er nicht ...
ich kann ja z.b. die Methode so aufrufen:
Delphi-Quellcode:
Meine einzige überlegung ist das ich das ganze über einen zusätzlichen Memory Buffer laufen lasse (läuft aber aus da nicht performant genug). Das würde dann so aussehen:
TransferBuffer.Write(FileStream, 1);
Delphi-Quellcode:
var
TempMemory : TMemoryStream; begin TempMemory := TMemoryStream.Create; SetLength(TempMemory, 1000); TransferBuffer.Read(TempMemory, 1000); IOHandler.Write(TempMemory, 1000); TempMemory.Free; end; |
Re: Buffer beibringen von Indys akzeptiert zu werden
Doch in Delphi muss jede Variable/Parameter einen Typ besitzen.
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Muss nicht. Schau Dir mal TStream.Read oder Write an, die haben auch keinen Typ. (-:
|
Re: Buffer beibringen von Indys akzeptiert zu werden
Richtig, ein Typ ist da nicht zwingend. Aber letzendlich läuft es dann darauf hinaus das es intern als Pointer übergeben wird.
|
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 20:54 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