da ich mir ernstlich überlege, doch eine TreeList in Anlehung an DevExpress zu basteln, sind natürlich als Lazarus-Komplettneueinsteiger zuerst einmal die Basics dran. Hier das Zeichnen.
Das tut er im Prinzip eh okay, aber ein Problem tauchte an unerwarteter Stelle auf: Umlaute. Auf die Wndows-Funktion kann ich verzichten, aber die Canvas Methode lässt sich nicht anpassen. Habt ihr dazu einen Tipp?
Hier die beiden Varianten:
1: Beispiel mit Errechnen der nötigen Texthöhe. Zwei Probleme: a) Umlaute und b) füllt Bereich nicht sauber aus. Okay, Letzterem kann man begegnen, indem man noch einmal das Rechteck, nun mit richtiger Höhe explizit zeichnet (siehe auskommentiert). Aber was mach ich mit a)? Kann es sowohl aus dem String als auch dem Memo holen, ist immer dasselbe. Habt ihr einen Tipp dafür?

Code: Alles auswählen
procedure TForm1.pbPaint(Sender: TObject);
// Umlaute in dem Fall falsch!
const Tx: string = 'Das ist ein längerer Text für diesen Futzi, schauen, ob er den Windows-Kram sauber macht inklusive Zeilenumbruch beim Zeichnen?';
var R: TRect;
S: string;
begin
R := Classes.Rect(50, 50, 300, 100);
with pb.Canvas do
begin
Brush.Color := pa3.Color;
Pen.Style := psClear;
Rectangle(pb.ClientRect);
Brush.Color := pa4.Color;
Rectangle(R);
if cbTxMemo.Checked then
S := m.Text
else
S := Utf8ToAnsi(Tx); // alles Mögliche probiert, hilft nix
// Texthöhe ausrechnen
Windows.DrawText(Handle, PChar(S), Length(Tx), R, DT_LEFT or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or DT_CALCRECT);
// Nötig, um das Rechteck sauber hinzubekommen; wenn das fehlt, so wie laut Bild 1
// R.Right := 300;
// Rectangle(R);
// Eigentliche Ausgabe
Windows.DrawText(Handle, PChar(S), Length(Tx), R, DT_LEFT or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL);
// Anzeige Rechteck zur Kontrolle
sh.Height := R.Bottom-R.Top;
end;
end;

Code: Alles auswählen
procedure TForm1.pbPaint(Sender: TObject);
// Umlaute in dem Fall falsch!
const Tx: string = 'Das ist ein längerer Text für diesen Futzi, schauen, ob er den Windows-Kram sauber macht inklusive Zeilenumbruch beim Zeichnen?';
var R: TRect;
S: string;
begin
R := Classes.Rect(50, 50, 300, 100);
with pb.Canvas do
begin
Brush.Color := pa3.Color;
Pen.Style := psClear;
Rectangle(pb.ClientRect);
Brush.Color := pa4.Color;
Rectangle(R);
if cbTxMemo.Checked then
S := m.Text
else
S := Utf8ToAnsi(Tx);
// Texthöhe ausrechnen
Windows.DrawText(Handle, PChar(S), Length(Tx), R, DT_LEFT or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or DT_CALCRECT);
R.Right := 300;
Rectangle(R);
Brush.Style := bsClear;
TextStyle.Wordbreak := True; <<<<<<<<<<<<<<<
TextStyle.EndEllipsis := True; <<<<<<<<<<<<<<<
TextRect(R, 52, 52, S);
sh.Height := R.Bottom-R.Top;
end;
end;