![]() |
Welches Zeichen Könnte eine neue Zeile sein?
hi,
ich kriege von dem server mit dem ich verbunden bin einige zeilen text gesendet, ich parse das ganze so:
Delphi-Quellcode:
Queue := Queue + ReceiveText;
while pos(#10, Queue) <> 0 do Queue[pos(#10, Queue)] := #13; while pos(#13#13, Queue) <> 0 do delete(Queue, pos(#13#13, Queue), 1); // ab jetzt sollten höchstens noch #13 zeichen drin sein (die ich später als seperator nehme) while pos(#13, Queue) <> 0 do begin line := copy(Queue, 1, pos(#13, Queue)-1); delete(Queue, 1, pos(#13, Queue)); MEMO1.LINES.ADD(line); end; so, wenn ich mein programm nun starte und der server mir sein zeug sendet bekomme ich folgendes in mein memo: Zitat:
Woher kommen die leeren zeilen? und vorallem, wie bekomme ich sie weg? wenn ich vorher mit:
Delphi-Quellcode:
prüfe und nur dann was ins memo einfüge geht es einwandfrei.... aber ich möchte garnicht erst das ich da ne komplett leere line habe. woher kommt die? vom server kommt nichts leeres das weiss ich (mit ethereal geloggt)...
if line <> ''
btw: Queue ist ein privates feld der klasse |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Warum benutzt du nicht die Funktion AdjustLineBreaks?
|
Re: Welches Zeichen Könnte eine neue Zeile sein?
was bringt mir die funktion? (ka) delphi hilfe hilft mir da nicht gerade...
|
Re: Welches Zeichen Könnte eine neue Zeile sein?
Zitat:
|
Re: Welches Zeichen Könnte eine neue Zeile sein?
weil die funktion ja auch nur irgendwas mit den beiden #13 und #10 macht...
Die 10er ersetzt ich durch 13er, die doppelten 13er lösch ich, dann tu ich jede zeile bis zu einer 13 in mein memo, dann lösche ich die queue bis NACH der 13.... ich weiss nich woher meine leeren zeilen kommen, da sind weder 13er noch 10er nachher drin... |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Moin!
Was ist, wenn der Server nach Unix Art kein #10#13 sendet sondern nur ein #13 ? Dann greift kein einziger deiner Codes und durch das Add kommt ein 2. Zeilenvorschub hinzu... Daher: Lösche alle #10 und alle #13 direkt und sofort. Einen neuen LineBreak bekommst du durch das Add() MfG Muetze1 |
Re: Welches Zeichen Könnte eine neue Zeile sein?
machs doch mit ansireplacestr und tu die #13ner raus machen.. bin sicher du hast da n denkfehler wodurch du trotzdem noch #13 drin hast ( ich peil deinen code gerade net so ganz.. is schon spät )
|
Re: Welches Zeichen Könnte eine neue Zeile sein?
genau mütze
|
Re: Welches Zeichen Könnte eine neue Zeile sein?
@Muetze
wenn ich die #13er lösche hab ich nichtsmehr das den text trennt, der server sendet ja nicht nur eine line, sondern manchmal auch mehrere zusammen, die kann ich ja nur an dem #13 auseinanderhalten, wenn die weg sind ist das gar nichtmehr möglich :\ Zitat:
Aber egal ob es #10#13 oder nur #13 ist, dass hier:
Delphi-Quellcode:
funktionier in jedem fall.
...
while pos(#13, Queue) <> 0 do begin line := copy(Queue, 1, pos(#13, Queue)-1); delete(Queue, 1, pos(#13, Queue)); MEMO1.LINES.ADD(line); end; Wie gesagt ich kriege leere lines hinzugefügt...ka warum. @Supermuckl: wie gesagt die #13er brauch ich |
Re: Welches Zeichen Könnte eine neue Zeile sein?
kennste diese vbsplit procedure ?
*such*
Delphi-Quellcode:
diese könntest du ja benutzen (eine davon)
function Tform1.splitOutIndex(Source: String; Delimiter: String; Index: Integer): String;
var count, number: Integer; giveback: String; begin count := 1; number := 0; giveback := ''; while (count <= length(Source)) and (number <= index) do begin if copy(Source, count, length(Delimiter)) = Delimiter then begin number := number + 1; count := count + length(Delimiter); end else begin if number = Index then giveback := giveback + Source[count]; count := count + 1; end; end; result := giveback; end; //-------------------------------------------------------- function Tform1.VBSplit(Liste: TStringList; Text2Split, SeperatorStr: String): Boolean; Var Posi : Longint; strTemp : String; strPart : String; bInLoop : Boolean; sepLen : Longint; begin result := true; bInLoop := false; try //Liste leeren Liste.clear; strTemp := Text2Split; sepLen := Length(SeperatorStr); Posi := Pos(SeperatorStr,strTemp); While Posi > 0 do begin bInLoop := true; strPart := Copy(strTemp,1,Posi-1); Liste.Add(strPart); strTemp := copy(strTemp,Posi+sepLen,Length(strTemp)-(Posi+sepLen-1)); Posi := Pos(SeperatorStr,strTemp); end; if (bInLoop) or (Length(strTemp)>0) then Liste.add(strTemp); except Result := false; end; end; //-------------------------------------------------------- und den text trennen und die lines adden ( und vor dem adden ALLE #10 und #13 mit ansistrreplace raus filtern und auch '' strings rausfiltern falls sie hintereinander kommen und die splitfunktionen einen leeren string zurück geben als item |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Zitat:
PS: ich hab's auch schon erlebst, das nu #10 vorhanden war *kotz* Das ist 'ne alte Funktion von mir, welche eigentlich alle möglichen Variationen erkennen und in #10#13 umwandeln sollte (hatte jedenfall noch keine Probleme) Ich weiß zwar, daß der bytweise Zugriff nicht ideal ist, aber ich verwende das so selten, das sich ein Umbeu für mich noch nicht gelohnt hat :oops:, allerdings hab ich mir damit das Verschieben, beim Einfügen und Löschen, der nachfolgenden Bytes erspart :)
Delphi-Quellcode:
hab mir jetzt auch mal AdjustLineBreaks angesehn (kannte ich noch nicht), aber für meine zwecke ist das auch nicht immer so hilfreich -.-
Procedure Aendern(Datei: String);
Var Datei1, Datei2: File of Byte; CR, LF, B, Ba: Byte; S: String; Begin S := AnsiLowerCase(ExtractFileExt(Datei)); If (S <> '.htm') and (S <> '.html') and (S <> '.css') and (S <> '.js') and (S <> '.cgi') and (S <> '.txt') and (S <> '.php') Then Exit; AssignFile(Datei1, Datei); Reset(Datei1); AssignFile(Datei2, Datei + '.tmp'); Rewrite(Datei2); CR := 13; //Carriage Return LF := 10; //Line Feed Ba := 255; While not EoF(Datei1) do Begin Read(Datei1, B); If (B <> LF) and (Ba = CR) Then Write(Datei2, LF); Write(Datei2, B); Ba := B; End; CloseFile(Datei2); CloseFile(Datei1); DeleteFile(Datei); RenameFile(Datei + '.tmp', Datei); End; |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Code:
while pos(#13, Queue) <> 0 do
begin line := copy(Queue, 1, pos(#13, Queue)-1); delete(Queue, 1, pos(#13, Queue)+1); //<-- +1 MEMO1.LINES.ADD(line); end; |
Re: Welches Zeichen Könnte eine neue Zeile sein?
moin mütze,
wieso +1? eine #10 ist da janichtmehr hinter (die schleifen löschen das), oder ist da sonstnoch was hinter? |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Moin!
Weil Pos() dir die Position des Zeichens #13 gibt und Delete aber die Anzahl der Zeichen haben will. Und wenn du das gefundene #13 Zeichen mit weglöschen willst, dann +1, ansonsten bleibt es drinne (wird nicht gelöscht) und du erhälst durch dieses Zeichen eine leere Zeile. MfG Muetze1 |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Moin,
mh, aber wenn Pos() die position von #13 zurückgibt, dann habe ich doch exakt die länge oder? wenn #13 z.b an poition 60 ist, dann muss ich 60 zeichen löschen. ich teste es aber trotzdem mal , kurz EDIT: mh, ich hab irgendwie immernoch die leerzeilen drinnen, selbst wenn ich +5 usw teste, das ist dann doch komisch oder <g> |
Re: Welches Zeichen Könnte eine neue Zeile sein?
Ich hab mal meinen Code (von oben) auf 'nen String umgebastelt.
Versuchs mal damit. Mir ist aber aufgefallen, das dieses noch mein alter Code ist ... da muß wohl beim letzten Crash doch irgenwas durcheinander gekommen sein :gruebel: da muß ich wohl mal suchen, wo das Neuere ist, hatte kurz davor die Erkennung für die Zeilenumbrüche verbessert, da diese Version ein kleines Problem mit 'ner bestimmten CR-LF-Kombination hat -.-
Delphi-Quellcode:
(ungetestet)
Var S, S2: String;
Ca: Char; Begin S := Queue; S2 := ''; Ca := #FF; While S > '' do Begin If (S[1] <> #10) and (Ca = #13) Then S2 := S2 + #10 + S[1] Else S2 := S2 + S[1]; Ca := S[1]; Delete(S, 1, 1); End; Memo1.Lines.Text := S2; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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