Delphi-PRAXiS
Seite 2 von 4     12 34      

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 Aufzählung in RichEdit (https://www.delphipraxis.net/6973-aufzaehlung-richedit.html)

quendolineDD 26. Mai 2009 20:27

Re: Aufzählung in RichEdit
 
Dann hast du dir aber nicht alles dazu durchgelesen.
Beim Tabben musst du als Flag zusätzlich PFM_OFFSETINDENT setzen und dann kannst du dir mal noch die Erläuterungen zu dxStartIndent und dxOffset anschauen.

Edit: PFM_OFFSET nicht vergessen.

TheMiller 26. Mai 2009 20:48

Re: Aufzählung in RichEdit
 
Hm... versteh nicht ganz, was du damit meinst.

Ich versuche gerade mit EM_GETPARAFORMAT die aktuelle Ebene abzufragen (funzt soweit) und eine weitere, tiefere Ebene zu erstellen. Ist das der richtige Weg?

[Edit] Ja, ist es! Source kommt später noch dazu - für andere, die das gleiche Problem haben. [/EDIT]

quendolineDD 26. Mai 2009 20:53

Re: Aufzählung in RichEdit
 
Also ich hab dafür nicht erst die vorherige Ebene abfragen müssen, sondern mit den Offsets kannst du relativ zur vorherigen Ebene Einzüge erstellen. Ebenso kann man negative Offsets verwenden (steht alles da...)

TheMiller 26. Mai 2009 20:56

Re: Aufzählung in RichEdit
 
Ja. Das stimmt schon. Nur ich möchte ja auch die Nummerierungsart pro Ebene ändern. Also I, A, 1, aa, aaa etc

quendolineDD 26. Mai 2009 20:58

Re: Aufzählung in RichEdit
 
Dann musst du natürlich abfragen :)

TheMiller 26. Mai 2009 21:00

Re: Aufzählung in RichEdit
 
Aber ein Problem gibt's jetzt noch. Funktioniert alles... nur, wenn ich Tab drücke und die Nummerierung geändert wird wird noch ein TAB-Zeichen eingefügt. Das bedeutet, dass in Ebene 7 locker 100m zwischen Caret und Aufzählungszeichen liegen ;)

Spiele schon mit den Werten rum, finde aber die Einstellung nicht.

quendolineDD 26. Mai 2009 21:53

Re: Aufzählung in RichEdit
 
Keine Ahnung wo dein Problem liegt.
Folgendes funktioniert bei mir einwandfrei
Delphi-Quellcode:
procedure TForm4.RichEdit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  fmt,
  fmt_old : TParaFormat2;
begin
  //Initialize structure
  ZeroMemory(@fmt, SizeOf(TParaFormat2));
  ZeroMemory(@fmt_old, SizeOf(TParaFormat2));
  fmt.cbSize := SizeOf(TParaFormat2);
  fmt_old.cbSize := SizeOf(TParaFormat2);

  //common settings
  fmt.wNumberingStart := 1;
  fmt.wNumberingStyle := $200;
  fmt.wNumberingTab := 360;

  RichEdit1.Perform(EM_GETPARAFORMAT, 0, LPARAM(@fmt_old));

  case Key of
    VK_RETURN:
    begin
      fmt.dwMask := PFM_NUMBERING or PFM_NUMBERINGSTART or PFM_NUMBERINGSTYLE or
        PFM_NUMBERINGTAB;

      if fmt_old.wNumbering <> 0 then
        fmt.wNumbering := fmt_old.wNumbering
      else
        fmt.wNumbering := 2;
    end;


    VK_TAB:
    begin
      fmt.dwMask := PFM_NUMBERING or PFM_NUMBERINGSTART or PFM_NUMBERINGSTYLE or
        PFM_NUMBERINGTAB or PFM_OFFSETINDENT or PFM_OFFSET;

      fmt.dxStartIndent := 300;
      fmt.dxOffset := 100;

      if fmt_old.wNumbering < 6 then
        fmt.wNumbering := fmt_old.wNumbering + 1
      else
        fmt.wNumbering := 2;
    end;
  end;

  //perform
  RichEdit1.Perform(EM_SETPARAFORMAT, 0, LPARAM(@fmt));
end;
Grüße

TheMiller 26. Mai 2009 23:58

Re: Aufzählung in RichEdit
 
Vielen Dank für den Quelltext, aber da habe ich das selbe Problem. Nochmal zur Verdeutlichung - kann sein, dass ich mich doof ausgedrückt habe.

Also, ich prüfe bei OnKeyDown ob die "TAB"-Taste gedrückt wurde. Wenn ja, wird eine tiefere Nummerierungsebene begonnen. Um diesen Effekt zu erreichen, musste ich im RichEdit "WantTabs" auf True setzen. Nun stell dir vor, dass ich in Ebene 5 will - also drücke ich 5 Mal die Tab-Taste. Danach bin ich auch in der 5. Ebene, habe aber auch 5 Tabs eingefügt bekommen.

Hier nochmal als Bild

Code:
1. Hallo
   A.    Wie
      I.         Geht
         aa.              Es
            aaa.                   Dir?
Setze ich "WantTabs" auf False, führt er alles richtig aus, verlässt aber logischerweise auch das Richedit.

Wenn ich statt der Tab-Taste Buttons mit Einrücken und Zurücksetzen erstelle, funktionier es einwandtfrei - ist aber weniger Benutzerfreundlich...

Ich hatte schon gedacht, nach dem Umstellen der Nummerierungsebene, das letzte Zeichen im Richedit, also das TAB per WM_KEYDOWN zu löschen, aber das sieht der User.

Aber sonst funktioniert alles ganz toll.

TheMiller 27. Mai 2009 00:28

Re: Aufzählung in RichEdit
 
Und nun hier noch die Lösung!

Also, ich wollte ja verhindern, dass er einen Tab in das RichEdit schreibt. Und ich habe auch schon abgefragt, ob ein TAB gedrückt wurde. OnKeyPress / OnKeyDown / OnKeyUp wird ausgeführt, bevor das Zeichen geschrieben wird....

Das bedeutet, nachdem ich das Zeichen (TAB) abgefangen habe, muss ich es auf meine Art und Weise verarbeiten und dann "vernichten", bevor es nochmal vom RichEdit (oder was auch immer verarbeitet wird). Und das geht einfach damit:

Delphi-Quellcode:
if (Key = Char(VK_TAB)) then
begin
  //Tabulator vernichten, wenn nötig:
  if (AktuellerParagraphIstEineAufzählung) then
  begin
    Key:=#0;
    //Eigene Verarbeitung starten
    TieferGliedern();
  end;
end;
Die Variable "AktuellerParagraphIstEineAufzählung" gibt es bei mir natürlich nicht. Sie sollte nur zeigen, dass man darauf achten soll zu prüfen, ob man sich in einer Aufzählung befindet. Fehlt diese Prüfung, könnte der User keine TABs mehr setzen. Is ja auch doof ^^

So, ich verabschiede mich jetzt mal mit einem großem "Dankeschön"...

Dankeschön und Tschüss

quendolineDD 27. Mai 2009 05:36

Re: Aufzählung in RichEdit
 
Ich bin dies umgangen indem ich OnKeyUp genutzt habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 2 von 4     12 34      

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