Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memo Zeilenanzahl begrenzen (https://www.delphipraxis.net/65000-memo-zeilenanzahl-begrenzen.html)

Ruffy87 10. Mär 2006 22:49


Memo Zeilenanzahl begrenzen
 
hallo,

Mein Grundgedanke:
Ich brauche eine Komponente mit der ich mehrzeiligen Text eingeben kann.
Diesen Text viel ich nachher in ein Label(mit WordWrap) einfügen.

Nun mein Programm:
Das Label ist ja auf eine bestimmte Anzahl von Zeilen begrenzt(Also durch seine Größe).
Aber nicht z.B. die Memo oder RichEdit Komponente. Füge ich jetzt einen zu langen Text von
der Memo in das Label, zeigt mir das Label natürlich nicht alles an.

Wie kann ich die Zeilen bei einer Memo Komp. einschränken?

Die Eigenschaft MaxLength begrenzt nur die Zeichen. Deshalb kann ich diese nicht benutzen.

Mit freundlichen Grüßen

Stefan

s.h.a.r.k 11. Mär 2006 02:27

Re: Memo Zeilenanzahl begrenzen
 
Und zwar kannst du dazu das OnChange-Ereignis verwenden:
Delphi-Quellcode:
procedure TForm1.Memo1Change(Sender: TObject);
var
  grenze, i : Integer;
begin
  // Wie viele Zeilen darf das Memo nicht überschreiten
  grenze := 5;
  if Memo1.Lines.Count > grenze then
    for i := (Memo1.Lines.Count - 1) downto grenze do Memo1.Lines.Delete(i);
end;
Habs grad so aus dem Kopf hingeschrieben, müsste aber funktionieren!

gfjs 11. Mär 2006 05:44

Re: Memo Zeilenanzahl begrenzen
 
Ich sehe dabei folgendes Problem:

Label.Text ist ein String, den Du Dir aus den Memo.Lines zusammenstellst. Wieviel Platz dieser String im Label benötigt, hängt aber m.E. nicht unbedingt von der Länge des Strings ab. Zwei Strings mit gleicher Länge werden vermutlich unterschiedlich große Labels benötigen, wenn der eine String überwiegend kurze, der zweite aber überwiegend lange Wörter enthält. Bei WordWrap wird ja nicht getrennt, sondern das ganze Wort in die nächste Zeile geschrieben, so dass viele lange Wörter im zweiten String zu viel leerem Platz in den einzelnen Zeilen führen können. Dadurch werden natürlich mehr Zeilen benötigt.

Ich kann das leider nicht ausprobieren, da ich hier im Büro kein Delphi installiert habe. Nachdem ich noch Anfänger bin, weiß ich auch nicht, ob sich mein Lösungsvorschlag realisieren lässt. Ich würde es so versuchen:

Statt des Labels ein weiteres Memo verwenden. Die Hintergrundfarbe des Anzeige-Memos auf die Farbe der übergeordneten Komponennte (z.B. eines Panels, auf dem das Memo liegt) setzen. ReadOnly := true. TabStop := false. Größe wie das Eingabe-Memo. Jetzt muss nur noch verhindert werden, dass in das Eingabe-Memo mehr geschrieben wird als erlaubt. Ich weiß nicht aus dem Stegreif, wie man die Eingabe in ein Memo begrenzen kann - vielleicht so: "if Memo1.Lines.Count > MaxZeilenzahl then Memo1.ReadOnly := true" ?!

Ich hoffe, ich liege nicht allzu falsch.

mfg gfjs

marabu 11. Mär 2006 08:17

Re: Memo Zeilenanzahl begrenzen
 
Hallo Stefan,

ich würde so vorgehen:

Delphi-Quellcode:
function TextIsFitting(const text: String; c: TCanvas): Boolean;
var
  r: TRect;
begin
  with c do
  begin
    r := ClipRect;
    DrawText(Handle, PAnsiChar(text), Length(text), r,
      // zum Anpassen schau in den Win32 SDK unter DrawText
      DT_CALCRECT + DT_LEFT + DT_WORDBREAK
    );
    Result := r.Bottom <= ClipRect.Bottom;
  end;
end;

procedure TDemoForm.MemoChange(Sender: TObject);
begin
  if TextIsFitting(Memo.Text, MultiLineLabel.Canvas)
    then Memo.Font.Color := clBlack
    else Memo.Font.Color := clRed;
end;
Grüße vom marabu

Ruffy87 11. Mär 2006 11:16

Re: Memo Zeilenanzahl begrenzen
 
Danke, ihr habt mir echt gut weiter geholfen!

Klappt einwandfrei. :thumb:

s.h.a.r.k 11. Mär 2006 14:10

Re: Memo Zeilenanzahl begrenzen
 
Hey.

Was mir auf die schnelle noch eingefallen ist: Und zwar musst du auch noch drauf aufpassen, dass wenn man einen Text, der von mir aus über die gewünschte Zeilenlänge geht, per Strg+V eingefügt wird dann auch abgefangen wird!

mfg shark


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 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