![]() |
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. |
Re: Aufzählung in RichEdit
Moin FriFra,
schau Dir mal im PSDK die Messages EM_SETPARAFORMAT/EM_GETPARAFORMAT an. |
Re: Aufzählung in RichEdit
Hi!
Es gibt da die Eigenschaft Richedit1.Paragraph.Numbering:=nsbullet; dann geht das! Ciao fkerber |
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 |
Re: Aufzählung in RichEdit
|
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 ! |
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 |
Re: Aufzählung in RichEdit
Zitat:
|
Re: Aufzählung in RichEdit
na das ist ja hilfreich
|
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. |
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. |
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] |
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...)
|
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
|
Re: Aufzählung in RichEdit
Dann musst du natürlich abfragen :)
|
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. |
Re: Aufzählung in RichEdit
Keine Ahnung wo dein Problem liegt.
Folgendes funktioniert bei mir einwandfrei
Delphi-Quellcode:
Grüße
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; |
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:
Setze ich "WantTabs" auf False, führt er alles richtig aus, verlässt aber logischerweise auch das Richedit.
1. Hallo
A. Wie I. Geht aa. Es aaa. Dir? 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. |
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:
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 ^^
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; So, ich verabschiede mich jetzt mal mit einem großem "Dankeschön"... Dankeschön und Tschüss |
Re: Aufzählung in RichEdit
Ich bin dies umgangen indem ich OnKeyUp genutzt habe.
|
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:
Ich finde dazu leider keine Optionen, wo ich das Einstellen könnte.
A.
I. 1. a. aa. aaa. (1) (a) Danke |
Re: Aufzählung in RichEdit
Indem du wNumberingStyle auf $100 stellst, bekommst du die Werte in Klammern. Steht auch alles in der MSDN :roll:
|
Re: Aufzählung in RichEdit
Ja, das habe ich schon gesehen. Doch was ist mit meinem Ebenen und der Anzahl meinen Ebenen.
Zitat:
|
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. |
Re: Aufzählung in RichEdit
Ja da hast du recht. Das wird in wNumbering eingestellt. Doch darunter steht folgendes:
Zitat:
Ich dachte an wNumbering = 7 (für Unicode) und dann wNumberingStart:='aaa', aber wNumberingStart ist eine Integer-Variable. |
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.
|
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:
Zitat:
|
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. |
Re: Aufzählung in RichEdit
Schade, aber das wäre auch eine Möglichkeit. Ich probier noch ein bisschen rum!
Vielen Dank! |
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:
Doch jetzt kommt ein neues Problem, welches ich nicht behoben bekomme:
Nummerierung starten: Eingabe von "A."
Tiefer gliedern mit: Tab Ebene hoch: [Backspace] DIREKT nach Gliederungspunkt. Ich mache hier also toll eine Ebenen und habe zB folgenden Text:
Code:
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..?
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 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! |
Re: Aufzählung in RichEdit
Hm... hat niemand eine Idee, wie ich das lösen kann?
|
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.
|
Re: Aufzählung in RichEdit
Das habe ich mir auch schon gedacht und sogar angefangen zu programmieren
Delphi-Quellcode:
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?
type TStartNumber = record
re: TRichEdit; ebene: Integer; Start: Integer; end; 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