Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

Reinhardtinho 1. Nov 2007 11:07


RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hi @all,

Ich möchte den Inhalt eines RichEdits in Richtung Excel exportieren und habe dort nur eine bestimmte Anzahl an Zeichen pro Zeile und an Zeilen zur Verfügung.

Wie kann man bei einer RichEdit-Komponente die Maximalwerte einstellen?


Danke.

MFG
Lorenz

taaktaak 1. Nov 2007 15:41

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hallo Lorenz,
mir ist noch nicht so ganz klar worin das Problem besteht. Der Text im RichEdit ist doch "normalerweise" Fließtext, der optisch - so das Attribut gesetzt ist - umgebrochen wird. Erzwingt die spätere Verwendung in Excel eine Limitierung des Textes, gibt es m. E. zwei Grundfälle ..

a) Du kannst die Limitierung bereits während der Texterfassung in das RichEdit durch dein Programm überwachen lassen. Das könnte dann bedeuten, dass du nach der Eingabe einer bestimmten Zeichenanzahl durch das Programm CRLF einfügst. Wenn die maximale Zahl der Zeilen (also Zeilen mitzählen) erreicht ist, darf das Programm keine weiteren Eingaben zulassen.

b) Du hast keinen Einfluß auf den RTF-Text (während der Erstellung) >> dann musst du den fertigen Text analog des unter a) beschriebenen aufbereiten. Das automatisierte "Zurechtstutzen" stelle ich mir allerdings etwas aufwändig vor, wenn dabei nicht die Gefahr bestehen soll, dass in vielen Fällen unleserliches Zeug in Excel ankommt.

Gruß Ralph

Deep-Sea 1. Nov 2007 15:44

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Ich weiß ya nicht, was du genau vorhast, aber wäre es nicht vlt. einfacher und besser, eine Liste (TListBox, TListView) zu nutzen? :-D

Reinhardtinho 2. Nov 2007 16:03

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hi,

ich bin jetzt auf ein Memo umgestiegen, weil die Formatierung in Excel einheitlich sein soll.

Ich bin auch ein bisschen weitergekommen, ich habe im Internet folgenenden Code gefunden:

Delphi-Quellcode:
if key = #13 then begin
    with Sender as TMemo do begin
      if lines.count >= 2 then begin
        key := #0;
        line := Perform( EM_LINEFROMCHAR, SelStart, 0 );
        if line < 1 Then
          SelStart := Perform( EM_LINEINDEX, line+1, 0 );
      end;
    end;
  end;
Das funktioniert für die Anzahl der Zeilen, wenn ich den Text im Memo eintippe, aber nicht wenn ich Text per Copy&Paste einfüge, weil dort die Enter-Taste nicht gedrückt wird.

Habt ihr Tipps, wie ich das Paste abfangen kann? Dankesehr.

MFG
Lorenz

Reinhardtinho 2. Nov 2007 17:25

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Kurz nach Feierabend ( :mrgreen: ) bin ich wohl der richtigen Lösung auf der Spur.

Ich werde im OnChange-Ereignis des Memos den Text analysieren und dort alle Zeilenumbrüche rauslöschen und dann neu setzen.

Vielen Dank an alle.

MFG und schönes WE
Lorenz

taaktaak 2. Nov 2007 17:45

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hallo Lorenz,
also die Variante A - der CodeSchnipsel überwacht aber nur die Zahl der Zeilen, ich denke, du wolltest auch die Zeichen/Zeile limitieren? Na, dann noch viel Erfolg.
Gruß Ralph

Reinhardtinho 2. Nov 2007 22:12

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hallo,

ja das ist richtig, die Zeichen pro Zeile habe ich auch im OnChange Ereignis schon überprüft, soweit hat auch alles geklappt, nur Copy&Paste war dort noch das Problem und nun werde ich das dann mit Memo1.Text im OnChange-Ereignis machen und dort die Steuerzeichen umbauen.

Damit sichere ich auch den Fall ab, das jemand was einfügt.

Meine Lösung werde ich dann am Montag nochmal vorstellen.


MFG
Lorenz

Reinhardtinho 5. Nov 2007 10:43

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hallo *,

soweit mit den Zeichenbegrenzung pro Zeile funktioniert alles, nur hab ich ein Problem. Wenn ich den Text zuweise, wird die Cursorposition an den Anfang gesetzt, ich möchte aber, dass der Cursor hinter dem Zeichen bleibt, dass ich zuletzt eingefügt habe.

Wie mache ich das am Besten? Der Eigenschaft CaretPos kann man nichts zuweisen.

Delphi-Quellcode:
procedure TForm1.Memo1Change(Sender: TObject);
var
  sText  : String;
  i      : Integer;
  NewText : String;
begin
  sText  := Memo1.Text;
  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 *)

  Memo1.Text := NewText;

  //Cursorposition neu setzen
end;

MFG
Lorenz

Deep-Sea 5. Nov 2007 10:46

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Zitat:

Zitat von Reinhardtinho
soweit mit den Zeichenbegrenzung pro Zeile funktioniert alles, nur hab ich ein Problem. Wenn ich den Text zuweise, wird die Cursorposition an den Anfang gesetzt, ich möchte aber, dass der Cursor hinter dem Zeichen bleibt, dass ich zuletzt eingefügt habe.

Wie mache ich das am Besten? Der Eigenschaft CaretPos kann man nichts zuweisen.

SelStart ...

(Und ich glaube immer noch, das eine Liste ggf. besser wäre ...)

Reinhardtinho 5. Nov 2007 11:01

Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
 
Hallo,

danke für die schnelle Antwort.

Ich habe das ganze jetzt etwas überarbeitet, aber der Cursor springt immer an die erste Stelle im Memo und ich weiss nicht warum.

Delphi-Quellcode:
procedure TForm1.Memo1Change(Sender: TObject);
var
  sText    : String;
  i        : Integer;
  NewText  : String;
  Line     : Integer;
begin
  sText  := Memo1.Text;

  if CanChange then
    Line := Memo1.CaretPos.Y;

  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;

    //Cursorposition neu setzen
    Memo1.SelStart := Perform(EM_LINEINDEX, Line, 0) ;
  end;

  CanChange := True;
end;

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:.


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

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 by Thomas Breitkreuz