Entwickler-Ecke

Sonstiges (Delphi) - Angepasstes WordWrap


galagher - Mi 18.02.09 20:23
Titel: Angepasstes WordWrap
Hallo!

Es geht um WordWrap, genauer, ich brauche eine angepasste Variante des WordWrap-Zeilenumbruchs. Hier ein Beispieltext, wie es normalerweise aussieht:

Delphi-Quelltext
1:
2:
3:
Text: Das ist ein Beispieltext. Hier an dieser Stelle <-
wird der Text umgebrochen. Und hier a dieser Stelle <-
wieder.

Ich brauche aber:

Delphi-Quelltext
1:
2:
3:
Text: Das ist ein Beispieltext. Hier an dieser Stelle <-
      wird der Text umgebrochen. Und hier a dieser <-
      Stelle wieder.

Es soll also automatisch um eine gewisse Anzahl an Leerzeichen eingerückt werden, egal, über wie viele Zeilen sich der Text erstreckt.

Meine momentane Lösung sieht so aus und funktioniert nur bei zwei Zeilen, also wenn der Text 1x umgebrochen wird:

Delphi-Quelltext
1:
2:
3:
 with RichEdit1 do
  if not (GetWord(Lines[Lines.Count-1], 1) = 'Text'then
   Lines[Lines.Count-1] := #160#160#160#160#160#160#160#160+Lines[Lines.Count-1];  //unsauber, ja, ich weiss!

Ich musste #160 verwenden, da es mit Leerzeichen nicht klappt!


Yogu - Mi 18.02.09 21:34

Hallo,

du hast ja schon fast den kompletten Code. Baue noch eine Schleife ein, und gehe dadurch alle Zeilen durch, die nicht mit "Text" beginnen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var i: Integer;
begin
  for i := 0 to RichEdit1.Lines.Count-1 do
    if not (GetWord(RichEdit1.Lines[i], 1) = 'Text'then
     Lines[RichEdit1.Lines.Count-1] := StringOfChar(#1608) + RichEdit1.Lines[i];
end;

StringOfChar erstellt eine Zeichenkette aus einem beliebigen Zeichen, das n-mal aneinandergereiht wird. Ich hoffe mal, die Parameterfolge stimmt.

Sonst habe ich nur die Schleife hinzugefügt, und das with entfernt - das ist in diesem Fall sinnlos und deshalb nur verwirren.d

Grüße,
Yogu


ssb-blume - Do 19.02.09 10:54

Hallo,
Schau mal in die Dokumentation von Richedit, PARAFORMAT, StartIndent!
Dieser Wert ist der Einzug der 1. Zeile. Wenn er negativ ist, dann werden
folgende Zeilen eingerückt (alle Angaben in Twips!).
Hansi


galagher - Do 19.02.09 20:41

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
du hast ja schon fast den kompletten Code. Baue noch eine Schleife ein, und gehe dadurch alle Zeilen durch, die nicht mit "Text" beginnen:
Das funktioniert nicht! Beispielcode, wie es aussieht...

Delphi-Quelltext
1:
2:
3:
4:
Text: Das ist ein Beispieltext. Hier an dieser Stelle <-
      wird der Text umgebrochen. Und hier an dieser <-
Stelle wieder.
Text: Das ist ein Beispieltext. Hier an dieser Stelle

... und wie es aussehen soll:

Delphi-Quelltext
1:
2:
3:
4:
5:
Text: Das ist ein Beispieltext. Hier an dieser Stelle <-
      wird der Text umgebrochen. Und hier an dieser <-
      Stelle wieder.
      Das ist ein Beispieltext. Hier an dieser Stelle
Text:


user profile iconssb-blume hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
Schau mal in die Dokumentation von Richedit, PARAFORMAT, StartIndent!
Dieser Wert ist der Einzug der 1. Zeile. Wenn er negativ ist, dann werden
folgende Zeilen eingerückt (alle Angaben in Twips!).
Hansi
Was bitte ist: PARAFORMAT, StartIndent, alle Angaben in Twips? :nixweiss:


Yogu - Do 19.02.09 21:22

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
du hast ja schon fast den kompletten Code. Baue noch eine Schleife ein, und gehe dadurch alle Zeilen durch, die nicht mit "Text" beginnen:
Das funktioniert nicht!

Oh, da ist mir wohl ein Fehler unterlaufen. Das bietet sich doch als ganz tolle Übung: Finde den Fehler ;)

(Ich hab ihn schon)

Edit:

user profile iconssb-blume hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
Schau mal in die Dokumentation von Richedit, PARAFORMAT, StartIndent!
Dieser Wert ist der Einzug der 1. Zeile. Wenn er negativ ist, dann werden
folgende Zeilen eingerückt (alle Angaben in Twips!).
Hansi

Diese beiden Eigenschaften kenne ich nicht (und es gibt sie auch nicht). (Delphi 2005)


ssb-blume - Fr 20.02.09 10:50

Pardon!!!
Tut mir leid, aber ich kann nicht dafür, dass wesentliche Bestandteile von Richedit nicht mehr
veröffentlicht werden. Es gab früher eine Unit in Delphi unter ..SOURCE\RTL\WIN \richedit.pas,
da war noch alles drin. Unter .Net sieht das natürlich anders aus..
Sorry


galagher - Fr 20.02.09 21:46

Jetzt funktioniert es:

Delphi-Quelltext
1:
2:
3:
for i := 3 downto 1 do //Die Integers könnte man evtl. noch durch Lines.Count oder so ersetzen
 if not (GetWord(Lines[Lines.Count-i], 1) = 'Text'then
  Lines[Lines.Count-i] := StringOfChar(#1608)+Lines[Lines.Count-i];

Danke!


Ydobon - Sa 21.02.09 03:23

Z.B:

Delphi-Quelltext
1:
2:
  RichEdit1.Paragraph.FirstIndent:=10;
  RichEdit1.Paragraph.LeftIndent:=50;


galagher - Sa 21.02.09 11:37

Eleganter:

Delphi-Quelltext
1:
2:
3:
  for i := 3 downto 1 do
   if not (GetWord(Lines[Lines.Count-i], 1) = 'Text'then
    Lines[Lines.Count-i] := StringOfChar(#91)+' '+Lines[Lines.Count-i];

Allerdings stellt sich hier die Frage, ob #9 immer exakt 8 Leerzeichen (bei Schriftart Courier New) entspricht oder ob man mit Windows die Tabulatorzeichen-"Länge" verändern kann! Hat hierzu jemand eine Antwort?


galagher - Sa 21.02.09 13:19

Noch flexibler und vor allem korrekt, zumindest für meine Zwecke:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
c := 5;
  
if Lines.Count > c-1 then
 for i := c downto 1 do
  if not (GetWord(Lines[Lines.Count-i], 1) = 'Test'and not
         (Lines[Lines.Count-i][1] = #9then
    Lines[Lines.Count-i] := #9+' '+Lines[Lines.Count-i];

Bleibt die Frage nach der "Tab-Länge"!