![]() |
Mehrzeiligen Text in Memo vorgegebener Größe einpassen
Hallo, Allerseits.
Ich bemühe mich gerade, eine Anwendung so zu gestalten, dass das Erscheinungsbild auch bei unterschiedlichen Auflösungen nicht aus der Form gerät. Vor Probleme stellt mich dabei das Einpassen eines vorgegebenen Textes in Memo. Beispiel: Ich entwickle die Anwendung auf meinem Laptop mit einer Auflösung von 1024 x 768. Bei einer Auflösung von 1024 x 600 ist das Memo für einen 3-zeiligen Text weniger hoch, so dass ich Memo1.Font.Size entsprechend anpassen muss. Nachdem das nicht geklappt hat, bin ich erst mal den umgekehrten Weg gegangen, um dem Ganzen auf die Spur zu kommen: Ich habe den Text einem Label (autosize = true) als Caption zugewiesen und die Höhe des Labels verwendet, um die nötige Höhe des Memos zu ermitteln.
Delphi-Quellcode:
Das Problem, das jetzt auftritt: Vom 3-zeiligen Text erscheinen in dem so angepassten Memo nur zwei Zeilen. Egal wie lang der Text ist, ich brauche immer eine Zeile mehr, um den Text anzuzeigen. Meine Vermutung, dass bei Lines.Add automatisch ein Zeilenumbruch angehängt wird, hat sich nicht bestätigt.
unit U2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Memo1: TMemo; Button1: TButton; ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var TH : integer; R : TRect; begin TH := Label1.Height; Memo1.Clear; Memo1.Perform(EM_GETRECT, 0, LongInt(@r)); Memo1.ClientHeight := TH + 10; R.Top := 5; R.Bottom := Memo1.ClientHeight + 5; Memo1.Perform(EM_SETRECT, 0, LongInt(@R)); Memo1.Lines.Add(ListBox1.Items[0]); Memo1.Lines.Add(ListBox1.Items[1]); Memo1.Lines.Add(ListBox1.Items[2]); Button1.Caption := IntToStr(Memo1.Height); end; procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Clear; ListBox1.Items.Add('Zeile 1'); ListBox1.Items.Add('Zeile 2'); ListBox1.Items.Add('Zeile 3'); Label1.Caption := ListBox1.Items[0] + #13 + ListBox1.Items[1] + #13 + ListBox1.Items[2]; end; end. Wer kann mir da weiterhelfen? Vielen Dank und einen schönen Abend. Gruß Jürgen. |
Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen
einfach diese Zeile
[delphi] R.Bottom := Memo1.ClientHeight + 5 //verändern R.Bottom := Memo1.ClientHeight + 10 //frag mich net warum 9 ist auch zuwenig |
Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen
Ich hab es jetzt so gemacht
Delphi-Quellcode:
Getestet und es wird angezeigt. Nur wenn du das Memo anklickst, springt er zur letzten Zeile (leere; Zeilenanfang)
procedure TForm1.Button1Click(Sender: TObject);
var TH : integer; R : TRect; begin TH := Label1.Height; Memo1.Clear; {Memo1.Perform(EM_GETRECT, 0, LongInt(@r)); Memo1.ClientHeight := TH + 10; R.Top := 5; R.Bottom := Memo1.ClientHeight; Memo1.Perform(EM_SETRECT, 0, LongInt(@R));} Memo1.Lines.Add(ListBox1.Items[0]); Memo1.Lines.Add(ListBox1.Items[1]); Memo1.Lines.Add(ListBox1.Items[2]); Memo1.ClientHeight := TH + 10; Button1.Caption := IntToStr(Memo1.Height); end; Gruß NickelM |
Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen
@ NickelM
Hallo und vielen Dank für Deine Mühe. So weit war ich allerdings auch schon - diese "Zugabe" ist aber von Font.Size abhängig und somit nicht praktikabel. Aber ich habe jetzt eine Möglichkeit gefunden:
Delphi-Quellcode:
Damit klappt's im Moment perfekt. Ich hoffe, die Lösung ist nicht allzu abwegig.
Repeat
SendMessage(Memo1.Handle,WM_KEYDOWN,VK_UP,0); Until Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0 , LongInt(@R))= 0; Gruß Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 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