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

Langage Delphi Discussion :

autre fonction que pos?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut autre fonction que pos?
    Bonjour,

    Grace à la fonction pos, je compare si une chaine est présente dans un memo, puis si celle-ci est présente, alors je la récupère.

    Le problème, c'est que la façon dont je procède, ne récupère pas de façon préçise, je m'explique:

    Voici par exemple le contenue de mon memo qui change aleatoirement
    Memo1
    Une_Chaine
    test
    essai
    Si je compare par exemple la lettre u dans mon Memo, et bien la fonction pos me retourne une valeur alors que u n'est que la premiere lettre de Une_Chaine dans mon memo.

    Je souhaiterais que pour pos me retourne une valeur uniquement si la Chaine complete est comparer.
    Voici un morceau de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    longueur := SendMessage(ll, WM_GETTEXTLENGTH, 0, 0); // recupère dans variable longueur le contenue de ll
      SetLength(texte, longueur);   // On demande de la place
      SendMessage(ll, WM_GETTEXT, longueur -1, LParam(PChar(texte))); //on récupere le texte moins une lettre// elle + 1 pour 0#
      Edit1.Text:= texte; // Ajoute le contenue de texte dans memo1
     if pos(Edit1.Text, memo1.Text)>0 then begin    //(mot, dans la source)
      ComboBox1.Text:= Edit1.Text;
      SendMessage(ll, WM_SETTEXT, 0, 0)
    end;
     end;
    Merci pour aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Que veux dire la Chaine Complète ?
    si c'est ce que je pense, il te suffit de cherche "u " (u plus espace)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    salut ShaiLeTroll

    En faite, à l'aide un timer, je recupère des chaines dans un memo, donc en temps réel.
    Lorsque je saisi par exemple dans un edit la chaine qui figure dans le memo, celle-ci doit être copié par exemple dans un combobox (à l'aide d'une condition, que celle-ci figure dans le memo).
    Mais voilà, comme c'est du temps réel, lorsque je saisi ne serais-ce qu'une lettre, celle-çi est copiée.
    Moi, ce que je souhaite, c'est que la chaine soit récupérer uniquement que si je là saisis entièrement.
    Je ne suis pas sûr, mais je pense que ce n'est pas possible avec la fonction Pos...
    Enfaite, il me faudrais une fonction assez limiter du type:
    la chaine entière alors vrai sinon faux.
    je sais, c'est assez compliquer à comprendre

    Ps: regarde le code que j'ai poster çi dessus.
    ce que je souhaite faire, c'est rechercher un mot dans un memo, mais le mot uniquement.
    car avec Pos, si je tape une partie de ce mot, il me revoie une valeur autre que 0, et ça, c'est pas ce que je recherche.
    merci

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Pos('mot', Memo.Lines.Text) > 0 then
    tu vas forcément avoir le premier "mot" dans un mot comme "moteur" mais tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Pos('mot ', Memo.Lines.Text) > 0 then
    , il ne te renverra pas de chaine dans ce cas, comme ça tu détecte les mots entiers, mais il faut gérer aussi le mot en fin de ligne, donc double Pos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Pos('mot' + ' ', Memo.Lines.Text) > 0) or (Pos('mot' + #13, Memo.Lines.Text) > 0) then
    il semble évident qu'il soit nécessaire de pondre une fonction plus pertinente ... ou essayer PosEx, en bouclant, pour ignorer "moteur" mais trouvé un éventuel "mot" plus loin
    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
     
    MemoText :=  Memo.Lines.Text;
    repeat
      K:= PosEx('mot',MemoText , IndexDepart);
      if K > 0 then
      begin  
        if K + Length('mot') <= Length(MemoText) then 
        begin
          if MemoText[K + Length('mot')] <= ' ' then // donc espace, retour charriot, et autre caractère non imprimable qui désigne une fois de mot
            condition := True
          else
            inc(IndexDepart, Length('mot'));
         end
         else
           condition := True;
    until condition or (IndexDepart > Length(MemoText));
     
    if condition then begin    //(mot, dans la source)
      ComboBox1.Text:= Edit1.Text;
      SendMessage(ll, WM_SETTEXT, 0, 0)
    end;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Re ShaiLeTroll

    J'ai essayer les 3 cas de figures que tu proposes, hélas, celà ne fonctionne pas, en tous cas chez moi
    Les 2 premières, avec l'espace ne convient pas du tous, il copie tous ce que je souhaite comparer dans le memo, c'est comme si qu'aucune condition n'est présente...
    Et pour ce qui est de la dernière avec PosEx , c'est pareil
    Voilà, merci quand même pour tes efforts precieux

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Je ne suis pas sûr de comprendre ce que tu fais.

    Dans ton mémo, tu as toujours un seul et unique mot par ligne ? J'ai l'impression que c'est une liste de mot.

    Si c'est le cas, il te suffit de tester ligne par ligne si elle correspond au mot chercher.

    Sinon, dans le cas général tu ne t'en sortiras pas avec des Pos. La première chose à faire, c'est de définir ce qu'est un mot, et surtout les caractères qui peuvent séparer deux mots. Il y a évidemment l'espace, mais est-ce tout ? Quid de "'.!?," par exemple...

    Ensuite, je te suggérerais plutôt d'écrire un parseur simple avec un automate d'états finis. Tu t'en serviras pour découper le texte du mémo en une liste de mots. Puis chaque fois que tu détectes un mot, tu peux tester s'il correspond au mot recherché...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Bonjour Franck SORIANO

    Dans ton mémo, tu as toujours un seul et unique mot par ligne ? J'ai l'impression que c'est une liste de mot.
    c'est exactement ça, tu as compris
    Pour être exacte, c'est pour moi faire un logiciel de modération de chat.
    Donc, je récupère tous les pseudo dans un memo.
    Et si par exemple ma variable contient le pseudo qui figure dans le memo, alors je peut par exemple ajouter le pseudo à mon combobox grace à la variable.

    Sinon, dans le cas général tu ne t'en sortiras pas avec des Pos
    je me suis rendu compte de cela, c'est pour ça que tous est dans le titre, je recherche autre chose que la fonction pos.

    je te suggérerais plutôt d'écrire un parseur simple avec un automate d'états finis. Tu t'en serviras pour découper le texte du mémo en une liste de mots. Puis chaque fois que tu détectes un mot, tu peux tester s'il correspond au mot recherché...
    Je vais essayer de me concentrer sur les parseurs comme tu le suggère dans ce cas
    merci

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Re,

    Bon finalement je classe ce topic en résolue car j'ai trouver la solution mais avec une listbox.

    Voilà, merci à vous deux pour votre aide

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    tu pouvais le faire aussi avec la propriétés Lines du TMemo qui fonctionne globalement comme la propriété Items du TListBox, ... effectivement, j'avais compris l'inverse, rechercher une chaine dans le TMemo en fonction d'un TEdit, ...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    re ShaiLeTroll
    tu pouvais le faire aussi avec la propriétés Lines du TMemo qui fonctionne globalement comme la propriété Items du TListBox, ...
    Merci pour cette précision supplémentaire, j'en prend note.

    J'ai consulter l'aide delphi aussi, et j'ai trouver ça, tres interressant

    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
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      MyList: TStringList;
      Index: Integer;
    begin
      MyList := TStringList.Create;
      try
        MyList.Clear;
        MyList.Add('essai');
        MyList.Add('yannfrance');
        MyList.Add('ici');
        MyList.Sort;   { Find will only work on sorted lists! }
        if MyList.Find(Edit1.Text, Index) then
        begin
          ComboBox1.Text:= MyList[index];
        end;
      finally
        MyList.Free;
      end;
    end;
    Voilà, merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] PyQt4: supprimer un item d'un QListWidget dans une autre fonction que celle où il a été créé
    Par nilslauwers dans le forum Bibliothèques tierces
    Réponses: 16
    Dernier message: 20/05/2015, 13h52
  2. Réponses: 1
    Dernier message: 16/11/2014, 18h46
  3. Réponses: 1
    Dernier message: 26/01/2010, 15h40
  4. Function VBA recopiant un range à un autre endroit que la fonction
    Par oliv1105 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/07/2008, 15h15
  5. [VS 2005] autre fonction que strcmp?
    Par Cirdan Telemnar dans le forum Visual C++
    Réponses: 3
    Dernier message: 05/06/2006, 13h13

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