Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RichEdit: Zeilen und Zeichen pro Zeile begrenzen (https://www.delphipraxis.net/102625-richedit-zeilen-und-zeichen-pro-zeile-begrenzen.html)

Deep-Sea 5. Nov 2007 10:10

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Normalerweise würde ich SelStart am Anfang einer lokalen Variable zuweisen und am Ende wieder auf den Wert dieser setzen. Aber da du die Länge des Textes änderst wird das sicher net so leicht gehen :| ...

Zitat:

Zitat von Reinhardtinho
Zur Liste:
Es soll halt ganz normaler Text eingegeben werden, wie in Word z.B. wenn ich mich da mitten im Text positioniere, rutscht der Rest einfach weiter und es ist möglich was aus der Zwischenablage einzufügen.
Daher finde ich es mit der Liste nicht ganz so schön, wobei mich das langsam nervt, das man nicht einfach die maximale Zeichenanzahl pro Zeile einstellen kann :stupid:.

Bei einer Liste kann du auch mitten drin etwas einfügen. Und aus der Zwischenablage etwas zu holen ist dort auch kein Problem.
Es stellt sich aber nicht nur die Frage was "schön" ist, sondern auch was später stabil läuft ohne 3000 Zeilen Code für "nichts" zu verschwenden und trotzdem andauernd Fehler zu verursachen :-D ...

Reinhardtinho 5. Nov 2007 10:34

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hm, ich hab jetzt noch was gefunden, was (vorerst) läuft (keine 3000 Zeilen :stupid:):

Delphi-Quellcode:
procedure TForm1.Memo1Change(Sender: TObject);

  procedure SetCursorInMemo(const AMemo: TCustomMemo; X, Y: Integer);
  begin
    AMemo.SelStart := AMemo.Perform(EM_LineIndex, X, 0) + Y;
    AMemo.Perform(EM_SCROLLCARET, 0, 0);
    AMemo.SetFocus;
  end;

var
  sText    : String;
  i        : Integer;
  NewText  : String;
  Line     : Integer;
  Col      : Integer;
  Lines    : Integer;
begin
  sText  := Memo1.Text;

  if CanChange then
  begin
    Line := Memo1.CaretPos.Y;
    Col  := Memo1.CaretPos.X;
    Lines := Memo1.Lines.Count;
  end;

  NewText := '';

  sText := StringReplace(sText, #13, '', [rfReplaceAll]);
  sText := StringReplace(sText, #10, '', [rfReplaceAll]);

  for i := 1 to Length(sText) do
  begin
    if ((i Mod 10) = 0) then
      NewText := NewText + sText[i] + #13#10
    else NewText := NewText + sText[i];
  end; (* of for *)

  if CanChange then
  begin
    CanChange := False;
    Memo1.Text := NewText;

    if (Lines <> Memo1.Lines.Count) then
      Col := Col + 2;
     
    //Cursorposition neu setzen
    SetCursorInMemo(Memo1, Line, Col);
  end;

  CanChange := True;

  if (Memo1.Lines.Count > 4) then
    Memo1.Lines.Delete(4);
end;
Hier begrenze ich die Zeichenanzahl pro Zeile auf 10 und die Zeilenanzahl auf 4.
Nach ein paar Tests kann ich sagen, dass es soweit seinen Zweck erfüllt, wie gut es wirklich ist, wird sich noch zeigen.

Die Prozedur SetCursorInMemo ist von dsdt.info.


Ich bedanke mich bei allen, die mir geholfen haben, das Problem zu lösen (vielleicht melde ich mich später nochmal).


MFG
Lorenz


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr.
Seite 2 von 2     12   

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