IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Inverser le sens de recherche dans RichEdit


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Inverser le sens de recherche dans RichEdit
    Bonjour,

    N'ayant pas trouvé de solution sur le forum, je pose ma question ici

    J'ai un RichEdit et j'ai implémenté la recherche de texte via une boite de dialogue FindDialog
    Dans la boite de dialogue FindDialog, je m'intéresse aux deux boutons radio de recherche vers le haut et vers le bas.

    Je sais chercher une occurrence de texte dans le sens descendant, mais si je veux inverser la recherche en remontant vers le début du texte depuis la position courante... là je coince.

    Nota :
    StartPos = position courante du curseur dans le texte ou du texte sélectionné
    ToEnd = texte restant depuis la position du texte sélectionné ou du curseur jusqu'à la fin du texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (frDown in FindDialog.Options) then
       FoundAt := RichEdit.FindText(FindDialog.FindText, StartPos, ToEnd, Options)
    else
       FoundAt := RichEdit.??? quoi faire ???;
    Avez-vous une idée ?

    Merci pour votre aide éventuelle.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Cela est surprenant mais la méthode FindText de TCustomRichEdit effectue systématiquement une recherche vers la bas.

    Alors autant effectuer la recherche par soi-même.
    A placer dans l'événement OnFind du FindDialog.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    40
    41
    42
    43
    44
    45
    uses RichEdit, CommDlg;
     
    procedure TForm1.FindDialog1Find(Sender: TObject);
    var
      FoundAt: Integer;
      Find: TFindText;
      Flags: Integer;
    begin
      Flags := 0;
      with FindDialog1 do
      begin
        if frDown in Options then
          Flags := Flags or FR_DOWN;
        if frMatchCase in Options then
          Flags := Flags or FR_MATCHCASE;
        if frWholeWord in Options then
          Flags := Flags or FR_WHOLEWORD;
        Find.lpstrText := PChar(FindText);
      end;
     
      with RichEdit1, Find.chrg do
      begin
        if FR_DOWN and Flags <> 0 then
        begin
          cpMin := SelStart + SelLength;
          cpMax := Length(Text);
        end
        else
        begin
          cpMin := SelStart;
          cpMax := 0;
        end;
      end;
     
      FoundAt := SendStructMessage(RichEdit1.Handle, EM_FINDTEXT, Flags, Find);
      if FoundAt <> -1 then
        with RichEdit1 do
        begin
          SetFocus;
          SelStart := FoundAt;
          SelLength := Length(FindDialog1.FindText);
        end
      else
        Beep;
    end;
    @+ Claudius

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Merci Cl@udius

    Je vais tester cela...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Malheureusement, dans ton code tu utilises la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FoundAt := SendStructMessage(RichEdit.Handle, EM_FINDTEXT, Flags, Find);
    Le compilateur bloque sur cette fonction.
    [Erreur] Discussions.pas(833): Identificateur non déclaré : 'SendStructMessage'

    -----

    Si je remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FoundAt := SendMessage( RichEdit.Handle, EM_FINDTEXT, Flags, LongInt(@Find));
    La compilation fonctionne.
    La recherche descendante fonctionne, mais la recherche ascendante ne fonctionne pas... FoundAt est toujours à -1 même si le texte à trouver existe en amont de la position courante dans le RichEdit

    Merci pour ton aide

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 374
    Points : 3 150
    Points
    3 150
    Par défaut
    @ Claudius

    j'ai retrouvé ce post car j'avais le même problème (recherche vers le haut).

    Chez moi ton code fonctionne à merveille (en mettant les bons uses, avec Delphi XE) . La doc de Delphi est mal documentée sur FindDialog.

    Je pense que ton code mériterait d'être dans la FAQ

    @+

    Charly

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Charly

    Pour info, quoicéty ces uses sous XE ?
    Cela peut être intéressant cette info.

    @+ Claudius

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 374
    Points : 3 150
    Points
    3 150
    Par défaut
    Salut

    Je voulais simplement dire que j'ai bien ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uses RichEdit, CommDlg;
    et ça fonctionne bien en Delphi XE.

    J'ai testé en D7 et effectivement la fonction SendStructMessage n'est pas reconnue

    @+

    Charly

    PS : il manque un ; à la fin de la ligne 25 de ton code

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    PS : il manque un ; à la fin de la ligne 25 de ton code
    Corrigé, merci

Discussions similaires

  1. inverser sens d'ecriture dans une datagridview
    Par sisi87 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/07/2010, 14h28
  2. Réponses: 5
    Dernier message: 16/05/2007, 23h25
  3. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57
  4. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10
  5. recherche dans un document xml via DOM
    Par ndoye_zaff dans le forum APIs
    Réponses: 5
    Dernier message: 11/06/2003, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo