Einzelnen Beitrag anzeigen

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