Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Höhe von TMemo an Textlänge anpassen (https://www.delphipraxis.net/120388-hoehe-von-tmemo-textlaenge-anpassen.html)

erich.wanker 10. Sep 2008 10:50


Höhe von TMemo an Textlänge anpassen
 
Hallo Leute,

Weiß jemand Rat?

ich hab auf einem Form ein memofeld
-die linke obere Ecke ist fix
-die breite ist fix
-wordWrap=true
-scrollbars=false

wenn ich nun einige Zeilen Text hineinschreib via memo1.Lines.Append();
würd ich gerne die Höhe des memofeldes dynamisch
an den textinhalt anpassen.

Vielen Dank

Erich

alzaimar 10. Sep 2008 10:57

Re: Höhe von TMemo an Textlänge anpassen
 
So ungefähr:
Delphi-Quellcode:
Var
  c : TControlCanvas;

begin
  c := TControlCanvas.Create;
  Try
    c.Control := MyMemo;
    MyMemo.Height := 10+c.TextHeight('|Gg')* MyMemo.lines.count;
  Finally
    c.Free;
  End;
end;
Geht aber bestimmt auch anders.

toms 10. Sep 2008 11:02

Re: Höhe von TMemo an Textlänge anpassen
 
Hallo,

Probier mal das:

Delphi-Quellcode:
procedure TForm1.AdjustMemoHeight(Memo: TMemo);
var
  Rect1, Rect2: TRect;
  S: string;
Begin
  with Memo do
  begin
    s := Text;
    Perform(EM_GETRECT, 0, Longint(@Rect1));
    Rect2 := Rect1;
    Self.Canvas.font := Font;
    DrawTextEx(Canvas.Handle, PChar(S), Length(S), Rect2,
              DT_CALCRECT or DT_EDITCONTROL or DT_WORDBREAK or DT_NOPREFIX, nil);
    Height := Height + Rect2.Bottom - Rect1.Bottom;
  end;
end;

taaktaak 10. Sep 2008 11:46

Re: Höhe von TMemo an Textlänge anpassen
 
Moin, Moin.
Die dynamische Höhenanpassung sollte aber mit Bedacht verwendet werden.
Wenn der Text sehr lang ist, wird das Memo höher als das Form?!

erich.wanker 10. Sep 2008 11:55

Re: Höhe von TMemo an Textlänge anpassen
 
AdjustMemoHeight !! that´s it !

Super... Vielen Dank

Erich

Medium 9. Okt 2010 00:08

AW: Höhe von TMemo an Textlänge anpassen
 
Ich schließe hier mal an, da ich genau das gleiche Problem habe, nur leicht anders:

Ich weise der Text-Property einen Wert zu, und das Memo steht auf WordWrap=true. Daher bin ich nicht so sicher, ob MyMemo.Lines.Count die tatsächliche Anzahl Zeilen wiederspiegelt.
Viel schlimmer ist aber, dass das Memo dynamisch erstellt wird, und zu dem Zeitpunkt zwar bereits einen Text hat, aber noch kein übergeordnetes Fenster! (Es liegt auf ein paar frei schwebenden Panels, die erst nachher in ein Fenster gebunden werden.) Daher schlagen sämliche Funktionen wie DrawText() oder TextHeight() fehl, auch wenn ich versuche mir ein DC zu besorgen. Meldung: "Element '' hat kein übergeordnetes Fenster."

EDIT: Hab es dank einer Idee, die ich in einem anderen Thread aufgeschnappt habe jetzt (mit toms' Ansatz) so gelöst:
Delphi-Quellcode:
procedure AdjustMemoHeight(Memo: TMemo);
var
  Rect: TRect;
  S: string;
  b: TBitmap;
Begin
  with Memo do
  begin
    s := Text;
    b := TBitmap.Create;
    b.Width := ExplicitWidth;
    b.Height := 600;
    b.Canvas.Font.Assign(Font);
    DrawTextEx(b.Canvas.Handle, PChar(S), Length(S), Rect,
              DT_CALCRECT or DT_EDITCONTROL or DT_WORDBREAK or DT_NOPREFIX, nil);
    Height := Rect.Bottom;
    b.Free;
  end;
end;
Der Trick war das Bitmap, und EM_GETRECT hat für das unsichtbare Memo auch nur Quark geliefert. Einziger Schönheitsfehler: Eventuelle Borders und/oder Margins müssen deswegen da noch von Hand zugerechnet werden. Ein kleiner Preis :)

xZise 9. Okt 2010 13:35

AW: Höhe von TMemo an Textlänge anpassen
 
Warum nimmst du nicht gleich die Bitmap? Oder soll das editierbar sein?

MfG
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz