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

  1. #41
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par cedr Voir le message
    Concernant les fonctions des dernières versions de Delphi, parles-tu de l_if : TList<TIF> ?
    Oui, c'est de ça que je parlais. Merci pour l'explication et le code.

    Autrement, je me demandais comment tu procèdes pour la création des variables. J'y ai réfléchi un peu de mon côté et voici l'idée que j'avais :

    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
    program Variables;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils, System.Classes, System.Variants;
     
    type
      PVarRec = ^TVarRec;
      TVarRec = record
        value: variant;
        name: string;
      end;
     
    var
      l: TList;
      p: PVarRec;
     
    begin
      l := TList.Create;
     
      New(p);
     
      p^.name := 's';
      p^.value := 'hello';
      l.Add(p);
     
      WriteLn(PVarRec(l.Items[0])^.name); // s
      WriteLn(PVarRec(l.Items[0])^.value); // hello
      WriteLn(
        VarTypeAsText(VarType((PVarRec(l.Items[0])^.value)))
      ); // UnicodeString
     
      Dispose(p);
     
      l.Free;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #42
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 23
    Points
    23
    Par défaut
    Donc l_if : TList<TIF> (Generics.Collections.TList).

    La création des variables est pas top, et pas optimisée du tout je trouve. Pareil d'ailleurs pour les affectations (TraiteVariable) :

    J'ai 3 tableaux contenant les variables autorisées
    Variables : array [1..NbVariables] of String = ('HOST','ROOT','TITLE','PATH','VAR','VAR2','VAR3','UPDATE','TMP_PATH');
    VariablesDollards : array [1..NbVariables] of String = ('$HOST','$ROOT','$TITLE','$PATH','$VAR','$VAR2','$VAR3','$UPDATE','$TMP_PATH');
    VariablesPourcent : array [1..NbVariables] of String = ('%HOST%','%ROOT%','%TITLE%','%PATH%','%VAR%','%VAR2%','%VAR3%','%UPDATE%','%TMPPATH%');

    Je définie les variables globales dans l'appli
    script_HOST,script_ROOT,script_TITLE,script_PATH,script_VAR,script_VAR2,script_VAR3,script_UPDATE,script_TMP_PATH : String;

    Et ma fonction TraiteVariable
    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
     
    procedure TForm_Main.TraiteVariable(variable : String;param1 : String);
    begin
      // Si le param1 est entre % -> on affecte cette valeur à la variable
      //('$HOST','$ROOT','$TITLE','$PATH','$VAR','$VAR2','$VAR3','$UPDATE')
      // 'script_' + variable := param1;
      if (LeftStr(param1,1) = '%') AND (RightStr(param1,1) = '%')  then
      begin
           case StringtoCaseSelect(param1, VariablesPourcent) of
              0 :   // %HOST%
              begin
                 param1 := script_host;
              end;
              1 :   // $ROOT
              begin
                 param1 := script_root;
              end;
              2 :   // $TITLE
              begin
                param1 := script_title;
              end;
              3 :   // $PATH
              begin
                param1 := script_path;
              end;
              4 :   // $VAR
              begin
                param1 := script_var;
              end;
              5 :   // $VAR2
              begin
                param1 := script_var2;
              end;
              6 :   // $VAR3
              begin
                param1 := script_var3;
              end;
              7 :   // $UPDATE
              begin
                param1 := script_update;
              end;
              8 :   // $TMP_PATH
              begin
                param1 := script_TMP_PATH;
              end;
            end;
      end;
     
      case StringtoCaseSelect(variable, VariablesDollards) of
        0 :   // $HOST
        begin
           script_host := param1;
        end;
        1 :   // $ROOT
        begin
           script_root := param1;
        end;
        2 :   // $TITLE
        begin
          script_title := param1;
          Main.Form_Main.Caption := param1;
        end;
        3 :   // $PATH
        begin
          script_path := param1;
        end;
        4 :   // $VAR
        begin
          script_var := param1;
        end;
        5 :   // $VAR2
        begin
          script_var2 := param1;
        end;
        6 :   // $VAR3
        begin
          script_var3 := param1;
        end;
        7 :   // $UPDATE
        begin
          script_update := param1;
        end;
        8 :   // $TMPPATH
        begin
          script_TMP_PATH := param1;
        end;
     
      end;
     
    end;
    et RemplaceVarParSaValeur si présent dans une commande
    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
     
    function TForm_Main.RemplaceVarParSaValeur(S : String) : String;
    var
      retour : String;
    begin
      retour := s;
      //'%HOST%','%ROOT%','%TITLE%','%PATH%','%VAR%','%VAR2%','%VAR3%','%UPDATE%');
      retour := StringReplace(retour,'%HOST%', script_HOST, [rfReplaceAll]);
      retour := StringReplace(retour,'%ROOT%', script_ROOT, [rfReplaceAll]);
      retour := StringReplace(retour,'%TITLE%', script_TITLE, [rfReplaceAll]);
      retour := StringReplace(retour,'%PATH%', script_PATH, [rfReplaceAll]);
      retour := StringReplace(retour,'%VAR%', script_VAR, [rfReplaceAll]);
      retour := StringReplace(retour,'%VAR2%', script_VAR2, [rfReplaceAll]);
      retour := StringReplace(retour,'%VAR3%', script_VAR3, [rfReplaceAll]);
      retour := StringReplace(retour,'%UPDATE%', script_UPDATE, [rfReplaceAll]);
      retour := StringReplace(retour,'%TMP_PATH%', script_TMP_PATH, [rfReplaceAll]);
     
      Result := retour;
    end;

  3. #43
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    OK, c'est comme ça que j'imaginais que tu faisais. C'est très bien, puisque ça fonctionne. Mais on pourrait peut-être faire autrement, sans avoir une liste de variables prédéfinies. Je constate que toutes tes variables sont du même type (string) donc ça facilite les choses et il n'est pas nécessaire de passer par le type Variant. Connais-tu les tableaux associatifs ? J'ai un exemple quelque part : je le cherche et je le poste.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #44
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    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 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Désolé de revenir un peu en arrière :Script3.zip

    Effectivement Cedr et Roland ont raison, il ne faut effectuer qu'une seule passe de lecture du script (à cause de la lecture des variables et de l'exécution des commandes qui impactent les conditions des IF)

    Piqué au vif, j'ai fait une nouvelle version plus simple et plus courte qui doit ressembler comme 2 gouttes d'eau à celle de Roland (?) mais sans utiliser les expressions régulières, avec de simples tableaux statiques (que l'on peut rendre dynamiques si l'on veut traiter plus de if imbriqués que 50, et plus de 1000 lignes de script)

    Comme Roland, j'affiche les instructions à exécuter et les instructions conditionnelles avec leurs résultats. Cette fois ci je pense avoir fait au plus simple.

    Script3.zip

    A+
    Charly

  5. #45
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    @Charly910

    Joli programme. Effectivement je crois que nos deux programmes font la même chose, avec la différence que tu utilises un tableau et moi la récursion (j'avais d'abord essayé avec un tableau mais je ne m'en sortais pas). Mon algorithme est le suivant : parcourir toutes les lignes ; si c'est une condition, évaluer et exécuter. La fonction "évaluer et exécuter" reçoit comme premier argument le numéro de la ligne où se trouve la condition ; elle renvoie aussi un numéro de ligne, pour que le code appelant sache où reprendre la lecture. Elle reçoit comme second argument la valeur de l'ordre d'exécution dans la procédure appelante : la valeur locale tient compte de la valeur globale.

    Lorsqu'elle rencontre une condition, la fonction "évaluer et exécuter" s'appelle elle-même. Le cas du script non correct n'est pas géré.

    @cedr

    Concernant la création des variables, vu que ce ne sont que des chaînes, on peut utiliser un TStringList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses
      Classes, SysUtils;
     
    var
      ss: TStrings;
     
    begin
      ss := TStringList.Create;
      ss.Values['PATH'] := ExtractFilePath(ParamStr(0));
      WriteLn(ss.Values['PATH']);
      ss.Free;
    end.
    Autrement si on s'intéresse aux nouveautés de Delphi XE on peut utiliser le type TDictionary.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #46
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    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 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Roland,
    effectivement, je crois qu'une bonne solution pour Cedr consiste à utiliser des TStringLists pour stocker le nom de la variable et sa valeur avec addObjects et ensuite utiliser IndexOf pour récupérer la valeur d'une variable en fonction de son nom.

    Sinon, compte tenu du faible nombre de variables, je pensais aussi que l'on pouvait encore utiliser des tableaux statique (encore !!) :

    NomVar[i ] pour le nom de la variable i
    ValVar[i] pour sa valeur
    + NbVar pour le nombre de variables

    puis pour gérer les variables, comme il n'y a pas de suppression de variables, ni besoin de compactage :

    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
     
    { ======================================================================== }
    Procedure TF_Princ.AddVar(Nom, Valeur : String) ;
    Begin
       NbVar := NbVar + 1 ;
       NomVar[NbVar] := Nom ;
       ValVar[NbVar] := Valeur ;
    End ;
    { ======================================================================== }
    Function TF_Princ.SetVal(Nom, Valeur : String) : Boolean  ;
    Var
       i   : Integer ;
    Begin
       Result := False ;
       // Downto pour la première variable en cas de doublon ?
       // Sinon : To
       For i := NbVar DownTo 1 Do
          Begin
             If (NomVar[i] = Nom) Then
                Begin
                  ValVar[i] := Valeur ;
                  Result := True ;
                End ;
          End ;
    End ;
    { ======================================================================== }
    Function  TF_Princ.GetVal(Nom : String; Var Valeur : String )  : Boolean ;
    Var
       i   : Integer ;
    Begin
       Result := False ;
       // Downto pour récupérer la première valeur en cas de doublon ?
       // Sinon : To
       For i := NbVar DownTo 1 Do
          Begin
             If (NomVar[i] = Nom) Then
                Begin
                  Valeur := ValVar[i] ;
                  Result := True ;
                End ;
          End ;
    End ;
    { ======================================================================== }
    [Non testé]

    je pars en vacances jeudi, mais comme je me suis pris au jeu, je continuerai à étudier ce problème intéressant en rentrant ...

    bon courage à Cedr qui semble bien parti pour sa solution et bravo à Roland qui a proposé des solutions efficaces.

    A+
    Charly

  7. #47
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 23
    Points
    23
    Par défaut
    J'ai terminé la modif du traitement des variables : j'ai choisi d'utiliser un TDictionary

    Déclaration / Création
    dico_variable := TDictionary<String,String>.Create;

    RemplaceVarParSaValeur (utilisé lors de l'évaluation des diverses commandes)
    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
     
    function RemplaceVarParSaValeur(S : String) : String;
    var
      retour : String;
      variable : String;
      varpourcent : String;
      v : String;
    begin
      retour := s;
      for variable in l_variables do
      begin
        if dico_variable.ContainsKey(variable) then
        begin
          varpourcent := '%' + variable + '%';
          if dico_variable.TryGetValue(variable, v) then
          retour := StringReplace(retour,varpourcent, v, [rfReplaceAll]);
        end;
     
      end;
     
      Result := retour;
    end;
    TraiteVariable = affectation d'une valeur à une variable
    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
     
    procedure TForm_Main.TraiteVariable(variable : String;param1 : String);
    var
      s : String;
      p : String;
      valeur_p : String;
    begin
      // Si le param1 est entre % -> on affecte cette valeur à la variable
      //('$HOST','$ROOT','$TITLE','$PATH','$VAR','$VAR2','$VAR3','$UPDATE')
      p := param1;
      if (LeftStr(param1,1) = '%') AND (RightStr(param1,1) = '%')  then
      begin
        p := Copy(param1, 2, Length(param1) - 2);
        dico_variable.TryGetValue(p,valeur_p);
        p := valeur_p;
      end;
     
      s := Copy(variable, 2, Length(variable));
      dico_variable.AddOrSetValue(s,p);
    end;
    Il me reste encore à gérer des barres de progression : une pour la ligne lue (surtout dans le cas de download de fichier) et une autre pour le progress global

  8. #48
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    @Charly910

    Merci pour tes encouragements.

    Voici une version plus complète de mon projet.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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