Autor |
Beitrag |
hRb
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Mi 23.08.17 12:01
Hallo Profis,
ich sehe gelegentlich Editoren die am Rand eine Zeilennummer (z.B. bei der Pascalentwicklung), andere am Kopf ein Spaltenlineal haben, was für mich noch interessanter wäre. Hat jemand eine Ahnung wie so etwas mit Richedit realisiert werden kann?
Dank in Voraus. hRb
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 23.08.17 13:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Slipstream
      
Beiträge: 26
Erhaltene Danke: 5
|
Verfasst: Mi 23.08.17 16:07
Man kann auch ein Richedit und eine Paintbox auf einem Frame positionieren und auf der Paintbox das Linieal zeichnen, sobald sich an den Grösseneinstellungen des Richedit was ändernt.
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Mi 23.08.17 21:06
Hallo Pascalfreunde,
1. auf TSynEdit bin ich im Forum schon einige mal gestoßen. Der Link zu TSynEdit führte zu einem kleinen "Irrgarten". Ich habe Datei SynEdit-SynEdit-2.0.9-beta.zip geladen, konnte aber das Programm nicht compilieren. Nach Studium verschiedener pas-Dateien scheint mir aber, dass ich mein gesamtes Programm verwerfen müsste um auf Basis Synedit neu aufzubauen. Da fehlt mir vermutlich das know how und die Zeit.
2. Meine bisherige Lösung für das Lineal sieht so aus, dass ich über meinem Richedit1 ein schreibgeschütztes weiteres (einzeiliges) Richedit2 (mit Lineal-Text: 0----5----10---...) gesetzt und die beiden Objekte horizontal synchronisiert habe. Das funktioniert beim Scrollen mit der Maus bestens (Dank Frühlingsrolle). In meiner Freude darüber habe ich nicht wahrgenommen, dass beim normalen Schreiben per Tastatur über den sichtbaren Bereich hinaus zwar mein Text in Richedit1 weiterrollt, nicht aber mein Lineal. Erst wenn ich wieder per Maus den Scrollbalken bewegte, ist die Anzeige wieder ok. Daher die Frage nach einer Alternative.
Anmerkung: ich verarbeite mit meiner Anwendung sehr häufig spaltenorientiert dargestellte Daten. Im Lineal kann ich per Bedienung an beliebiger Spalte eine Tabulator-Marke setzen und dann per Tab-Taste vorwärts/rückwärts springen.
beim gibt.
3. Ist denn das angesproche Draw-Ereignis eine Lösung um irgendwie den Scrollvorgang zu synchroniesieren. Dann könnte ich aber auch das Keyup-Ereignis verwenden. Im Forum gibt es die Procedure TForm1.RichEdWndProc(TMessage), die aber nur auf das Scroll-Ereignis anspricht. Wie könnte da die Lösung aussehen?
hRb
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Mi 23.08.17 22:40
Ich ergänze meine Frage:
Gibt es ein Windows-Ereignis das ausgelöst wird wenn der Cursor aus dem sichtbaren Bereich gerät?
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 24.08.17 10:28
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Fr 25.08.17 12:15
Hallo Frühlingsrolle,
das OnMouseLeave-Ereignis ist - zumindest ab XE3 -(mit dem ich neuerdings arbeite) standardmäßig vorhanden. Allerdings wird dieses Ereignis nur ausgelöst, wenn die Mause den Richeditbereich verlässt. Ich will aber erreichen, dass mein "Lineal" mitrollt, wenn über die Tastatur geschrieben wird und die Eingabe an den Rand kommt. Dann rollt nämlich der sichtbare Bereich im Richedit-Fenster nach rechts/links automatisch; ebenso die Scrollbar-Anzeige. Allerdings wird dabei keine Message Msg.Msg=WM_HSCROLL ausgelöst. (Dies erfolgt erst, - wie oben beschrieben - wenn ich mit der Mouse auf den Scrollbar klicke). Gesucht wird also das Ereignis, das dafür sorgt, dass der Cursor im Sichtbereich bleibt.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 25.08.17 12:40
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: So 27.08.17 17:26
Hallo Frühlingsrolle, Pascal-Freunde,
im Forum gesucht, nochmals nachgedacht (hilft immer), schon ist die Lösung da, die ich hiermit veröffentliche:
Nochmals kurz die Aufgabenstellung: über einem Richedit soll ein "Laufband" in Form eines Lineals sichtbar sein das mitrollt und zwar sowohl bei Bedienung über den ScrollBar, als auch bei normaler Texteingabe.
Vielleicht gibt es andere Lösungen. Ich habe eine gefunden, in dem ich die Pixel-Koordinaten der linken oberen Ecke im Richeditfeld abfrage. Davon werte ich nur den Point.X-Anteil (Spalte) aus und sende den Wert als Nachricht an Richedit2
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Procedure ReadRichPos1;
const EM_GetScrollPos = WM_User + 221; EM_SetScrollPos = WM_User + 222; var Koordinaten : TPoint; begin with Form1 do begin SendMessage(Richedit1.Handle, EM_GetScrollPos, 0, lParam(@Koordinaten)); Koordinaten.Y:=0; SendMessage(Richedit2.Handle, EM_SetScrollPos, 0, lParam(@Koordinaten)); end; end; |
Da ich selbst immer dankbar bin, wenn es nicht nur gute Ratschläge sondern auch eine fertige Lösung gibt, füge ich ein abgespecktes aber lauffähiges Beispiel bei.
Was ich jetzt noch nicht realisiert habe, ist das vertikale Lineal (Zeilenzahl). Hierzu müsste man nur die Y-Variable auswerten und an eine schmales Richedit3 senden (Align=alLeft), dann aber die Skalenanzeige auf die Länge Richedit1.Lines.count begrenzen. ich hoffe, mit dem Beispiel ist nun alles klar.
hRb
Einloggen, um Attachments anzusehen!
|
|
t.roller
      
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: So 27.08.17 18:43
hRb hat folgendes geschrieben : | Was ich jetzt noch nicht realisiert habe, ist das vertikale Lineal (Zeilenzahl). Hierzu müsste man nur die Y-Variable auswerten und an eine schmales Richedit3 senden (Align=alLeft), dann aber die Skalenanzeige auf die Länge Richedit1.Lines.count begrenzen. ich hoffe, mit dem Beispiel ist nun alles klar.
hRb |
So was Ähnliches:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TForm1.FormCreate(Sender: TObject); var fmt: TParaformat2; begin FillChar(fmt, SizeOf(fmt), 0); fmt.cbSize := SizeOf(fmt); fmt.dwMask := PFM_NUMBERING or PFM_NUMBERINGSTART or PFM_NUMBERINGSTYLE or PFM_NUMBERINGTAB; fmt.wNumbering := 2; fmt.wNumberingStart := 1; fmt.wNumberingStyle := $200; fmt.wNumberingTab := 500; RichEdit1.Perform(EM_SETPARAFORMAT, 0, lParam(@fmt)); end; |
Einloggen, um Attachments anzusehen!
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Di 29.08.17 00:33
So, jetzt habe ich eine komplette verbesserte Löung (auch fehlerbereinigt), inkl. vertikal + horizontal -Scroll
Auch rollen mit der Mause
Im Anhang neue Zip-Datei. Die Vorgängerversion vom 27.8.2017 vergessen
Das Beispiel t.roller schaue ich mir noch an.
Gruß hRb
Einloggen, um Attachments anzusehen!
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Di 29.08.17 23:25
Hallo t.roller,
1. das gezeigte Bild sieht bei Dir so aus wie auch von mir gewünscht - zumindest vertikal. Unter Umständen für die Zeilennummerierung die bessere (einfachre Lösung).
Allerdings:
2. kannst Du den Typ TParaformat2 deklarieren, ebenso die anderen Variablen? Ich kann Dein Beispiel nämlich nicht compilieren.
3. Das ganze angezeigt in einem Richedit? Was passiert denn mit den Nummern beim Speichern? (Lines.SaveToFile) ?
PS: Aus meinem beigefügten Programm (siehe vor) wurde hoffentlich die Aufgabenstellung und mein verwendetes Wort "Lineal" klar was gemeint war.
|
|
t.roller
      
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Mi 30.08.17 06:20
TParaformat2 ist in Winapi.RichEdit bzw. RichEdit enthalten.
Die Zeilennummern werden im RTF auch abgespeichert:
{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
{\colortbl ;\red0\green128\blue0;\red0\green255\blue0;\red0\green0\blue255;\red255\green0\blue0;}
\viewkind4\uc1\pard{\pntext\f0 1.\tab}{\*\pn\pnlvlbody\pnf0\pnindent500\pnstart1\pndec{\pntxta.}}
\cf1\i\f0\fs28 Create: 06:22:37.966\par
\cf2\i0{\pntext\f0 2.\tab} Show: 06:22:37.976\par
\cf3{\pntext\f0 3.\tab} Activate: 06:22:37.980\par
\cf4{\pntext\f0 4.\tab} ApplicationIdle: 06:22:37.997\par
\cf2{\pntext\f0 5.\tab}Das Lieblingsgetr\'e4nk der Europ\'e4er ist und bleibt Kaffee. Neben seinen vielf\'e4ltigen Aromen sch\'e4tzen die Menschen vor allem morgens die aufputschende Wirkung des Koffeins.\par
{\pntext\f0 6.\tab}\par
{\pntext\f0 7.\tab}Gerade auch im deutschsprachigen Raum liegt der Kaffee an der Spitze der Getr\'e4nke-Hitlisten. Noch beliebter ist das Aufgussgetr\'e4nk nur noch in den skandinavischen L\'e4ndern. Und das, obwohl er lange als wenig gesund galt. Doch diese Zeiten sind vorerst vorbei.\par
Einloggen, um Attachments anzusehen!
|
|
hRb 
      
Beiträge: 287
Erhaltene Danke: 12
|
Verfasst: Mi 30.08.17 12:16
Sorry, hatte uses Richedit übersehen.
Dennoch:
1. Die Nummerierung erfolgt nur solange, bis eine Leerzeile eingegeben wird (Return). Danach setzt die Funktion aus. Lässt sich aber vermutlich mit Nachdenken beheben.
2. Großer Nachteil: bei der copy-Funktion wird die Nummer auch übernommen. Damit ist diese Methode vermutlich nicht allgemein hilfreich.
3. Oder gibt es "Fein-Tuning"?
Vielleicht noch positiven/negativen Kommentar zu meiner Lösung?
|
|