Entwickler-Ecke
Sonstiges (Delphi) - Zeilenumbrüche aus label entfernen?
Andi1982 - Mi 23.02.05 21:44
Titel: Zeilenumbrüche aus label entfernen?
Hallo,
ich habe ein Label in dem ein String dargestellt werden soll. Allerdings wird das ganze mit zeilenumbrüchen dargestellt:
Zitat: |
<html>
<head>..
..
..
</head>
</html> |
ich hätte das ganze aber gerne so:
Zitat: |
<html><head>......</head></html> |
gibt es dafür eine Funktion? ich konnte nirgends etwas finden. Wenn es geht soll der String bearbeitet und nicht nur irgendeine Einstellung des labels geändert werden.
Achja, und wenn ich gerade beim thema strings bin. Beim suchen nach einer Funktion für mein Vorhaben bin ich über "AdjustLineBreaks()" gestoßen. Was ist denn der Sinn von dieser Funktion??
Gruß Andi
Moderiert von
Tino: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Do 24.02.2005 um 09:00
AXMD - Mi 23.02.05 21:46
Wieso ersetzt du nicht einfach alle Vorkommen von #13#10 durch einen Leerstring :gruebel:
AXMD
Andi1982 - Mi 23.02.05 22:05
Habe eine Funktion geschrieben die das machen sollte, aber irgendwie läuft das in eine Endlosschleife :(
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function TForm1.DelUmbruch(Input: String): String; begin while pos(#13#10, Input) > 0 do begin StringReplace(Input, #13#10, ' ', []); end; Result := Input; end; |
Warum nur?
AXMD - Mi 23.02.05 22:07
Kurze Frage: warum machst du's nicht einfach so?:
Delphi-Quelltext
1: 2: 3: 4:
| function TForm1.DelUmbruch(Input: String): String; begin StringReplace(Input, #13#10, ' ', [rfReplaceAll]); end; |
;) AXMD
Andi1982 - Mi 23.02.05 22:22
Das funktioniert aber nicht... wird immer noch so:
Zitat: |
<html>
<head>..
..
..
</head>
</html> |
dargestellt.
Also wenn ich im debugger anschau steht da immer so zeugs: "<html>#$d#DA" und danach aber die ganzen #$D usw. immernoch... :(
Meine Funktion sieht so aus jetzt:
Delphi-Quelltext
1: 2: 3: 4: 5:
| function TForm1.DelUmbruch(Input: String): String; begin StringReplace(Input, '#13#10', ' ', [rfReplaceAll]); Result := Input; end; |
und aufgerufen wird die so:
Delphi-Quelltext
1: 2:
| WB_GetHTMLCode(WebBrowser2, Memo1.Lines); label3.Caption := DelUmbruch(Memo1.Lines.Text); |
Kokel - Mi 23.02.05 22:33
Wenn du mit einer stringlist arbeitest solltest du statt:
stringliste.add oder
stringliste.append
nicht so häufig arbeiten sondern
die einzelnen Zeilen vorher zusammenbauen
text:='<html>'+'<head>'+'......'+'</head></html>';
Andi1982 - Mi 23.02.05 22:36
Habs jetzt aber halt mal so, muss das irgendwie wieder aneinander bekommen. Der String ist ein Quellcode aus dem TWebBrowser!
Kokel - Mi 23.02.05 22:46
Wenn das ein Html code ist und du das in ein Memo lädst ist dann nicht jedes vorkommen von #13#10 automatisch eine neue Memozeile mit der du durch den aufruf von Memo1.lines drauf zugreifen kannst?
Andi1982 - Mi 23.02.05 22:55
Ja richtig, schon!
Aber wenn ich jetzt mache "label3.Caption := DelUmbruch(Memo1.Lines.Text);"
dann sind in Label3 die Umbrüche drin! und die bekomme ich nicht raus! warum auch immer...
Kokel - Mi 23.02.05 22:56
Probier mal das andi1982
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) memo1: TMemo; Label1: TLabel; procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var f:integer; dummi:string; begin for f:=0 to memo1.Lines.Count-1 do begin dummi:=dummi+' '+Memo1.Lines.Strings[f]; end; label1.Caption:=dummi; end;
end. |
Andi1982 - Mi 23.02.05 23:08
habs gelöst!!!! Das stringreplace funktioniert bei solchen komischen zeichen scheinbar nicht... hab ich hier im forum gelesen.
aber so gehts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function TForm1.DelUmbruch(Input: String): String; begin while (Pos(#$D#$A,Input) > 0) do begin Delete(Input, pos(#$D#$A,Input), 2); end; Result := Input; end; |
siehe folgenden thread:
http://www.delphi-forum.de/viewtopic.php?t=24802
Danke für eure mithilfe!!! Wobei ich immernoch nicht weiß wozu AdjustLineBreaks() eigentlich gut sein soll...
delfiphan - Do 24.02.05 18:17
Ich denke die Kombination Pos und Delete ist nicht so wahnsinnig effizient. Wieso nicht einfach so?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Var S : String; I, J : Integer; begin S := 'Test'#13#10'Test';
J := 1; for I := 1 to length(S) do if (S[I] <> #13) and (S[I] <> #10) then begin S[J] := S[I]; inc(J); end; SetLength(S, J-1); end; |
Andi1982 - Do 24.02.05 22:37
Hallo,
wieso sollte mit pos und delete nicht so elegant sein? Wegen speed oder was?
Deine Variante funktioniert ebenfalls, werde bei gelegenheit mal umbauen und schauen ob sich performance mäßig was tut...
StefanH - Do 24.02.05 22:48
*räusper*
Delphi-Quelltext
1: 2: 3: 4:
| function TForm1.DelUmbruch(Input: String): String; begin Result:= StringReplace(Input, #13#10, ' ', [rfReplaceAll]); end; |
Funktionen pflegen etwas zurückzugeben... :roll:
delfiphan - Fr 25.02.05 01:37
Andi1982 hat folgendes geschrieben: |
wieso sollte mit pos und delete nicht so elegant sein? Wegen speed oder was? |
Genau, das ganze geht dann rund 3.5 mal schneller, und erfasst zudem auch Zeilenumbrüche mit einem einzelnen LF oder CR Zeichen (Mac/Unix).
Andi1982 - Fr 25.02.05 08:38
Ok, also werde dieses ding beim optimizing so einbauen.
Aber um nochmal auf AdjustLineBreaks() zurückzukommen. Kann mir mal jemand erklären was LF und CR zu bedeuten haben oder wofür das steht? Und was das AdjustLineBreaks() damit macht?
ach und StefanH, heißt das ich habe die Funktion die ganze zeit falsch angewandt???
delfiphan - Fr 25.02.05 10:35
Das Steuerzeichen #13 bezeichnet man als Line Feed (LF, \n) und #10 bezeichnet man als Carriage Return (CR, \r). Das kommt noch aus den ganz alten Schreibmaschinenzeiten. Das "Line Feed" sorgte dafür, dass sich die Schreibmaschinentrommel drehte, um das Papier ein wenig weiterzurücken, d. h. um auf die nächste Zeile zu gelangen. Das Carriage Return sorge dann dafür, dass der Schreibmaschinenkopf wieder an den Anfang der Zeile bewegte. Wenn man sich das Bildchen auf der Entertaste ansieht, sieht man genau das: Zuerst runter, dann links.
Das ganze ist eigentlich ziemlich veraltet. Du kannst bei deinen Labels auch immer nur #13 schreiben, das #10 braucht es eigentlich nicht unbedingt. Unix verwendet nur ein LF, und Mac nur ein CR für den Zeilenumbruch (Bin ich mir aber nicht 100% sicher).
Ich weiss zwar nicht, was "AdjustLineBreaks" tut, aber ich nehme mal an, dass die Funktion dir die Unix/Mac schreibweise auf Windows konvertiert...
Es ist eigentlich unglaublich, dass noch so historische Dinge rumgeistern.
Auf den Scroll Lock reagieren auch nur ganz wenige Programme, obwohl die Taste ja ein eigenes LED hat... Und wie man die SysReq Taste abfängt weiss ich nicht mal... Ich wäre mal dafür, dass die verschwinden und statt dessen ein Copy/Paste Knopf gibt... Ok ich drifte ab.
Gruss
Andi1982 - Fr 25.02.05 14:20
Hey,
vielen Dank für die tolle Erklärung! Jetzt kann ich endlich mit den dingern was anfangen. Und hiermit kann ich diesen Thread als "Mission 'Zeilenumbruch' erfolgreich!" abschließen!
Danke an alle!
Gruß Andi
StefanH - Fr 25.02.05 18:14
Andi1982 hat folgendes geschrieben: |
ach und StefanH, heißt das ich habe die Funktion die ganze zeit falsch angewandt??? |
wie gesagt,
Funktion ;) Eine Funktion gibt etwas zu zurück und StringReplace...
Delphi-Hilfe: |
StringReplace gibt einen String mit ersetzten Sub-Strings zurück. |
und außerdem ist der Parameter "S"
const ;)
sovielsogut :P
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!