Delphi-PRAXiS

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)

FriFra 29. Jul 2003 08:01


Aufzählung in RichEdit
 
Ich habe ein paar Fragen zu Aufzählungen in RichEdit's

1. Wie kann ich in einem RichEdit eine Aufzählung erstellen?
2. Wie kann ich eine Aufzählung ggf. lokalisieren, da ich diese in HTML umwandeln muss.

P.S.: Über die Zwischenablage kann man problemlos eine Aufzählung einfügen.

Christian Seehase 1. Aug 2003 22:40

Re: Aufzählung in RichEdit
 
Moin FriFra,

schau Dir mal im PSDK die Messages EM_SETPARAFORMAT/EM_GETPARAFORMAT an.

fkerber 4. Aug 2003 20:42

Re: Aufzählung in RichEdit
 
Hi!
Es gibt da die Eigenschaft

Richedit1.Paragraph.Numbering:=nsbullet;

dann geht das!

Ciao fkerber

TheMiller 13. Mai 2009 19:13

Re: Aufzählung in RichEdit
 
Mit dieser Eigenschaft kann man super eine Aufzählung erstellen. Kann man damit auch noch tiefer untergliedern? Also in tiefere Ebenen?

Wenn nicht, geht das überhaupt und wenn ja, wie?

Vielen Dank

Helmi 13. Mai 2009 19:19

Re: Aufzählung in RichEdit
 
Hallo,

vielleicht helfen die ja die Schweizer weiter....

TheMiller 13. Mai 2009 23:16

Re: Aufzählung in RichEdit
 
Ohhha,

das ist ja wunderbar. Ich habe es noch nicht ausprobiert, aber das wird sicherlich genauso gut funktionieren, wie alles andere von deren Tipps ;)

Danke - ich schaue bei den Schweizern zu selten. Erste Anlaufstelle ist halt die DP !

TheMiller 26. Mai 2009 18:46

Re: Aufzählung in RichEdit
 
Der Code von den Schweizern ist klasse. Ich habe jetzt versucht, tiefer zu untergliedern, indem man die TAB-Taste drückt.

Dazu habe ich das OnKeyDown-Event benutzt und die VK_TAB-Taste abgefragt und eine neue Numerierungsebene begonnen. Doch diese wird nicht angezeigt. Der TAB wird zwar ausgeführt, der Caret springt weiter, aber keine neue Ebene erscheint.

Mein Ziel ist es, die Aufzählung annähernd wie bei Word aufzubauen. Ist das irgendwie möglich?

Danke

quendolineDD 26. Mai 2009 18:56

Re: Aufzählung in RichEdit
 
Zitat:

Ist das irgendwie möglich?
Ja.

FrankJ28 26. Mai 2009 19:00

Re: Aufzählung in RichEdit
 
na das ist ja hilfreich

TheMiller 26. Mai 2009 19:04

Re: Aufzählung in RichEdit
 
Sehe ich auch so. Deswegen schweige ich grad ;)

Hab in der MSDN mal die Struktur von TParaformat2 nachgeschlagen. Das steht ein bissl mehr erklärt, was die TabStops angeht. Aber so ganz habe ich es noch nicht hinbekommen.

quendolineDD 26. Mai 2009 19: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 19: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 19: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 19: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 19:58

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

TheMiller 26. Mai 2009 20: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 20: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 22: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 26. Mai 2009 23: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 04:36

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

TheMiller 27. Mai 2009 19:05

Re: Aufzählung in RichEdit
 
Hm... da trat bei mir der gleiche "Fehler" auf. Aber nunja...

Mich würde jetzt noch interessieren, ob ich mir auch ein eigenes Nummerierungsformat erstellen kann. Ich habe dazu nichts gefunden. Und zwar hätte ich gerne folgende Ebenen:

Code:
A.
   I.
      1.
         a.
           aa.
             aaa.
               (1)
                  (a)
Ich finde dazu leider keine Optionen, wo ich das Einstellen könnte.

Danke

quendolineDD 27. Mai 2009 19:13

Re: Aufzählung in RichEdit
 
Indem du wNumberingStyle auf $100 stellst, bekommst du die Werte in Klammern. Steht auch alles in der MSDN :roll:

TheMiller 27. Mai 2009 19:17

Re: Aufzählung in RichEdit
 
Ja, das habe ich schon gesehen. Doch was ist mit meinem Ebenen und der Anzahl meinen Ebenen.

Zitat:

//0 no numbering or bullets
//1 (PFN_BULLET) uses bullet character
//2 Uses Arabic numbers (1, 2, 3, ...).
//3 Uses lowercase letters (a, b, c, ...).
//4 Uses uppercase letters (A, B, C, ...).
//5 Uses lowercase Roman numerals (i, ii, iii, ...).
//6 Uses uppercase Roman numerals (I, II, III, ...).
Mir scheint 7 bzw. 8 (Unicode-Zeichen) die maximale Anzahl der Ebenen zu sein. Außerdem kann ich mit wNumberingStyle / wNumberingStart kein "aa" bzw. "aaa" setzen, oder?

quendolineDD 27. Mai 2009 19:20

Re: Aufzählung in RichEdit
 
wNumberingStyle definiert doch nur, ob die Absätze geklammert, punktiert oder sonst was werden. Was als Absatznummer angezeigt wird stellst du doch woanders ein.
Word hat auch nicht mehr ebenen und fängt dann wieder von vorne an.

TheMiller 27. Mai 2009 19:24

Re: Aufzählung in RichEdit
 
Ja da hast du recht. Das wird in wNumbering eingestellt. Doch darunter steht folgendes:

Zitat:

fmt.wNumbering := ebene;
//0 no numbering or bullets
//1 (PFN_BULLET) uses bullet character
//2 Uses Arabic numbers (1, 2, 3, ...).
//3 Uses lowercase letters (a, b, c, ...).
//4 Uses uppercase letters (A, B, C, ...).
//5 Uses lowercase Roman numerals (i, ii, iii, ...).
//6 Uses uppercase Roman numerals (I, II, III, ...).
//7 Uses a sequence of characters beginning with the Unicode
// character specified by the wNumberingStart member.
Ich kann nun also zwischen den Werten 0-7 auswählen. Aber wie definiere ich dort meine "aaa"-Ebene?

Ich dachte an wNumbering = 7 (für Unicode) und dann wNumberingStart:='aaa', aber wNumberingStart ist eine Integer-Variable.

quendolineDD 27. Mai 2009 19:33

Re: Aufzählung in RichEdit
 
Oder du schaust dir an in welcher Ebene 'aaa' ist, wenn du bei 1 startest. Stellst dann deinen Start auf diese Ebene und den Typen auf lower-case.

TheMiller 27. Mai 2009 19:39

Re: Aufzählung in RichEdit
 
Ich galube ich habe mich i-wie falsch ausgedrückt. Es geht mir darum, dass ich nur zwischen den Typen 0-7 auswählen kann. Eine Ebene "a" kann ich erstellen, aber keine Ebene mit 3-a ("aaa"). Zumindest steht das nicht in der Liste der Typen dabei. Weist du was ich meine?

Gruppe 5 wäre Ideal, wenn ich nur festlegen könnte, dass er statt

Zitat:

i, ii, iii, ...
einfach

Zitat:

a, aa, aaa
anzeigt. Nur wo lege ich das fest?

quendolineDD 27. Mai 2009 20:01

Re: Aufzählung in RichEdit
 
Da das ganze auf Kompatibilität für Word usw. läuft, ist dies nicht so ohne möglich. Ich hab mal wNumbering := 3 und wNumberingStart := 26*26*26 gemacht, aber da kommt dann a''a raus.
Scheint dann nicht so zu gehen.
Du könntest aber immer noch es so machen, das du keine Absatzzeichen anzeigst und dann die Buchstaben selbst hinzufügst.

TheMiller 27. Mai 2009 20:04

Re: Aufzählung in RichEdit
 
Schade, aber das wäre auch eine Möglichkeit. Ich probier noch ein bisschen rum!

Vielen Dank!

TheMiller 29. Mai 2009 18:04

Re: Aufzählung in RichEdit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe hier nun (nach ziemlich viel getüftel), meine Gliederung recht schön und komfortabel hinbekommen. Man kann alles mit Tasten bedienen.

Code:
Nummerierung starten: Eingabe von "A."
Tiefer gliedern mit: Tab
Ebene hoch: [Backspace] DIREKT nach Gliederungspunkt.
Doch jetzt kommt ein neues Problem, welches ich nicht behoben bekomme:

Ich mache hier also toll eine Ebenen und habe zB folgenden Text:

Code:
A. Ebene 1
   I. Ebene 2
   II. Ebene 2
      1. Ebene 3
      2. Ebene 3
      3. Ebene 3
   I. Ebene 2 // <---- Hier liegt das Problem
A. Ebene 1 // <---- Und auch hier!
Ich hoffe, ich konnte es deutlich machen. Er beginnt wieder neu bei "1". Wie kann ich ihn merken lassen, bei was die Ebene aufgehört hat, bevor die Subebene angefangen wurde..?

Ich fang gleich an zu heulen... oder zu prügeln... aber hakuna matata ;)

Hier mal mein Quelltext... Es ist "nur" ein Übungs-Quelltext, also vielleicht nicht so sauber!

TheMiller 1. Jun 2009 10:54

Re: Aufzählung in RichEdit
 
Hm... hat niemand eine Idee, wie ich das lösen kann?

quendolineDD 1. Jun 2009 11:00

Re: Aufzählung in RichEdit
 
Eine Variante die mir eben einfiehl wäre, ein Record, welches für jede Ebene das TParaFormat2 speichert und bei einer unterebene selber eine "Unterebene" mit einem neuen Record erstellt. Dann kannst du immer schauen, anhand deines Einzugs, wo du weiter machen musst usw.

TheMiller 1. Jun 2009 11:06

Re: Aufzählung in RichEdit
 
Das habe ich mir auch schon gedacht und sogar angefangen zu programmieren

Delphi-Quellcode:
type TStartNumber = record
  re: TRichEdit;
  ebene: Integer;
  Start: Integer;
end;
Aber was ist, wenn der Benutzer von einer Aufzählung plötzlich mit dem Cursor in eine andere wechselt oder der Benutzer die Datei bearbeiten will?

Ich dachte an eine ID für jeden Paragraphen, aber ich kann da nichts an Eigenschaften etc. setzen. Die Idee an sich wäre die Lösung, aber soweit wie ich es jetzt bedacht habe, gilt sie "nur" für die aktuelle Bearbeitung einer aktuellen Aufzählung.

Außerdem wäre es problematisch, das Record / Array abzuändern, wenn der Benutzer zwischendrin noch eine neue Ebene einfügt.

Aber die Idee ist schon die Richtige... vllt. fällt dir noch was ein um die Idee wirklich umsetzen zu können. Danke schonmal


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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