Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Vordefinierten Zeilenumbruch in Label laden


delphistart - Sa 19.07.08 21:20
Titel: Vordefinierten Zeilenumbruch in Label laden
Hallo,

Seit langem habe ich mal wieder Urlaub UND Zeit ein bisschen zu mit Delphi zu Programmieren.

Für folgendes Problem finde ich aber leider einfach keine Lösung:
Ich habe auf meinem Formular mehrere Labels. Diese werden mit Daten gefüllt, die ich aus einer Textdatei lade.
Nun möchte ich in der Techtdatei irgendwie Zeilenumbrüche vordefinieren. Das heist wenn dort z.B. das Zeichen '#' vorkommt soll es als Zeilenumbruch ausgegeben werden.

Dann muss ich noch irgendwie Abfragen wie viele Zeileumbrüche dieser Art vorhanden sind.

Wäre echt super, wenn jemand von euch eine Lösung hat!


Hidden - Sa 19.07.08 21:42

Hi,

Das verstehe ich nicht: In Delphi ist ein Zeilenumbruch ein #13#10.. In einer Textdatei kann man doch auch einfach Zeilenumbrüche einfügen(Enter!; bzw. per Delphi #13#10).

Wenn du alle '#'s durch Zeilenumbrüche ersetzen willst, müsstest du folgendes machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Parse(S: String): String;
var
  i: Integer;
begin
  //entfernen der alten Zeilenumbrüche
  StringReplace(S, #13#10, '', [rfReplaceAll]);
  //einfügen der neuen Zeilenumbrüche
  StringReplace(S, '#', #13#10, [rfReplaceAll]);
  result := S;  
end;


E: Siehe auch: http://r2c2.weingut-rehn.de/content3_Stringverarbeitung_mit_Delphi.htm

mfG,


delphistart - Sa 19.07.08 22:03

Ja, genau so habe ich das auch zuerst probiert, aber bei dieser Variante bekomme ich #13#10 als Text ausgegeben und nicht als Zeilenumbruch, weil das dann ja quasi so da steht:
'Text#13#10Text'

die Korrekte Angabe wäre aber
'Text'#13#10'Text'

Nur wie bekomme ich die #13#10 in Label.Caption auserhalb vom String bzw. zwischen die beiten Teilstrings?


Delete - Sa 19.07.08 22:13

am besten bauen wir uns ein schleifchen ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
NeuStr = '';
for c in AltStr do
 if c = '#' then
  NeuStr := NeuStr + #10#13
 else
  NeuStr := NeuStr + c;


delphistart - Sa 19.07.08 22:41

user profile iconGrenzgaenger hat folgendes geschrieben:
am besten bauen wir uns ein schleifchen ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
NeuStr = '';
for c in AltStr do
 if c = '#' then
  NeuStr := NeuStr + #10#13
 else
  NeuStr := NeuStr + c;



Vielen Herzlichen Dank!
So funktionierts!!! :dance2:


delfiphan - So 20.07.08 10:28

user profile iconHidden hat folgendes geschrieben:

Delphi-Quelltext
1:
  StringReplace(S, #13#10, '', [rfReplaceAll]);                    

user profile icondelphistart hat folgendes geschrieben:
Ja, genau so habe ich das auch zuerst probiert, aber bei dieser Variante bekomme ich #13#10 als Text ausgegeben und nicht als Zeilenumbruch, weil das dann ja quasi so da steht:
'Text#13#10Text'

Der Code oben ist korrekt. Du hast wohl was falsch abgetippt oder falsch verstanden.

Hingegen rate ich von folgendem Code ab. Der Windows Zeilenumbruch ist #13#10, und nicht #10#13. Ausserdem sollte man Strings nicht zeichenweise zusammenbauen, da dann bei jedem Schleifendurchgang ein um 1 Byte grösserer String angelegt werden muss (d.h. ein FreeMem/GetMem pro Iteration. Dann muss auch noch jedesmal ein grösserer Speicherblock gefunden werden und die alten Daten kopiert werden). Um Strings zu ersetzen ist StringReplace da ;)
user profile iconGrenzgaenger hat folgendes geschrieben:
am besten bauen wir uns ein schleifchen ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
NeuStr = '';
for c in AltStr do
 if c = '#' then
  NeuStr := NeuStr + #10#13
 else
  NeuStr := NeuStr + c;


Hidden - So 20.07.08 11:56

Hi,

Aus deiner Beschreibung entnehme ich mal, dass du #13#10 einfach unter properties\caption eingetippt hast.


Nochmal eine vollständige Lösung:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function Parse(S: String): String;
var
  i: Integer;
begin
  StringReplace(S, '#13#10', #13#10, [rfReplaceAll]);
  result := S;  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := Parse(Label1.Caption);
end;


mfG,