![]() |
Absatzmarken in TMemo
Hallo zusammen,
Ich habe ein einfaches TMemo, in dass ein bischen Text eingegeben wird. Jetzt will ein Kunde seine Zeilenumbrüche besser im Griff haben und wünscht sich Absatzmarken, wie man sie sich z.B. in Word anzeigen lassen kann. Ich könnte natürlich alle #10#13 im Memo.text durch #10#13#183 ersetzen, aber dann habe ich das Absatzzeichen als editierbares Zeichen im Memo drin, was ja auch nicht gewünscht ist. Habt ihr eine Idee oder eine Komponente, mit der man das lösen kann? Ich könnte auch WPTools verwenden, aber das erscheint mir an dieser Stelle eher Overkill. |
AW: Absatzmarken in TMemo
Da bleibt dann wohl nur ein RichEdit, wo man nicht nur Text reinmachen kann.
PS: #13#10 (CRLF) und nicht #10#13, oder doch besser sLineBreak. PPS: Im neuen TRichEdit ist der Zeilenumbruch nur noch ein #13 (Mac), anstatt den bekannten #10 (Linux/Unix) und Windows (#13#10). |
AW: Absatzmarken in TMemo
Theoretisch kann man in TRichEdit Bereiche schützen. Im Grunde sogar sehr einfach. Das Paragraph Zeichen könnte man dann schützen, man könnte es dann nicht mehr löschen. Soviel zu den guten Nachrichten.
Ich kann mich jetzt nicht mehr an die Einzelheiten erinnern, aber ich kann mich erinnern, dass ich mal mit dem Schutz experimentiert habe und daran geradezu verzweifelt bin. Irgendwie konnte ich den gesperrten Bereich nicht wieder entsperren. Ich weiß nicht ob es dann wieder hingekriegt habe, aber daran kann ich mich erinnern. |
AW: Absatzmarken in TMemo
Vielen Dank für den Hinweis mit dem geschützten Bereich im TRichedit.
Damit habe ich das jetzt implementiert. Für die Entfernung des Schutzes muss man einfach in OnProtectChange das AllowChange entsprechend setzen. Im OnChange werden die Absatzmarken eingefügt und gleich geschützt. Dann musste ich noch in OnSelectionChange einige Cursorbewegungen abfangen und abändern, damit der Cursor sich so verhält, wie man es erwartet. Dabei muss man noch aufpassen, dass sich die Events nicht rekursiv aufrufen. |
AW: Absatzmarken in TMemo
Vielleicht kannst Du hiermit etwas anfangen:
Delphi-Quellcode:
Die Einstellung der Tabs wirkt sich grundsätzlich immer auf alle Zeilen aus, d.h. dies auch bei nachträglicher Veränderung des Tabulaturabstandes.
procedure TForm1.SetMemoTab(Memo: TMemo; TabWidth: Integer);
var DialogUnitsX: LongInt; PixelsX: LongInt; TabArray: array[0..19] of integer; // kann ggf. auch größer gesetzt werden i: integer; begin Memo.WantTabs := true; DialogUnitsX := LoWord(GetDialogBaseUnits); PixelsX := TabWidth; for i := 1 to Length(TabArray) do TabArray[i - 1] := ((PixelsX * i) * 4) div DialogUnitsX; SendMessage(Memo.Handle, EM_SETTABSTOPS, Length(TabArray), LongInt(@TabArray)); Memo.Refresh; end; procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text:=''; // Starteinstellung, hier mit TabAbstand = 50 Pixel SetMemoTab(Memo1, 50); end; // Möglichkeit zur nachträglichen Änderung des TabAbstandes procedure TForm1.Button1Click(Sender: TObject); Var TabDist: Integer; begin // TabAbstand zuvor in Edit1 vorgeben, z.B. auf 100 Pixel if not TryStrToInt(Edit1.text, TabDist) then exit; SetMemoTab(Memo1, TabDist); end; |
AW: Absatzmarken in TMemo
Danke, aber Tabulatoren sind momentan noch nicht gefragt, evtl. später.
|
AW: Absatzmarken in TMemo
Wenn es denn dann mal erweitert werden soll:
Schau Dir mal ![]() Ist eigentlich ein TMemo, dass aber vieeeeel mehr kann. 'nen Button, Shortcut oder Menüeintrag dazu und der Anwender kann selbst entscheiden, ob er's sehen will oder nicht. |
AW: Absatzmarken in TMemo
So, jetzt habe ich eine Komponente daraus gemacht. Funktioniert soweit ganz gut, allerdings will ich noch das Copy/Paste abfangen, um nur den Text ohne die Absatzmarken in die Zwischenablage zu kopieren.
Also habe ich mir sowas gedacht:
Delphi-Quellcode:
Müsste doch eigentlich so gehen, aber mein WMCopy wird nicht ausgeführt. Warum?
type
TMyRichEdit = class(TCustomRichEdit) private { Private-Deklarationen } procedure WMCopy(var Message: TMessage); message WM_Copy; //... protected { Protected-Deklarationen } //... public { Public-Deklarationen } //... published { Published-Deklarationen } //... end; implementation procedure TMyRichEdit.WMCopy(var Message: TMessage); begin // Das hier wird nicht ausgeführt CopyOhneAbsatzmarken; end; |
AW: Absatzmarken in TMemo
Nachtrag: Ich habe zum Test eine Edit-Komponente gemacht, die WM_Copy abfangen soll. Leite ich diese Komponemte von TCustomMemo ab, funktioniert alles, wie gewünscht. Wird von TCustomRichEdit abgeleitet, kommt die wm_copy-Message anscheinend nicht bei der Komponente an.
TCustomRichEdit ist selbst auch von TCustomMemo abgeleitet, also passiert anscheined irgendetwas in TCustomRichEdit, was mich nicht mehr auf die wm_copy-Message reagieren lässt. Aber was? Ich finde da nichts. Hat jemand eine Idee? Hier nochmal zur Verdeutlichung:
Delphi-Quellcode:
type
TMyEdit = class(TCustomRichEdit) private procedure WMCopy(var Message: TMessage); message WM_Copy; end; procedure TMyEdit.WMCopy(var Message: TMessage); begin // Das hier wird nicht ausgeführt end;
Delphi-Quellcode:
type
TMyEdit = class(TCustomMemo) private procedure WMCopy(var Message: TMessage); message WM_Copy; end; procedure TMyEdit.WMCopy(var Message: TMessage); begin // Das hier wird ausgeführt end; |
AW: Absatzmarken in TMemo
Hallo, ich hole dieses Thema noch mal hervor, weil jetzt eine andere Lösung habe. Vielleicht interessiert es ja jemanden.
Meine oben genannte Lösung mit den geschützten Absatzmarken-Zeichen im Richedit lief unter Delphi 10.2 nicht mehr korrekt. Hier wurden teilweise die falschen Zeichen geschützt und beim Tippen kam alles durcheinander. Habe erst lange nach der Ursache gesucht und verfolge jetzt einen ganz anderen Ansatz: Die Absatzmarken werden nicht in den RichEdit.Text eingebaut, sondern einfach auf einen Canvas drübergemalt. Dann reicht auch ein einfaches TMemo.
Delphi-Quellcode:
Das wird dann im OnKeyup des Memo aufgerufen.
procedure TMyForm.PaintParagraphMarks;
var i:integer; th:integer; tw:integer; yText:integer; Canvas: TControlCanvas; const cParagraphMark = #0182; begin if not fShowParagraphs then exit; Canvas := TControlCanvas.Create; try Canvas.Control := Memo; Canvas.Font.Assign(Memo.Font); th:=Canvas.TextHeight('X'); yText:=0; for i := 0 to Memo.Lines.Count do begin tw:=Canvas.TextWidth(Memo.Lines[i]); Canvas.TextOut(tw+5, yText, cParagraphMark); yText:=yText+th; end; finally Canvas.Free; end; end; Vorteil: Der Memo.Text bleibt unverändert. Man muss die Absatzmarken da nicht mehr umständlich entfernen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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-2025 by Thomas Breitkreuz