![]() |
ReadLn und ReadBuffer
Hallo,
ich bin noch relativ neu im Umgang mit Delphi und arbeite zur Zeit an einem Programm das mit einem Server interagiert. Das Problem das ich habe ist das der Server seine Antworten teilweise auf mehrere Packete verteilt die sich auch mit Antworten anderer Requests überschneiden können. Bisher fange ich alle Antworten über einen Timer und ReadLn ab:
Code:
Allerdings friert die Anwendung dann für kurze Zeit ein
procedure TForm.TimerTimer(Sender: TObject);
var s: string; begin s := IdTCPClient.ReadLn(#0, 5); if s <> '' then Memo1.Lines.Add(s); end; sofern es sich um größere Datenpackete handelt und die Ausgabe erfolgt nur verzögert. Ich denke der Einsatz von ReadBuffer(); wäre in diesem Fall sinnvoller nach allem was ich dazu gelesen habe. Ich weiß allerdings nicht so recht wie ich diese Anweisung einbinden soll und wie ich die empfangenen Daten nach Schlüsselwörtern auswerten kann um dann entsprechend andere Funktionen auszuführen. Könnte mir dazu vielleicht Jemand ein Beispiel geben? mfg |
Re: ReadLn und ReadBuffer
|
Re: ReadLn und ReadBuffer
naja, nicht wirklich ehrlich gesagt,
eine verbesserung erreich ich damit nicht, eher das gegenteil |
Re: ReadLn und ReadBuffer
Zitat:
|
Re: ReadLn und ReadBuffer
endeffects, welche Delphi-Version benutzt du ?
Falls du Delphi7 benutzt, liegt der Fehler wohl darin, das es sich hierbei um einen Fehler der standardmäßig installierten Indy-Komponennte handelt. |
Re: ReadLn und ReadBuffer
hallo,
nein ich hab die indy version schon aktualisiert und nutze nun die 9er auf delphi 7 |
Re: ReadLn und ReadBuffer
hallo,
also ich hab eine bestehende server verbindung und sende einen request an den server und möchte ich die antwort in ein memo packen, nun weiß ich allerdings nicht wie ich abfrage ob der buffer lesbar ist, zur zeit wird die anwendung mit einem exception fehler abgebrochen
Code:
procedure TForm.Button1Click(Sender: TObject);
var cb: string; begin with IdTCPClient do begin try Write(request'); //if ???readable(2000)??? = true then begin ReadBuffer(CB, SizeOf (CB)); Memo.Lines.Add(cb); //end; except on E : Exception do ShowMessage(E.Message); end; end; |
Re: ReadLn und ReadBuffer
ich hab das ganze nu nochmal bissel abgeändert:
Code:
erzeugt allerdings eine zugriffsverletzung die ich nicht
procedure TForm.Button1Click(Sender: TObject);
var cb: string; begin with IdTCPClient do begin try Write(request'); if IOHandler.Readable(1000) then begin ReadBuffer(CB, SizeOf(CB)); if SizeOf(CB) > 0 then begin Memo2.Lines.Add(CB); end; end; nachvollziehen kann |
Re: ReadLn und ReadBuffer
es ist zum verzweifeln, hat denn hier niemand ahnung davon?
|
Re: ReadLn und ReadBuffer
ich verzweifle auch bald.
sockets sind blöd und die indies kapier ich irgendwie nicht. gibt es nicht ein tolles einsteiger-tutorial für indy (das von delphi-sourc.de bringt's irgendwie net...)? |
Re: ReadLn und ReadBuffer
Als ich vor 4 Tagen mit den Indys (eigentlich nur TCP und UTP) angefangen habe, habe ich auch vergebens nach einem Tutorial gesucht.
Mithilfe der Indy-Demos, der Programmierhilfe (hab mal die Funktionen durchprobiert) und der DP-Suche habe ich dann doch was zusammengebracht. Hätte mit einem guten Tut aber einfacher gehen können :roll: |
Re: ReadLn und ReadBuffer
ich finde es sehr schade das es für delphi nicht
ein portal ala php.net gibt, dort werden alle funktionen detailiert beschrieben und von haus aus gibt es ein beispielcode der den einsatz verdeutlich, darüber hinaus haben die mitglieder die möglichkeit eigene code-schnippsel zu diversen problemlösungen einzustellen, sehr hilfreich wenn es darum geht abläufe nachzuvollziehen gerade für einsteiger ist allerdings besonders die delphi-hilfe wenig dienlich und tutorials/code-schnippsel sind oft nur nach langem wühlen in den suchmaschinen zu finden leider habe ich bisher noch immer keine lösung für mein kleines problem gefunden, es wird noch immer ein excpetion error (EAccessViolation) ausgelöst
Code:
procedure TForm.Button1Click(Sender: TObject);
var cb: string; begin with IdTCPClient do begin try Write('request'); if IOHandler.Readable(1000) then begin ReadBuffer(CB, SizeOf(CB)); if SizeOf(CB) > 0 then begin Memo.Lines.Add(CB); end; end; except on E : Exception do ShowMessage(E.Message); end; end; end; |
Re: ReadLn und ReadBuffer
hi, versuch mal dies:
Delphi-Quellcode:
Delphi strings sind nur referenzen und du musst erstmal speicher reservieren :wink:
setLength(cb,$FF);
ReadBuffer(CB[0], length(CB)); Memo.Lines.Add(CB); |
Re: ReadLn und ReadBuffer
leider funktioniert CB[0] nicht, wenn ich das gegen
CB ersetze wird beim onclick event eine schutzverletzung ausgelöst, folgender code funktioniert nun:
Code:
jemand vielleicht noch eine idee wie man
procedure TForm.Button1Click(Sender: TObject);
begin with IdTCPClient do begin Write('request'); Memo.Lines.Add(CurrentReadBuffer); end; end; den buffer vorher leert, um nur die aktuellen daten auszugeben? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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