AGB  ·  Datenschutz  ·  Impressum  







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

Tmemo height dynamisch an text anpassen

Ein Thema von H3llsing · begonnen am 3. Aug 2010 · letzter Beitrag vom 4. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#1

Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:04
Delphi-Version: 2010
Tag zusammen,

ich erzeuge dynamisch ein Panel, das Top Align auf einer scrollbox erzeugt wird, darauf erzeuge ich ein Tmemo mit text, der auch Zeilenumbrüche -> #$D#$A oder anders -> #10#13, #10, #13 enthält.

Dieses Memofeld soll Alclient mit Margin 10 auf dem Panel ausgerichtet werden und die HÖHE des Panels soll sich dem Text entsprechend anpassen, so dass keine Scrollbar innerhalb des Memos nötig ist.

WordWrap soll ebenfalls eingeschaltet werden, was die höhenberechnung meiner meinung nach schwierig bis unmöglich ?, macht.


Hier meine erzeugung der Panels und Memos
Delphi-Quellcode:

//ar_content = array der beiträge
//ar_content[i].Content = Text mit umbrüchen;

  for i := 0 to length(ar_content)-1 do
  begin

    //neues Panel erzeugen
    newPanel := Tpanel.Create(frmAnfrage);
    newPanel.ParentColor := False;
    newPanel.ParentBackground := false;

    newPanel.Parent := frmAnfrage.ScrollBox1;
    newPanel.ParentDoubleBuffered := true;
    newPanel.Align := alTop;

    //hier müsste die Höhe angepasst werden
    NewPanel.Height := AdjustMemoHeight(ar_content[i].Content);


    //neues MEmo auf dem Panel erzeugen
    newMemo := Tmemo.Create(frmAnfrage);
    newMemo.Font.Name := 'Courier New';
    newMemo.parent := newPanel;
    newMemo.WordWrap := true;
    newMemo.text := ar_content[i].Content;
    newMemo.ReadOnly := true;

    newMemo.Margins.SetBounds(10,10,10,10);
    NewMemo.AlignWithMargins:= true;
    newmemo.Align := alClient;
    newMemo.ParentDoubleBuffered := true;
Dann hab ich mich schon mit etlichen versuchen in die Depression gestürzt
hier einer der vielen ansätze die höhe herauszubekommen,jedoch erfolglos.
Entweder ist das Panel zu Groß oder zu klein ;/


Delphi-Quellcode:
//################################################
// AdjustMemoHeight
// passt die größe des memos an den text an
//################################################
function TfrmSalesboard.AdjustMemoHeight(S: String):integer;
var
  höhe : integer;
  i : Integer;
  txtLaenge : integer;
  teiler : integer;
  posi : integer;
  anzahl : integer;
  S2 : string;
  lastPosi : integer;
Begin
   
    
   s := StringReplace(S,#10#13,'|_|',[rfReplaceAll,rfIgnoreCase]);
   s := StringReplace(S,#10,'|_|',[rfReplaceAll,rfIgnoreCase]);
   s := StringReplace(S,#13,'|_|',[rfReplaceAll,rfIgnoreCase]);
  

   Anzahl := 1; //anzahl der Lines


   //3 mal = Absatz mit Leerzeile ?
   //2 mal = einfacher Umbruch ?
   while pos('|_||_||_|',s) <> 0 do
   begin
     s := StringReplace(S,'|_||_||_|','|$|',[rfIgnoreCase]);
     anzahl := anzahl+2;
   end;

   while pos('|_||_|',s) <> 0 do
   begin
     s := StringReplace(S,'|_||_|','|$|',[rfIgnoreCase]);
     anzahl := anzahl+1;
   end;

   lastposi := 0;
   while pos('|$|',s) <> 0 do
   begin
     posi := pos('|$|',s);
     s2 := copy(s,lastposi,posi-1);
     lastposi := posi+3;
     s := StringReplace(S,'|$|',' ',[rfIgnoreCase]);
     if length(s2) > 65 then
       anzahl := anzahl+1;
   end;

   s2 := copy(s,0,posi-1);


       txtLaenge := length(s);
       //teiler := round(txtLaenge / 70);
       höhe := ((anzahl)*25)+20; // 25 = linehöhe ???? 20 = für die 10 Margin Top und bottom des Memos
    showmessage(intToStr(höhe));

  result := höhe;
end;


ich hoffe jemand von euch hat einen guten Tipp. Oder sauberen Code und nich wie den oben
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:15
Erstelle eine unsichtbares Label mit fester Breite und wordwrap, gib dem Label die gleichen Schrift-Einstellungen wie das Memo, dann kannst du
den Canvas vom Label verwenden, um die Texthöhe herauszufinden:

Delphi-Quellcode:
H := Label1.Canvas.TextHeight(Meintext);
Memo1.Height := H ;
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:25
hab ich auch schon versucht, allerdings war dann das memo trotzdem zu hoch.
liegt es eventuell daran dass ich das Label auch als AlTop in die scrollbox gesetzt habe, danach autosize,wordwrap an
und dann den Text zugewiesen habe.


hab den Code leider schon verworfen, probiers aber gern nochmal aus


btw: es geht darum die größe des Panels dynamisch zu erzeugen.

Geändert von H3llsing ( 3. Aug 2010 um 16:27 Uhr)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#4

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:29
Alternativ probier noch folgendes, auch indem du den Canvas des Labels benutzt.
Das Label muss aber die gleiche Breite (oder etwas kleiner) wie das Memo dafür haben, Höhe ist egal.

Delphi-Quellcode:
..
.
var
  h: Integer ;
  FRect : TRect ;
begin
  FRect.Left := 0;
  FRect.Top := 0 ;
  FRect.Right := Label1.Width ;
  FRect.Bottom := 0 ;

  DrawText(Label1.Canvas.Handle, PChar(MeinText),Length(MeinText),FRect,DT_CALCRECT or DT_NOPREFIX or DT_WORDBREAK);
  Memo1.Height := FRect.Bottom;

  Memo1.Text := MeinText ;
end;

Geändert von blackfin ( 3. Aug 2010 um 16:35 Uhr)
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:34
vielen dank erstmal, werde es morgen früh ausprobieren
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 16:49
Das Label muss aber die gleiche Breite (oder etwas kleiner)
Eher kleiner, da das Memo bestimmt einen Rand/Border hat.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 17:05
Jetzt hab ich mich auch mal daran versucht (allerdings ohne Hilfslabel):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var aDC: hDC;
    R: TRect;
    aCanvas: TCanvas;
begin
  R := Memo1.BoundsRect;
  Memo1.Lines.BeginUpdate;
  try
    Memo1.Lines.Add('Zeile');
    Memo1.Text := trim(Memo1.Text);
    aDC := GetWindowDC(Memo1.Handle);
    if aDC <> 0 then
      try
        aCanvas := TCanvas.Create;
        try
          aCanvas.Handle := aDC;
          aCanvas.Font.Assign(Memo1.Font);
          DrawText(aCanvas.Handle,PChar(Memo1.Text),-1,R,DT_NOPREFIX or DT_CALCRECT or DT_WORDBREAK);
        finally
          aCanvas.Free;
        end;
      finally
        ReleaseDC(Memo1.Handle,aDC);
      end;
  finally
    Memo1.Lines.EndUpdate;
  end;
  Memo1.Height := R.Bottom - R.Top + 6;
end;
Ob das jetzt 100%-ig so stimmt, weiß ich nicht (vor allem die 6 in der letzten Zeile), aber das sah bei ersten Tests ganz gut aus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#8

AW: Tmemo height dynamisch an text anpassen

  Alt 3. Aug 2010, 19:49
Wegen der 6 in der letzten Zeile eventuell nicht Height, sondern ClientHeight zuweisen? Hab's aber nicht getestet...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 09:09
Vielen Dank schomal für euer bemühen, aber es will einfach nicht so funktionieren wie es soll.

Die MEthode von DaddyH kommt mit nem MEmo alleine ganz gut ran, aber ich möchte ja, dass das Memo AlClient bleibt, das heißt die größe des memos passt sich dem des PARENT Panels an. Nun möchte ich dem Panel die größe geben, die das memo eigentlich benötigt + 20 px margin, damit das auch passt.
Zusätzlich ist mir aufgefallen, wenn ich die Größe des PArentPanels nach dem MEmo.Create verändere, dass dann die Erstellungsreihenfolge komplett verschoben wird

ich hänge mal screenshots zur verdeutlichung an.



Delphi-Quellcode:
    //neues Panel erzeugen
    newPanel := Tpanel.Create(frmAnfrage);
    newPanel.ParentColor := False;
    newPanel.ParentBackground := false;

    newPanel.Parent := frmAnfrage.ScrollBox1;
    newPanel.ParentDoubleBuffered := true;
    newPanel.Align := alTop;
  // newHeight := AdjustMemoHeight(ar_content[i].Content);
    NewPanel.Height := 1000;

    newLab := Tlabel.Create(newPanel);
    newLab.Parent := newPanel;
    NewLab.Visible := false;
    newlab.Margins.SetBounds(10,10,10,10);
    newLab.Align := alClient;
    NewLab.Font.Name := 'Courier New';
    newLab.Caption := ar_content[i].Content;

    LH := newLab.Canvas.TextHeight(ar_content[i].Content);
    NewPanel.Height := LH ;
Das hat leider auch nicht funktioniert, irgendwie ist das Panel dann nur ein paar pixel groß und wird in der Erstellungsreihenfolge nach oben gesetzt. Ich erzeuge vor dem Panel auf dem das Memo liegt noch ein blaues Panel mit der überschrift,dass auch auf der scrollbox liegt.
Bei dieser MEthode ist nun das graue Panel mit Memo über das blaue gerutscht.

HIER die Falsche Reihenfolge, wenn ich die größe des Panels später ändere
falsche_erstellreihenfolge.png


Hier wie es fast aussehen sollte, hier wurde ne feste PanelBReite vergeben.
Es Sollte aber auf die Texthöhe eingestellt werden
richtige_erstellreihenfolge.png
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 09:22
Du kannst doch statt des Memos das umgebende Panel in der Höhe ändern, das Memo sollte sich doch dann daran anpassen. Und was meinst Du mit "Erstellungsreihenfolge verschoben"?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:46 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