Autor Beitrag
Andi1982
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: Mi 23.02.05 21:44 
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 user profile iconTino: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Do 24.02.2005 um 09:00

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 23.02.05 21:46 
Wieso ersetzt du nicht einfach alle Vorkommen von #13#10 durch einen Leerstring :gruebel:

AXMD
Andi1982 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: Mi 23.02.05 22:05 
Habe eine Funktion geschrieben die das machen sollte, aber irgendwie läuft das in eine Endlosschleife :(

ausblenden 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?

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 23.02.05 22:07 
Kurze Frage: warum machst du's nicht einfach so?:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TForm1.DelUmbruch(Input: String): String;  
begin  
  StringReplace(Input, #13#10' ', [rfReplaceAll]);  
end;


;) AXMD
Andi1982 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
  WB_GetHTMLCode(WebBrowser2, Memo1.Lines);
  label3.Caption := DelUmbruch(Memo1.Lines.Text);

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
Kokel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 79

XP Prof
delphi 2006 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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!

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
Kokel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 79

XP Prof
delphi 2006 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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...

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
Kokel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 79

XP Prof
delphi 2006 Prof.
BeitragVerfasst: Mi 23.02.05 22:56 
Probier mal das andi1982
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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;//If
    label1.Caption:=dummi;
end;

end.
Andi1982 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TForm1.DelUmbruch(Input: String): String;
begin
  while (Pos(#$D#$A,Input) > 0do
  begin
    Delete(Input, pos(#$D#$A,Input), 2);
  end;
  Result := Input;
end;


siehe folgenden thread: www.delphi-forum.de/viewtopic.php?t=24802

Danke für eure mithilfe!!! Wobei ich immernoch nicht weiß wozu AdjustLineBreaks() eigentlich gut sein soll...

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 24.02.05 18:17 
Ich denke die Kombination Pos und Delete ist nicht so wahnsinnig effizient. Wieso nicht einfach so?

ausblenden 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] <> #13and (S[I] <> #10then
  begin
   S[J] := S[I];
   inc(J);
  end;
 SetLength(S, J-1);
end;
Andi1982 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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...

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Do 24.02.05 22:48 
*räusper*

ausblenden 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:

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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???

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: 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

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)