2010-05-19 43 views
1

J'ai implémenté une recherche en utilisant TFindDialog sur mon formulaire. Tout fonctionne bien, sauf que je ne peux pas trouver un moyen d'imiter le comportement "F3 - Find Next" comme dans le Bloc-notes. Une fois que vous avez entré une chaîne de recherche, appuyez sur F3 pour trouver l'instance suivante sans ouvrir la boîte de dialogue de recherche.Implémenter F3 Trouver le suivant en utilisant TFindDialog

Cordialement, Pieter.

+1

Je suis un peu confus. Vous avez codé le F3 vous-même, n'est-ce pas? Donc, c'est à vous de voir si la boîte de dialogue est affichée. –

+0

Désolé, ce n'est pas clair. J'ai fait la partie initiale pour commencer la recherche en utilisant le TFindDialog. Je voudrais continuer une recherche en appuyant sur une touche telle que F3, pour continuer la recherche sans rouvrir le formulaire SearchDialog. –

Répondre

1

Voici un croquis comment on pourrait le faire:

type 
    TForm1 = class(TForm) 
    FindDialog1: TFindDialog; 
    procedure FindDialog1Find(Sender: TObject); 
    procedure SearchFind1Execute(Sender: TObject); 
    procedure SearchFindNext1Execute(Sender: TObject); 
    private 
    FSearchText: string; 
    procedure Search; 
    end; 

et

procedure TForm1.Search; 
begin 
    // Do the real searching here... 
    MessageBox(Handle, PChar('Looking for "' + FSearchText + '".'), nil, 0); 
end; 

procedure TForm1.SearchFind1Execute(Sender: TObject); 
begin 
    // Triggered by Ctrl-F 
    FindDialog1.FindText := FSearchText; 
    FindDialog1.Execute; 
end; 

procedure TForm1.SearchFindNext1Execute(Sender: TObject); 
begin 
    // Triggered by F3 
    if FSearchText = '' then 
    SearchFind1.Execute 
    else 
    Search; 
end; 

procedure TForm1.FindDialog1Find(Sender: TObject); 
begin 
    // Triggered by button click in FindDialog1 
    FSearchText := FindDialog1.FindText; 
    Search; 
end; 
+0

Cela fonctionne. J'ai seulement besoin d'appeler à nouveau la méthode 'Find' du FindDialog. J'ai également besoin de définir 'FindDialog1.Options: = FindDialog1.Options + [frFindNext];'. Je vous remercie. –

+1

'Find' est protégé (au moins dans D2007). Comment l'appelez-vous? Peut-être que c'est une meilleure idée de factoriser le "vrai" code de recherche dans une méthode que vous appelez à la fois dans votre gestionnaire OnFind et le gestionnaire de clic F3. Il n'y a pas besoin de jouer avec frFindNext etc. (Disclaimer: tous non testés :-)) –

+0

Le FindDialog a une méthode OnFind. C'est là que tout le code va faire la recherche. –

0

Alternativaly vous pouvez essayer les actions standard TSearchFind/TSearchFindNext. Cependant je ne les ai pas essayés moi-même, donc je ne peux pas dire comment ils fonctionnent bien dans la pratique.