| Autor |
Beitrag |
Knulli
      
Beiträge: 116
Erhaltene Danke: 2
Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
|
Verfasst: Do 14.08.08 14:53
Hallo Forum,
ich möchte beim Textausdrucken ein Verhalten wie das TMemo erreichen: Wenn hinten der Platz nicht reicht, soll bei Leerzeichen, Sonderzeichen, usw. umgebrochen werden. Falls es keine solchen Zeichen gibt, sollen soviele Zeichen wie möglich gedruckt werden, der Rest auf die nächste Zeile.
Ich habe jetzt also mal versucht herauszubekommen, wie TMemo das intern macht, finde aber leider nichts.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Memo1.Clear(); Memo1.ClientWidth := 500; Memo1.Lines.Add('Das ist ein sehr langer Text, der gleich nicht mehr in eine Zeile paßt'); MessageBox(Self.Handle, PChar(Format('Count=%d', [Memo1.Lines.Count])), '', MB_OK); Memo1.ClientWidth := 100; MessageBox(Self.Handle, PChar(Format('Count=%d', [Memo1.Lines.Count])), '', MB_OK); Memo1.ClientWidth := 20; MessageBox(Self.Handle, PChar(Format('Count=%d', [Memo1.Lines.Count])), '', MB_OK); |
Wenn ich da (Memo1.ClientWidth := 100;) reindebugge, komme ich bis in "TWinControl.SetBounds" zu einem
"SetWindowPos(FHandle, 0, ALeft, ATop, AWidth, AHeight, SWP_NOZORDER + SWP_NOACTIVATE)"
und ab da hat sich die Anzahl der Zeilen geändert. Ich hab auch schon mal versucht, alle möglichen Breakpoints in TStrings und TMemoStrings zu setzen: Der Debugger hält nicht an....Reindebuggen in SetWindowPos bringt auch nichts, da lande ich in irgendwelchen WindowProcs.
Jemand ne Idee, wie man sich da rantaste?
Knulli
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 14.08.08 15:20
TMemo nutzt die Funktionalität von Windows, soweit ich das in Erinnerung habe. SynEdit sollte aber z.B. eine komplette Implementierung drin haben, vielleicht findest du dort etwas.
Ich habe auch mal eine entsprechende Funktion gebastelt: 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: 39: 40: 41: 42: 43: 44: 45: 46:
| function TDatenbank.GetMultilineTextRect(Width: Integer; Text: String): TStringList; var TextToAdd: String; begin Result:=TStringList.Create; If frmPrintPreview.gmpPreview.MmTextWidth(Text)<=Width then Result.Add(Text) Else While Length(Text)>0 do begin TextToAdd:=''; While ((Pos(' ',Text)>0) and (frmPrintPreview.gmpPreview.MmTextWidth(TextToAdd + Copy(Text,1,Pos(' ',Text)-1)) < Width) or ((Pos(' ',Text)=0) and (Pos('/',Text)>0) and (frmPrintPreview.gmpPreview.MmTextWidth(TextToAdd + Copy(Text,1,Pos('/',Text)-1)) < Width)) or ((Pos(' ',Text)=0) and (frmPrintPreview.gmpPreview.MmTextWidth(TextToAdd + Text) < Width))) and (Length(Text)>0) do begin If Pos(' ',Text)=0 then begin If Pos('/',Text)=0 then begin TextToAdd:=TextToAdd + Text; Text:=''; end Else begin TextToAdd:=TextToAdd+Copy(Text,1,Pos('/',Text)-1)+' / '; Delete(Text,1,Pos('/',Text)); Text:=Trim(Text); end; end Else begin TextToAdd:=TextToAdd + Copy(Text,1,Pos(' ',Text)-1) + ' '; Delete(Text,1,Pos(' ',Text)); Text:=Trim(Text); end; end; If Trim(TextToAdd)<>'' then Result.Add(Trim(TextToAdd)) Else begin While frmPrintPreview.gmpPreview.MmTextWidth( TextToAdd+'a')<Width do begin TextToAdd:=TextToAdd+Text[1]; Delete(Text,1,1); end; Result.Add(Trim(TextToAdd)) end; end; end; | Die stammt aus einem größeren mehrere Jahre alten Programm, aber vielleicht hilft es dir ja.
Ach ja, die benutzte Komponente, falls du die auch nutzen möchtest:
www.download.com/TGm...2070_4-10049723.html
|
|
Knulli 
      
Beiträge: 116
Erhaltene Danke: 2
Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
|
Verfasst: Do 14.08.08 16:09
Hi Jänicke,
Danke Dir erstmal, habs soweit übernehmen können, der Umbruch ist aber noch nicht ganz so, wie ich ihn mir vorstelle (er erkennt davorliegende Leerzeichen nicht) aber das sehe ich mir gleich mal an.
Aber eigentlich wollte ich genau diese endlose Aneinanderkettung von Bedingungen vermeiden. Das mit der Windows-Funktionalität habe ich auch fast befürchtet. Da gibts für den Editor irgendwelche Flags wie ES_MULTILINE, EM_SETMARGINS, EC_LEFTMARGIN und EC_RIGHTMARGIN. Scheinbar muß man einem Edit-Feld nur diese Flags mit auf den Weg geben und den Rest macht Windows.
Jetzt kommt aber die spannende Frage: Wie popelt TMemo die Teilstrings da wieder raus? Nach dem Setzten der neuen Breite sind ja aus einem String in FLines mehrere geworden.
Knulli
|
|
|