AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Höhe von TMemo an Textlänge anpassen

Ein Thema von erich.wanker · begonnen am 10. Sep 2008 · letzter Beitrag vom 9. Okt 2010
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#1

Höhe von TMemo an Textlänge anpassen

  Alt 10. Sep 2008, 11:50
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
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

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

  Alt 10. Sep 2008, 11:57
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

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

  Alt 10. Sep 2008, 12:02
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;
Thomas
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 10. Sep 2008, 12:46
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?!
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#5

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

  Alt 10. Sep 2008, 12:55
AdjustMemoHeight !! that´s it !

Super... Vielen Dank

Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Medium

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

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

  Alt 9. Okt 2010, 01: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 01:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 9. Okt 2010, 14:35
Warum nimmst du nicht gleich die Bitmap? Oder soll das editierbar sein?

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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