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
H3llsing

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

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.660 Beiträge
 
Delphi 12 Athens
 
#2

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
Benutzerbild von himitsu
himitsu

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 09:31
Ich hätt wohl einfach einen TWebBrowser verwendet und dieses über eine HTML-Tabelle gelöst.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
H3llsing

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 09:37
Erstellungsreihenfolge siehe Anhang, die beiden Bilder.
Die panels schieben sich dann nach oben komischer weise.

Zu der höhe des Panels, ich habe versucht mit der Funktion die Höhe des Panels entsprechend der länge des memotextes zu berechnen, aber irgendwo hakt es.
Ich möchte ja keien Scrollbars verwenden

@himitsu
joar das wäre natürlich auch ne Lösung, und ich glaube ich werds auch direkt so ausprobieren
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 09:55
Delphi-Quellcode:
//Memo1.ScrollBars := ssNone; // im OI
//Memo1.WordWrap := True;

procedure TForm5.Memo1Change(Sender: TObject);
var
  S: String;
  i: Integer;
begin
  S := Memo1.Text;
  if (S = '') or (Copy(S, Length(S))[1] in [#13, #10]) then i := 1 else i := 0;
  Memo1.ClientHeight := Canvas.TextHeight('X') * (Memo1.Lines.Count + i) + 3;
end;
oder
Delphi-Quellcode:
procedure TForm5.Memo1Change(Sender: TObject);
var
  S: String;
  i: Integer;
begin
  S := Memo1.Text;
  if (S <> '') and (Copy(S, Length(S))[1] in [#13, #10]) then i := 1 else i := 0;
  Memo1.ClientHeight := Canvas.TextHeight('X') * Max(Memo1.Lines.Count + i, 1) + 3;
end;
+3 = irgendein krummer und nicht näher beschreibbarer Erfahrungswert
i = da in .Lines eine leere Zeile am Ende nicht mitgezählt wird
.Lines enthält auch die virtuellen Zeilenumbrüche (blöderweise, aber hier isses mal praktisch)

das Form.Canvas hatte ich jetzt nur genommen, da ich ja irgendein Canvas brauchte und meine Testform zufällig die selbe Schriftart hatte, wie das Memo (das kann auch irgendein anderes Canvas sein und notfalls auch ein selbsterstelltes, welchem der Font des Memos zugewiesen wurde)

bei so vielen Memos würde ich statt Memo1 eher TMemo(Sender) verwenden und allen Memos die selbe Ereignisprozedur spendieren.

Die Höhe ( Canvas.TextHeight('X') ) könnte man auch nur einmal am Anfang berechnen und in einer Variable speichern.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Aug 2010 um 10:01 Uhr)
  Mit Zitat antworten Zitat
H3llsing

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 10:38
Ok Vielen dank an alle.
Ich hab mich nun für die TWebbrowser komponente entschieden, dann werd ich gleich noch jquery mit einbaun und dann sieht das ganze auch nett aus =)
nur leider nicht schön da ich für jeden Benutzer ein eigenes Temp.html anlegen muss, wo der Browser hinnavigiert.
aber bei 14 usern geht das gaze schon.

Ich werd später nochmal mein Code posten für die, die es interessiert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 11:06
Im Forum finden sich etliche Beispiele, wie man den HTML-Code direkt an den TWebBrowser übergeben kann (anstatt zu eine HTML-Datei zu navigieren)

CSS, Images und Co. kann man inline in den HTML-Code einbetten, so benötigt man auch dafür keine externe Datei.
Irgendwo hatte ich auch mal die Link-Definition, um externe Dateien (CSS, Bilder usw.) auch vom System aus den Resourcen einer EXE/DLL laden zu lassen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
H3llsing

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

AW: Tmemo height dynamisch an text anpassen

  Alt 4. Aug 2010, 14:38
vielen dank, werd ich mir später nochmal anschauen mit dem direkten senden.

hier ist vorerst meine Lösung, die ich nochmal überarbeiten werde sobald ich zeit habe =)
Delphi-Quellcode:
 try
    Mylist := Tstringlist.Create;
    Mylist.LoadFromFile(ExtractFilePath(ParamStr(0))+'html/anfang.html');
    for i := 0 to length(ar_content)-1 do
    begin

      try
        MYBeitrag := Tstringlist.Create;
        MYBeitrag.LoadFromFile(ExtractFilePath(ParamStr(0))+'html/Beitrag.html');
        if FormatDateTime('dd.mm.yyyy',now) = FormatDateTime('dd.mm.yyyy',ar_content[i].datum) then
           header := '#'+intToStr(i+1)+' von '+ar_content[i].ersteller+' um <b>'+FormatDateTime('HH:MM:ss',ar_content[i].datum)+'</b> geschrieben'
        else
           header := '#'+intToStr(i+1)+' von '+ar_content[i].ersteller+' um <b>'+FormatDateTime('dd.mm.yyyy HH:MM:ss',ar_content[i].datum)+'</b> geschrieben';

        ar_content[i].content := StringReplace(ar_content[i].content,#10#13,'<br>',[rfReplaceAll,rfIgnoreCase]);
        ar_content[i].content := StringReplace(ar_content[i].content,#10,'<br>',[rfReplaceAll,rfIgnoreCase]);

        MYBeitrag.Text := StringReplace(MYBeitrag.Text,'[header]',header,[rfReplaceAll,rfIgnoreCase]);
        MYBeitrag.Text := StringReplace(MYBeitrag.Text,'[nr]',intToStr(i+1),[rfReplaceAll,rfIgnoreCase]);
        MYBeitrag.Text := StringReplace(MYBeitrag.Text,'[content]',trim(ar_content[i].content),[rfReplaceAll,rfIgnoreCase]);


        MYlist.Add(trim(MYBeitrag.Text));
      finally
        MYBeitrag.Free;
      end;


    end;
    Mylist.Add('</table></body></html>');
    mylist.SaveToFile(ExtractFilePath(ParamStr(0))+'html/'+Benutzer+'temp.html');
    frmAnfrage.WebBrowser1.Navigate(ExtractFilePath(ParamStr(0))+'html/'+Benutzer+'temp.html');
  finally
    Mylist.Free;
  end;
und hier noch ein kleiner screen
html_loesung.png
  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 23:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz