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

 Delphi Discussion :

Recherche d'une chaine de texte


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 10
    Points
    10
    Par défaut Recherche d'une chaine de texte
    Bonjour,

    J'écris un petit soft pour automatiser l'ajout d'une ligne dans le fichier "host" de Windows pour réorienter les membres d'une association vers un site web en développement car le nom de domaine n'est pas encore acquis.

    A l'ouverture de la fenêtre principale, je réalise quelques tests dont le présence ou non de la ligne à ajouter. pour cela j'utilise le code trouvé dans ce post et qui fonctionne (testé séparemment).

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var posM,posL,i,j:integer;
        trouve:boolean;
        NumeroLigne:integer;
    begin
    for i:=0 to Memo1.Lines.Count do
    begin
    posL:=pos(Edit1.Text,Memo1.Lines[i]);
    if posL <>0 then begin
    posM:=0;
    for j:=0 to i-1 do
    posM:=posM+length(Memo1.Lines[j]);
    posM:=posM+(i*2);
    posM:=posM+posL-1;
    Memo1.SetFocus;
    Memo1.SelStart:=posM;
    Memo1.SelLength:=length(Edit1.Text);
    trouve:=true;
    ///////////// ici on recherche le le numéro de ligne /////////
     NumeroLigne := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0);
      edit2.Text:=(inttostr(NumeroLigne)); //Edit2: affiche le numéro de la ligne
    /////////////////////
    break;
    end;
    if trouve=false then
    Edit2.Clear;
    end;
    end;
    J'incorpore ce source dans mes tests et il ne me donne pas le numéro de ligne lorsque la ligne est ajouté à la main au host (donc bien présente).
    je vous mes le code de mes test car je suppose une mauvaise structure de mes conditions mais je tourne en rond depuis le W-E dernier alors que l'un d'entre vous verra certainement ma mauvaise logique et pourra me remettre sur le bon chemin.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    Procedure TForm1.SearchHost_OnShow(Sender: TObject);
      var
      Import : String;
      FImport : TextFile;
      FHost : TextFile;
      StgImport : String;
      StgHost : String;
      //
      posM,posL,i,j:integer;
      trouve:boolean;
      NumeroLigne:integer;
      Yes : integer;
      begin
        Yes := 0;
        posM:=0;
        posL:=0;
        i:=0;
        j:=0;
        //OS = JvComputerInfoEx1.ProductName + ' - ' + JvComputerInfoEx1.VersionCSDString:
        JvLabel1.Caption := 'Votre version de Windows est ' + JvComputerInfoEx1.OS.ProductName + ' - ' + JvComputerInfoEx1.OS.VersionCSDString + ' ( Build : ' + IntToStr(JvComputerInfoEx1.OS.VersionBuild) + ' )';
        //JvOSVersionInfo.
        JvMemo1.Clear; //Efface le contenu de Memo1
        JvLabel2.Caption := '';
        //Lecture du fichier import
        AssignFile(FImport,ExtractFilePath(Application.ExeName)+'import.txt');
        {$I-} //La vérification d'E/S est désactivée
        Reset(FImport);
        {$I+} //La vérification d'E/S est activée
        if IoResult=0 then //Renvoie l'état de la dernière opération d'E/S
           begin
     
           Readln(FImport,StgImport); //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
           JvLabel2.Caption := 'Lecture des données : ' + StgImport; //Affiche dans Memo1 le contenu de la variable Stg
           JvLabel3.Caption := 'Texte à ajouter : ' + StgImport;
           CloseFile(FImport);
     
           //Regarde si la ligne à ajouter est présente dans le fichier host.
           //Ouverture et lecture du fichier Host.
            AssignFile(FHost,JvComputerInfoEx1.Folders.System +'\drivers\etc\hosts');
           Reset(FHost);
             repeat //Repeter...
             Readln(FHost,StgHost); //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
             JvMemo1.Lines.Add(StgHost); //Affiche dans Memo1 le contenu de la variable Stg
             //JvRichEdit1.Lines.Add(StgHost);
             //AdvMemo1.Lines.Add(StgHost);
             until EOF(FHost);// ...jusqu'à ce que la position en cours du pointeur se trouve en fin de fichier
           CloseFile(Fhost);
           NumeroLigne :=0;
           RzGroupBox1.enabled := False;
           RZGroupBox2.Enabled := True;
     
     
           for i:=0 to JvMemo1.Lines.Count do
             begin
               posL:=pos(JvLabel2.Caption,JvMemo1.Lines[i]);
                 if posL <>0 then begin
                    posM:=0;
                    for j:=0 to i-1 do
                    posM:=posM+length(JvMemo1.Lines[j]);
                    posM:=posM+(i*2);
                    posM:=posM+posL-1;
                    JvMemo1.SetFocus;
                    JvMemo1.SelStart:=posM;
                    JvMemo1.SelLength:=length(JvLabel2.Caption);
                    trouve:=true;
                    ///////////// ici on recherche le le numéro de ligne /////////
                    NumeroLigne := SendMessage(JvMemo1.Handle,EM_LINEFROMCHAR,-1,0);
                    JvLabel4.Caption:=(inttostr(NumeroLigne)); //Edit2: affiche le numéro de la ligne
                    /////////////////////
                    break;
                  If NumeroLigne <>0 then
                  begin
                  //JvLabel4.Caption:= 'Ce texte apparait à la ligne '+ (inttostr(NumeroLigne))+ '. Souhaitez-vous le supprimer ?'; //Edit2: affiche le numéro de la ligne
                  RzGroupBox1.Enabled := False;
                  RzGroupBox2.Enabled := True;
                  JvBitBtn5.Enabled := False;
     
                  end
                  else
                  begin
                  //JvLabel4.Caption:= 'Ce texte n''a pas été trouvé. Souhaitez-vous l''ajouter ?';
                  RzGroupBox1.Enabled := True;
                  JvBitBtn2.Enabled := False;
                  RZGroupBox2.Enabled := False;
                  end;
     
           end
           Else
           begin
           JvLabel2.Caption := 'Fichier texte non trouvé. Contactez moi par mail, SVP';
           JvLabel3.Caption := '';
           JvLabel4.Caption := '';
           end;
     
         end;
       end;
      end;
    Merci de vos lumières. Je ne programme pas fréquemment et c'est pas comme le vélo, j'oublie vite les automatismes.
    François

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    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 456
    Points : 24 868
    Points
    24 868
    Par défaut
    l'ouverture d'un autre sujet citant celui-ci aurait été préférable

    Ton code est effectivement difficile à lire
    Refaire les indentations seraient une aide au débogage

    Pour des fichiers aussi court, un TStringList LoadFromFile sera bien plus simple qu'un textfile

    Divise ton code en plus fonction (chacune de 10-20 lignes), avec un nom pertinent que l'on s'y retrouve
    Renomme Memo1, JvMemo1, JvLabel4 avec des noms significatifs pour la même raison

    il manque le -1 dans ce for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i:=0 to JvMemo1.Lines.Count - 1 do

    il te faut fournir le nombre de caractère en paramètre en wParam
    -1 c'est l'emplacement du curseur
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    tout d'abord j'ai préféré déplacer la discussion plutôt que de poursuivre sur une déjà résolue, bien qu'un peu identique. @shailetroll j'ai déplacé avant de mémoriser l'emplacement de la discussion de départ
    Ensuite il aurait été bon d'indiquer votre version de Delphi car je ne sais pas si ce que je vais vous proposer compilera selon votre version.

    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
     
    // Delphi RIO
    procedure TForm38.Button2Click(Sender: TObject);
     
        // une fonction
        function lignedemonsite(monsite : String) : integer;
        var SL : TStringList;
            S : String;
            i : Integer;
        begin
          result:=-1;
          SL := TStringList.Create;
          try
           SL.LoadFromFile('C:\Windows\System32\drivers\etc\Hosts');
           for I := 0 to SL.Count-1 do
            begin
             S:=Trim(SL[i]);
             if not S.StartsWith('#') then  // oter commentaire
               begin
                 if S.Contains(monsite) then
                   begin
                    result:=i+1;
                    Break;
                   end;
               end;
           end;
          finally
            SL.Free;
          end;
        end;
    begin
    Memo1.Lines.LoadFromFile('C:\Windows\System32\drivers\etc\Hosts'); // afficher le fichier juste pour "voir"
    // et son usage
       ShowMessage(LignedemonSite('rhino').toString);
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    est tu sur que tu cherche la bonne valeur

    Label2.Caption := 'Lecture des données : ' + G_StrImport; //Affiche dans Memo1 le contenu de la variable Stg
    ...

    posL:=pos(Label2.Caption,Memo1.Lines[i]);
    je ne pense pas que dans ton fichier host tu ai 'Lecture des données : '

    sinon je trouve que tu te complique la vie juste pour connaitre le numero de ligne
    vu que tu parcourt le memo ligne a ligne au moment ou tu le trouve tu est forcement sur la ligne voulue

    autre truc la copie dan le mémo est inutile
    celui-ci peut se charger de la lecture du fichier

    cette simple ligne de code suffit
    Memo1.Lines.LoadFromFile('c:\windows\system32\drivers\etc\hosts')
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut Indentation
    Les réponses sur le code me semblent pertinentes et donc je n'en rajouterais pas. Simplement l'indentation c'est le fait de décaler le début de chaque ligne en fonction de son 'niveau' dans le code, ça ne change rien au résultat, ça améliore la lecture du code, donc la résolution de problèmes.
    Dans Delphi 10.3.1 il existe dans le menu 'Projet' le sous menu 'Formater les sources du projet' qui va indenter les lignes correctement pour tout le projet : à utiliser sans modération.

Discussions similaires

  1. [Batch] Recherche d'une chaine de caractères dans un fichier texte
    Par infomac dans le forum Scripts/Batch
    Réponses: 23
    Dernier message: 28/11/2019, 17h47
  2. [Débutant] recherche d'une chaine et la supprimer dans un texte
    Par smart_azo dans le forum C#
    Réponses: 2
    Dernier message: 15/03/2012, 08h54
  3. Réponses: 3
    Dernier message: 25/07/2006, 08h40
  4. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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