AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Mehrzeiligen Text in Memo vorgegebener Größe einpassen
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrzeiligen Text in Memo vorgegebener Größe einpassen

Ein Thema von gfjs · begonnen am 25. Aug 2008 · letzter Beitrag vom 26. Aug 2008
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Mehrzeiligen Text in Memo vorgegebener Größe einpassen

  Alt 25. Aug 2008, 19:20
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:
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.
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.
Wer kann mir da weiterhelfen?

Vielen Dank und einen schönen Abend.

Gruß Jürgen.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen

  Alt 25. Aug 2008, 20:16
einfach diese Zeile

[delphi]
R.Bottom := Memo1.ClientHeight + 5
//verändern
R.Bottom := Memo1.ClientHeight + 10 //frag mich net warum 9 ist auch zuwenig
Nickel
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen

  Alt 25. Aug 2008, 20:26
Ich hab es jetzt so gemacht

Delphi-Quellcode:
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;
Getestet und es wird angezeigt. Nur wenn du das Memo anklickst, springt er zur letzten Zeile (leere; Zeilenanfang)

Gruß NickelM
Nickel
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Mehrzeiligen Text in Memo vorgegebener Größe einpassen

  Alt 26. Aug 2008, 12:27
@ 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:
Repeat
  SendMessage(Memo1.Handle,WM_KEYDOWN,VK_UP,0);
Until Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0 , LongInt(@R))= 0;
Damit klappt's im Moment perfekt. Ich hoffe, die Lösung ist nicht allzu abwegig.

Gruß Jürgen
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  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 12:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz