Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Höhe von TMemo an Textlänge anpassen

  Alt 9. Okt 2010, 00:08
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 9. Okt 2010 um 00:27 Uhr)
  Mit Zitat antworten Zitat