Autor Beitrag
Schorschie
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 22.05.09 14:45 
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...


ausblenden 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:= SendMessage(Form3.RichEdit1.Handle, EM_LINEFROMCHAR, Form3.RichEdit1.SelStart, 0);

  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
martin300
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Fr 22.05.09 17:12 
Hallo,
es gibt eine fertige Komponente. Mit dieser wird der gesuchte Text gleich markiert.
siehe:
www.delphi-treff.de/...FindDialog%20suchen/
Schorschie Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 22.05.09 23:37 
Hallo,

warum nimmst du nicht das SendMessage aus der auskommentierten Codezeile,
das sollte funktionieren :gruebel:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Schorschie Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 23.05.09 15:12 
Hilft Dir das hier vielleicht weiter?:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Schorschie Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 25.05.09 20:35 
user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
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