Autor Beitrag
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
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:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: 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