AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Absatzmarken in TMemo

Ein Thema von bcvs · begonnen am 17. Jan 2014 · letzter Beitrag vom 12. Dez 2019
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#1

Absatzmarken in TMemo

  Alt 17. Jan 2014, 13:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: Absatzmarken in TMemo

  Alt 17. Jan 2014, 13:32
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).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Absatzmarken in TMemo

  Alt 17. Jan 2014, 15:02
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.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#4

AW: Absatzmarken in TMemo

  Alt 20. Jan 2014, 12:39
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.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Absatzmarken in TMemo

  Alt 20. Jan 2014, 13:53
Vielleicht kannst Du hiermit etwas anfangen:
Delphi-Quellcode:
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;
Die Einstellung der Tabs wirkt sich grundsätzlich immer auf alle Zeilen aus, d.h. dies auch bei nachträglicher Veränderung des Tabulaturabstandes.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#6

AW: Absatzmarken in TMemo

  Alt 20. Jan 2014, 16:32
Danke, aber Tabulatoren sind momentan noch nicht gefragt, evtl. später.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Absatzmarken in TMemo

  Alt 21. Jan 2014, 00:53
Wenn es denn dann mal erweitert werden soll:

Schau Dir mal Synedit an, da kannst Du per Eigenschaft im Objektinspektor ein Attribut setzen, dass Absatzmarken, Tabulatoren und Leerzeichen angezeigt werden.
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.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#8

AW: Absatzmarken in TMemo

  Alt 21. Jan 2014, 13:03
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:
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;
Müsste doch eigentlich so gehen, aber mein WMCopy wird nicht ausgeführt. Warum?
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#9

AW: Absatzmarken in TMemo

  Alt 21. Jan 2014, 16:40
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;
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#10

AW: Absatzmarken in TMemo

  Alt 12. Dez 2019, 10:10
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:
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;
Das wird dann im OnKeyup des Memo aufgerufen.

Vorteil: Der Memo.Text bleibt unverändert. Man muss die Absatzmarken da nicht mehr umständlich entfernen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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