![]() |
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 |
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 |
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
|
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:
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.
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; Habt ihr Tipps, wie ich das Paste abfangen kann? Dankesehr. MFG Lorenz |
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 |
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 |
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 |
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 |
Re: RichEdit: Zeilen und Zeichen pro Zeile begrenzen
Zitat:
(Und ich glaube immer noch, das eine Liste ggf. besser wäre ...) |
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. |
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