Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Buffer beibringen von Indys akzeptiert zu werden (https://www.delphipraxis.net/125511-buffer-beibringen-von-indys-akzeptiert-zu-werden.html)

gsh 7. Dez 2008 19:48


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:
IOHandler.Write(TransferBuffer, cFileSplitSize);
dann bekomme ich folgende Fehlermeldung
E2250 Es gibt keine überladene Version von 'Write', die man mit diesen Argumenten aufrufen kann

Der Buffer ist im Grundlegenden so aufgebaut:
Delphi-Quellcode:
TTransferBuffer = class(TThread)
public
  function Read(var Buffer; Count: integer): integer;
  function Write(const Buffer; Count: integer): integer;
end;
wie kann ich ihm beibringen das er diese Funktionen benutzt wenn ich IOHandler.Write mit dem Buffer aufrufe?

mkinzler 7. Dez 2008 19:51

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Welchen Typ hat Buffer?

gsh 7. Dez 2008 19:54

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Also der TransferBuffer ist vom Typ TTransferBuffer ...
oder was meinst du?

mkinzler 7. Dez 2008 19:59

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Nein, die Parameter dessen Methoden

gsh 7. Dez 2008 20:11

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.

mkinzler 7. Dez 2008 20:20

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Er muss aber einen Typ haben

gsh 7. Dez 2008 20:35

Re: Buffer beibringen von Indys akzeptiert zu werden
 
müssen tut er nicht ...
ich kann ja z.b. die Methode so aufrufen:
Delphi-Quellcode:
TransferBuffer.Write(FileStream, 1);
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:
Delphi-Quellcode:
var
  TempMemory : TMemoryStream;
begin
  TempMemory := TMemoryStream.Create;
  SetLength(TempMemory, 1000);
  TransferBuffer.Read(TempMemory, 1000);
  IOHandler.Write(TempMemory, 1000);
  TempMemory.Free;
end;

mkinzler 7. Dez 2008 20:36

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Doch in Delphi muss jede Variable/Parameter einen Typ besitzen.

Die Muhkuh 7. Dez 2008 20:45

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Muss nicht. Schau Dir mal TStream.Read oder Write an, die haben auch keinen Typ. (-:

SirThornberry 7. Dez 2008 21:00

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.

gsh 7. Dez 2008 21:04

Re: Buffer beibringen von Indys akzeptiert zu werden
 
danke für diese zustimmungen ... habe schon an mir selbst gezweifelt :mrgreen:

sx2008 8. Dez 2008 01:14

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:
var
  buf : TArray of Byte;
  readcount : integer;
begin
  SetLength(buf, 1000);
  readcount := TransferBuffer.Read(buf[0], 1000);
Die Schreibweise buf[0] sieht zwar gewöhnungsbedürftig aus, ist aber so.
Der Compiler setzt im Prinzip den Adressoperator vornean, um daraus einen Zeiger zu gewinnen:
Delphi-Quellcode:
.Read(@buf[0], 1000);
Hier noch das Beispiel mit einem String:
Delphi-Quellcode:
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
Hier muss buf[1] geschrieben werden, weil Strings in Delphi mit dem Index 1 beginnen.

Und jetzt noch mit Zeiger:
Delphi-Quellcode:
var
  buf : Pointer;
  readcount : integer;
begin
  Getmem(buf, 1000);
  readcount := TransferBuffer.Read(PChar(buf)^, 1000);
  ...
  FreeMem(buf);
Hier muss der Zeiger nach PChar gecastet werden, weil man einen neutralen Zeiger nicht dereferenzieren kann.

gsh 8. Dez 2008 11:12

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:
IOHandler.Write(TransferBuffer, cFileSplitSize);
Nur wie bring ich Delphi bei es zu akzeptierten?

SirThornberry 8. Dez 2008 11:17

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?

gsh 8. Dez 2008 14:10

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:
procedure Write(AStream: TStream; ASize: Int64 = 0; AWriteByteCount: Boolean = False); overload; virtual;
Würde es also funktionieren wenn ich meine Klasse ein bisschen umschreib und daraus ein Child von der TStream Klasse mache:
Delphi-Quellcode:
TTransferBuffer = class(TSream)
Bin nicht so gut in OOP, funktioniert sowas? Ist es empfehlenswert sowas zu machen?

gsh 9. Dez 2008 14:24

Re: Buffer beibringen von Indys akzeptiert zu werden
 
hat einer noch eine idee?

jfheins 9. Dez 2008 16:21

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 ;)

gsh 9. Dez 2008 22:57

Re: Buffer beibringen von Indys akzeptiert zu werden
 
Zitat:

Zitat von jfheins
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 ;)

ok danke ... dann werde ich das morgen gleich ausprobieren

gsh 14. Dez 2008 16:44

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.
http://www.delphipraxis.net/internal...t.php?t=148370


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.

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