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