Memofeld größe an Text anpassen [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Memofeld größe an Text anpassen [gelöst]

Beitrag von Dragomir »

Hallo hier bin ich mal wieder :)

der Betreff sagt ja alles aus noch mal ein wenig ausführlicher :mrgreen: :mrgreen:

Ich hätte gerne ein Memofeld das sich anpasst an meinen text wenn ich Buchstaben eintrage wird es breiter und wenn ich einen zeilenumbruch mach wird dann das Memofeld kleiner ich habe mir gedacht das ich ein onKeyPress event mache
und dann immer das Memofeld eine bestimmte größe wächst aber da hab ich was vergessen nämlich das jeder buchstabe eine individuelle breite hat (jetz nicht festnageln auf meine aussage :mrgreen: ) hätte aber gern weiter arial und nicht
die Schriftart bei der jedes Zeichen gleich breit und hoch ist

danke im Voraus

ls Sebi
Zuletzt geändert von Dragomir am Mi 13. Mai 2015, 14:58, insgesamt 1-mal geändert.

Warf
Beiträge: 2142
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Memofeld größe an Text anpassen

Beitrag von Warf »

Ich sehe da 2 Möglichkeiten:
1. über ein Canvas mit TextWidth und TextHeight

Code: Alles auswählen

 
procedure GetTextSize(const S: string; F: TFont; C: TCanvas; Out wd, hg: integer);
var
  TMPFont: TFont;
begin
  with C do
  begin
      TMPFont := Font;
      Font := F;
      wd := TextWidth(S);
      hg := TextHeight(S);
      Font := TMPFont;
  end;
end;
Kann dann etwa so aufgerufen werden

Code: Alles auswählen

var h, w: Integer;
begin
  GetTextSize(Memo1.Text, Memo1.Font, Self.Canvas, w, h);
  Memo.Height := h;
  Memo.Width := w;
end;
Das könnte/wird allerdings Probleme unter Windows bei Hoher DPI Scalierung verursachen

2. Über ein Label (Dreckig aber läuft)

Code: Alles auswählen

 
procedure GetTextSize(const S: string; P: TWinControl; F: TFont; Out wd, hg: integer);
begin
  with TLabel.Create(nil) do
    try
      AutoSize := True;
      Caption := s;
      Font := F;
      Parent:=P;
      wd := Width;
      hg := Height;
    finally
      Free;
    end;
end;
Nutzung dann z.B.

Code: Alles auswählen

 
var
  w, h: integer;
begin
  GetTextSize(Memo1.Text, Self, Memo1.Font, w, h);
  Memo1.Width := w;
  Memo1.Height := h;
end;
Beides nicht grade schön aber es läuft

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Memofeld größe an Text anpassen

Beitrag von Antrepolit »

Dragomir hat geschrieben:Hallo hier bin ich mal wieder :)

der Betreff sagt ja alles aus noch mal ein wenig ausführlicher :mrgreen: :mrgreen:

Ich hätte gerne ein Memofeld das sich anpasst an meinen text wenn ich Buchstaben eintrage wird es breiter und wenn ich einen zeilenumbruch mach wird dann das Memofeld kleiner ich habe mir (...)
Normalerweise lass ich die Leute immer machen, aber hier stellt sich die Frage: Wozu?
SO etwas stümperhaftes zu basteln ist schlechtes Design. Das erkennst du daran, dass kein Text (Feld leer) mit einer Breite von 0 endet. Dann kannst du dein Memofeld nicht mehr sehen. Also wozu braucht man sowas? Und was, wenn jemand ganz viel Text einträgt und das Ding über den Bildschirm oder das Fenster hinaus wächst?
Grüße, Antrepolit

care only if your os is really burning

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Memofeld größe an Text anpassen

Beitrag von Dragomir »

@Antrepolit

der einzige grund weswegen ich das gerne hätte ist weil ich ein textfeld auf ein bild machen will und bei klick wird es halt draufgeschrieben und wollte nur das es halt größer und kleiner wird jenachdem
aber naja egal

@Warf

danke werde wohl die erste holen und mich mal heute dran ausprobieren:)

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Memofeld größe an Text anpassen

Beitrag von Dragomir »

Habe jetz die Dreckigere Variante geholt weil Canvas immer wieder mein Editfeld zu klein gemacht hat aber mit dem label klappt das gut

Code: Alles auswählen

procedure TFrm_bearbeitung.MyMemoChange(Sender: TObject);
var
  memowidth, memoheight : integer;
begin
 
  if Textfeld.Text = '' then
  begin
    Textfeld.Width := 50;
    Textfeld.Height:= 25;
  end
  else
    begin
      GetTextSize(Textfeld.Text, self, Textfeld.Font, memowidth, memoheight);
 
      Textfeld.Width := memowidth + 20;
      Textfeld.Height:= memoheight + 10;
      // die + 20 sind damit das Memo kein Automatischen Zeilenumbruch macht  
     // die +10 sind damit das Memo immer großgenug ist für den text
    end;
end;
 
procedure TFrm_bearbeitung.GetTextSize(const MemoStr: String;
  Memopar: TWinControl; MemoFont: TFont; out Memobreit, Memohoch: integer);
begin
  with TLabel.Create(nil) do
   try
     AutoSize := true;
     parent := Memopar;
     Caption := MemoStr;
     Font := MemoFont;
     Memobreit := Width;
     Memohoch := Height;
   finally
     free;
   end;
end;                                      
Danke nochmal für die Hilfe:)

Antworten