Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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



BeitragVerfasst: Mi 23.08.17 13:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Slipstream
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 26
Erhaltene Danke: 5



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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



BeitragVerfasst: Do 24.08.17 10:28 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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



BeitragVerfasst: Fr 25.08.17 12:40 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure ReadRichPos1;
{ermitteln Pixel-Koordinaten von Zeile, Spalte der linken oberen Ecke im Richeditfeld.
 damit wird das Lineal in FiFormat synchronisiert}

const EM_GetScrollPos = WM_User + 221;
      EM_SetScrollPos = WM_User + 222;
var
  Koordinaten : TPoint;  { Pixel x=Spalte, y=Zeile}
begin with Form1 do begin
  SendMessage(Richedit1.Handle, EM_GetScrollPos, 0, lParam(@Koordinaten));
  Koordinaten.Y:=0;  //da Lineal einzeilig, Y auf Null halten
  SendMessage(Richedit2.Handle, EM_SetScrollPos, 0, lParam(@Koordinaten));
endend;

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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: So 27.08.17 18:43 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden volle Höhe Delphi-Quelltext
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:
// uses RichEdit;
procedure TForm1.FormCreate(Sender: TObject);
var
fmt: TParaformat2;
begin
FillChar(fmt, SizeOf(fmt), 0);
fmt.cbSize := SizeOf(fmt);
// The PARAFORMAT2 structure is used to set the numbering style.
// This is done through the following structure members:
fmt.dwMask := PFM_NUMBERING or PFM_NUMBERINGSTART or PFM_NUMBERINGSTYLE or
PFM_NUMBERINGTAB;
// Set the following values (bitwise-or them together) to identify
// which of the remaining structure members are valid:
// PFM_NUMBERING, PFM_NUMBERINGSTART, PFM_NUMBERINGSTYLE, and PFM_NUMBERINGTAB
fmt.wNumbering := 2;
//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.
fmt.wNumberingStart := 1;
// Starting value for numbering.
fmt.wNumberingStyle := $200;
// Styles for numbering:
// 0 : Follows the number with a right parenthesis. 1)
// $100 : Encloses the number in parentheses. (1)
// $200 : Follows the number with a period. 1.
// $300 : Displays only the number. 1
// $400 : Continues a numbered list without applying the next number or bullet.
// $8000 : Starts a new number with wNumberingStart.
fmt.wNumberingTab := 500//1440 div 4;
// Minimum space between a paragraph number and the paragraph text, in twips

RichEdit1.Perform(EM_SETPARAFORMAT, 0, lParam(@fmt));
end;
Einloggen, um Attachments anzusehen!
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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?