Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Wie Richedit Klick-Position ermitteln, nach Focus-Erhalt?
Schorschie - Fr 22.05.09 14:45
Titel: Wie Richedit Klick-Position ermitteln, nach Focus-Erhalt?
Hallo,
Ich habe ein Memo mit einem Text in Form1. Ich habe eine Suchfunktion eingebaut, die in einem weiteren Formular die gefundenen Textstellen in als Liste in ein RichEdit-Feld schreibt.
Ich möchte folgendes erreichen:
Der Anwender erhält in dem Ergebnisfenster z.B. 3 Zeilen mit den jeweiligen Fundstellen. Er klickt auf eine dieser Zeilen und in dem Memo wird dann die Fundstelle markiert. Klickt der Anwender auf eine andere Zeile in dem Ergebnisfenster, soll im Memo diese Fundstelle markiert werden.
Jetzt zum eigentlichen Problem:
Das Ganze funktioniert genau einmal, ich erhalte die angeklickte Spalte aus der Ergebnisliste(Richedit). Die gewünschte Markierung wird im Memo angezeigt.
Wenn ich jetzt eine andere Zeile in der Ergebnisliste anklicke, wird zwar wieder die MousUp-Routine angesprochen, aber der Cursor befindet sich noch in der vorherigen Zeile, deshalb wird die gleiche Fundstelle wieder angesprungen.
Wenn ich vorher mit der Maus auf Form3 klicke, so dass das Formular3 bereits den Focus hat und danach erst in das Richedit-Feld, funktioniert alles wunderbar. Dann wird durch den Klick auf RichEdit auch der Cursor in die neue Zeile gesetzt. Ich möchte mir aber diesen zusätzlichen Klick gerne sparen.
Also habe ich irgendwo einen Denkfehler...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm3.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var z:longint;
begin
z:=(Form3.Richedit1.CaretPos.y); showmessage('zeile '+inttostr(z) +' angeklickt');
Form1.Memo1.SelStart := Ergebnis[z].iSelstart; Form1.Memo1.SelLength := length(Edit1.text); Form1.Memo1.Setfocus;
end; |
Achso, das mit dem Richedit Feld habe ich deshalb gemacht, weil ich das Suchergebnis noch formatieren möchte, zum Beispiel: suche nach "Fundstelle" ergibt:
Zeile 3: hier wurde die
Fundstelle entdeckt
Zeile 27:
Fundstellen gibt es jede Menge
Zeile 100: manche
Fundstellen sind schwer zu durch
Ich bin für jeden Tip dankbar.
Gruß
Schorschie
Schorschie - Fr 22.05.09 19:57
Danke, martin300,
ich habe es mal testweise eingebaut. Leider ist es so gestrickt, dass der FindDialog geschlossen wird, wenn kein Treffer mehr gefunden wird.
Und er sucht nur nach unten, nie nach oben, der Radiobutton aus dem Dialog scheint nicht ausgewertet zu werden...
Naj, muss ich noch weiter suchen.
Gruß
Schorschie
Lannes - Fr 22.05.09 23:37
Hallo,
warum nimmst du nicht das SendMessage aus der auskommentierten Codezeile,
das sollte funktionieren :gruebel:
Schorschie - Sa 23.05.09 12:52
Lannes,
das habe ich bereits versucht, dashalb steht es da noch, leider ohne Erfolg. Das Verhalten ist auch so wie oben beschrieben.
Der erneute Mausklick auf das RichEdit Feld setzt nur den Focus auf das Richedit. Die SendeMessage übergibt dann jedoch die Cursorposition des vorherigen Klicks.
Beispiel:
erster Klick auf die erste Zeile übergibt korrekt die erste Zeile, Focus geht ins Memo, Markierung wird angezeigt. Jetzt klicke ich auf die dritte Zeile im RichEdit, der Focus geht aufs Richedit, jedoch wird der Cursor nicht auf die dritte Zeile gesetzt sondern steht noch in der ersten Zeile. Deshalb übergibt SendMessage jetzt wieder die erste Zeile :(
Gruß
Schorschie
Nachtrag:
Ich habe gerade mal das RichEdit gegen ein Memo ausgetauscht, damit funktioniert es einwandfrei. Warum das RichEdit hier ein anderes Verhalten an den Tag legt, ist mir schleierhaft. Egal, ich werde es mit dem Memo relaisieren, auch wenn ich dann die Fundstellen nicht fett markieren kann :shock:
ffgorcky - Sa 23.05.09 15:12
Hilft Dir das hier vielleicht weiter?:
Delphi-Quelltext
1: 2:
| if RichEdit1.SelStart=0 then MessageBox(Form1.WindowHandle,'Soll wirklich ganz vorne angefangen werden?','Keine extra Zeile ausgewählt!',MB_OK); |
Wobei Du ja dann entscheiden müsstest, ob Du eine MB_YesNo draus machst, oder die Frage nur als Hinweis umschreibst.
Lannes - So 24.05.09 11:20
Hallo,
die Zeile zum fokussieren des Memo kann entfallen, es muss doch dort nicht den Focus bekommen.
Nimmst Du die Zeile raus ist Dein Problem keins mehr.
Damit die Fundstelle markiert(sichtbar) wird reicht es aus die Eigenschaft Memo.Hideselection im OI auf True False zu setzen.
//Edit: True durch False ersetzt
Schorschie - Mo 25.05.09 20:35
Lannes hat folgendes geschrieben : |
Hallo,
die Zeile zum fokussieren des Memo kann entfallen, es muss doch dort nicht den Focus bekommen.
Nimmst Du die Zeile raus ist Dein Problem keins mehr.
Damit die Fundstelle markiert(sichtbar) wird reicht es aus die Eigenschaft Memo.Hideselection im OI auf True False zu setzen.
//Edit: True durch False ersetzt |
Yep, das ist der Schlüssel zu meinem Glück. :lol: Für die Ergebnisliste als Memo funktioniert es, dann kann ich jetzt nochmal mit dem RichEdit experimentieren.
Vielen Dank, Lannes
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!