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 :

Lecture d'un fichier texte et exécution de commandes - Structure if else


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Par défaut Lecture d'un fichier texte et exécution de commandes - Structure if else
    Bonjour à tous,


    Je suis en train d'écrire un petit interpréteur de commande provenant d'un fichier texte.

    Le fichier texte est donc une succession de commande définie au travers de différents mots clés (PRINT, MSG, GET_FILE, CLOSE, ....).

    Je lis donc ligne par ligne ce fichier, recherche le mot clé et ses paramètres, et exécute la fonction Delphi appropriée. Jusque là tout va bien.

    J'ai besoin d'implanter des tests conditionnels du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IF EXIST_FILE (AAAA)
      IF IS_RUNNING(BBBB)
        PRINT CCCC
      ELSE
        PRINT DDDD
    ELSE
      PRINT EEEE
    IF_END
    Sur plusieurs niveaux (maximum 3) et je suis coincé dans l'algorithme.

    Auriez-vous des idées ? Ca m'arrangerait d'éviter des outils lourds...

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Intéressant comme sujet. Je dirais que la première chose à faire serait de bien te mettre d'accord avec toi-même sur la syntaxe de ton script (ton fichier texte). Je dis ça parce que l'exemple que tu as posté, il me semble qu'il devrait plutôt s'écrire comme ça (mais peut-être que je me trompe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF EXIST_FILE (AAAA)
      IF IS_RUNNING(BBBB)
        PRINT CCCC
      ELSE
        PRINT DDDD
      IF_END
    ELSE
      PRINT EEEE
    IF_END
    Est-ce que tu es libre de définir toi-même ta syntaxe ou est-elle imposée au départ ?

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Par défaut
    Ah oui effectivement j'avais pas fermé le premier if...

    Effectivement la syntaxe m'est imposée, c'est une reprise d'un programme que j'avais trouvé il y a quelques années mais sans sources disponibles et introuvable aujourd'hui...

    Donc l'exemple que j'ai donné, avec ta correction, est bien la bonne syntaxe et est reprise dans tout le fichier dès lors qu'il y a des conditions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    IF EXIST_FILE (AAAA)
      IF IS_RUNNING(BBBB)
        PRINT CCCC
      ELSE
        PRINT DDDD
      IF_END
    ELSE
      PRINT EEEE
    IF_END
    J'ai pu reprendre et coder la totalité des fonctions que j'utilise, seulement problème d'algorithmie (j'imagine récursif) avec les conditions.

  4. #4
    Membre chevronné Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Intéressant comme sujet. Je dirais que la première chose à faire serait de bien te mettre d'accord avec toi-même sur la syntaxe de ton script (ton fichier texte).
    Comme le dit Roland, la syntaxe initiale est essentielle pour savoir comment exécuter les instructions.
    le point le plus intéressant est qu'apparemment, l'ordre des instructions est important et que des fonctions peuvent positionner des variables réutilisables par d'autres un peu plus loin, on est proche de la notion de script.

    Au bout du compte, il s'agit de réécrire un command.com, bel exercice !

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Par défaut
    Effectivement le but est de produire un langage de script assez basique, qui me permet de mettre à jour mes programmes (c'est le même code à chaque fois, seul l'emplacement du fichier / le nom du programme / la clé de registre diffère) mais avec certaines conditions à remplir, d'où l'implantation des structures if .. else ..end

  6. #6
    Membre expérimenté Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Par défaut
    Bonjour à tous,

    J'ai aussi trouvé ce sujet très intéressant et j'ai essayé d'en faire autant. Voici un programme qui permet d'afficher en titre de fenêtre "Hello" ou "Salut" en rentrant du code(S pour "Salut" et H pour "Hello") dans un TMemo. Il permet de gérer les conditions imbriquées. Par contre, comme je ne connaissais pas les conditions à mettre, je me suis contenté de gérer :
    Voici mon code :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        ligne : integer;                      //ligne qui doit être exécutée
        procedure EXECUTE(var l : integer);   // execute une instruction
        procedure IFF(var l : integer);       //execute une condition
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.EXECUTE(var l : integer);
    begin
      if Memo1.Lines[l] <> '' then
      begin
        if Memo1.Lines[l][1]+Memo1.Lines[l][2] = 'IF' then    //Si code IF -> appele IFF
        begin
          IFF(l);
        end else
        if Memo1.Lines[l][1] = 'S' then         //Si code S -> affiche Salut
        begin
          Caption:='Salut';
        end else
        if Memo1.Lines[l][1] = 'H' then         //Si code H -> affiche Hello
        begin
          Caption:='Hello';
        end;
      end;
    end;
     
    procedure TForm1.IFF(var l : integer);
    var i,j : integer;
        L_ELSE,L_IF_END : integer;      //ligne du ELSE et du IF_END de la condition
        Nb_IF : integer;                //Nombre de if imbriqué
        S : string;
        Bool : boolean;                 //valeur de la condition
    begin
        Nb_IF:=1;
        //recherche de la ligne du ELSE
        S:='';
        For i:=l+1 to Memo1.lines.Count do
        begin
          if Memo1.Lines[i] <> '' then
          begin
            S:='';                                                       //
            S:=Memo1.Lines[i][1]+Memo1.Lines[i][2]+Memo1.Lines[i][3];    //recherche un if imbriqué
            if S = 'IF ' then Nb_IF:=Nb_IF+1;                            //
            S:='';
            For j:=1 to 4 do s:=s+Memo1.Lines[i][j];
            if S = 'ELSE' then
            begin
              Nb_IF:=Nb_IF-1;
     
              if Nb_IF = 0 then
              begin
                L_ELSE:=i;
                break;
              end;
            end;
          end;
        end;
     
      //recherche de la ligne du IF_END
      Nb_IF:=1;
      S:='';
      For i:=L_ELSE+1 to Memo1.lines.Count do
      begin
        if Memo1.Lines[i] <> '' then
        begin
          S:='';                                                       //
          S:=Memo1.Lines[i][1]+Memo1.Lines[i][2]+Memo1.Lines[i][3];    //recherche un if imbriqué
          if S = 'IF ' then Nb_IF:=Nb_IF+1;                            //
          S:='';
          For j:=1 to 6 do s:=s+Memo1.Lines[i][j];
          if S = 'IF_END' then
          begin
            Nb_IF:=Nb_IF-1;
            if Nb_IF = 0 then
            begin
              L_IF_END:=i;
              break;
            end;
          end;
        end;
      end;
     
      //valeur du if
      bool:=false;
      S:='';
      For j:=4 to 7 do  S:=S+Memo1.Lines[l][j];
      if S = 'TRUE' then bool:=true;
     
      //Execution du THEN
      if bool = true then
      begin
        For i:=l+1 to L_ELSE-1 do
        begin
          if i >= Ligne then
          begin
            EXECUTE(i);
            Ligne:=Ligne+1;
          end;
        end;
      end;
      //execution du else
      if bool = false then
      begin
        For i:=L_ELSE+1 to L_IF_END-1 do
        begin
          if i >= Ligne then
          begin
            EXECUTE(i);
            Ligne:=Ligne+1;
          end;
        end;
      end;
     Ligne:=L_IF_END;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var i : integer;
    begin
      For i:=0 to Memo1.Lines.Count do
      begin
        if i >= Ligne then
        begin;
          EXECUTE(i);
          Ligne:=Ligne+1;
        end;
      end;
      Ligne:=0;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Ligne:=0;
    end;
     
    end.
    J'ai fait pas mal d'essais mais il y a tellement de possibilités qu'il soit possible que ce programme ne marche pas à tous les coups.
    N'ayant jamais trop bossé les chaînes de caractères, je pense que l'on peut simplifier pas mal de choses comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      For j:=1 to 6 do s:=s+Memo1.Lines[i][j];
          if S = 'IF_END' then

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Par défaut
    Voici ci-dessous un fichier test avec quelques fonctions que j'ai fini d'implanter.

    Toutes les fonctions devant retourner une valeur retournent celle-ci dans VAR, il faut l'affecter à une autre si on veut la réutiliser.

    Présence d'une structure IF / IFNOT / IF que je n'arrive pas à gérer correctement.....


    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
     
     
    [SCRIPT]
    'Récupération de l'emplacement du fichier à remplacer dans le registre
    GET_REG_KEY "HKEY_CURRENT_USER\SOFTWARE\MONAPPLI" "ExePath" 
    $PATH %VAR%
     
    ' Récupération de la version enregistrée précédemment de l'application
    GET_REG_KEY "HKEY_CURRENT_USER\SOFTWARE\MONAPPLI" "Version" 
    ' Affectation à VAR2 de la valeur actuelle de version 
    $VAR2 %VAR%
     
    ' Recherche de la dernière version de l'application (exe) présente sur un serveur Web
    ' Fonction Get : (via TIDHttp) : récupère le fichier sur le serveur Web (HOST) et le met dans TMP_PATH
    GET "%HOST%/MONAPPLI.exe" "%TMP_PATH%"
     
    ' Si fichier bien récupéré, vérif de sa version
    IF FILE_EXIST "%TMP_PATH%\MONAPPLI.exe"  
      GET_FILE_VERSION "%TMP_PATH%\truc.exe"
     ' Affectation à UPDATE de la version récupérée
      $UPDATE %VAR%
      ' comparaison des version des exe via les variables VAR2 et UPDATE
      IFNOT IS_EQUAL %VAR2% %UPDATE%
         PRINT "Versions différentes" 
         IF IS_RUNNING "MonAppli.exe"
    	  ' On la tue
    	   KILL "MonAppli.exe"
         IF_END	
     
         'On supprime le fichier local d'execution de MonAppli
         DELETE "%PATH%\MonAppli.exe" 	
         ' On déplace le fichier exe du dossier tmp vers le dossier réel de l'appli
         MOVE "%TMP_PATH%\MonAppli.exe" "%PATH%\Monappli.exe"
         'Enregistrement de la version dans le registre
         SET_REG_KEY "HKEY_CURRENT_USER\SOFTWARE\MONAPPLI" "Version" %UPDATE%
         PRINT "Enregistrement dans le registre effectué"   
         PRINT "L'application à correctement été mis à jour !" 	
      ELSE
         PRINT "Versions à jour"
         CLOSE   
      IF_END
    ELSE
      PRINT "Fichier MonAppli.exe introuvable"
    IF_END
     
    [SCRIPT_END]

Discussions similaires

  1. lecture d'un fichier texte vers un tableau de structure
    Par syki.mail dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/06/2012, 20h38
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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