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 :

[D5] Créer dynamiquement des variables dans une fonction


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut [D5] Créer dynamiquement des variables dans une fonction
    Dans mon appli, je dois mettre à jour une Bdd sur feuille excel avec une extraction d’une autre Bdd sous forme d’une autre feuille excel.
    La base de donnée originale (celle à partir de laquelle je fais des extractions) est purgée régulièrement des données que son concepteur juge périmées.
    Hors mon processus intervenant « tardivement » il arrive que les données aient été purgées lorsque j’en ai besoin.
    Pour palier le problème, je fais des extractions hebdomadaires.
    Mais comme la base de donnée originale continue à vivre, il y a des données à mettre à jour sur ma base pour des enregistrements existants (j’espère que je suis clair jusque là !).
    Les extractions étant paramétrées manuellement, lors de l’intégration dans ma base je souhaite contrôler un minimum de choses, entre autres la présence des champs nécessaires (la base de donnée originale étant composée de plus de 200 champs et je n’en ai besoin que de 22).
    J’ai donc créer une fonction du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function VerifPresenceChamps(Liste: TStrings; Table: Variant; NbCol: Byte): Boolean;
    Dont les entrées sont :
    un TStrings contenant la liste des champs à recevoir.
    Un Variant contenant la ligne 1 de ma table excel (la liste des champs reçus)
    Un byte contenant le nombre de colonnes utilisées dans la table excel en entrée
    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
    Function VerifPresenceChamps(Liste: TStrings; Table: Variant; NbCol: Byte): Boolean;
    Var
       CptListe, CptTable : Byte;
       Trouve : Boolean;
       ChTbl, ChIEP : String;
    Begin
      Trouve := False;
      For CptListe := 0 to Liste.Count -1 do
      Begin
        ChTbl := Liste.Strings[CptListe];
        For CptTable := 1 to NbCol do
        Begin
          ChIEP := VarToStr(Table[1,CptTable]);
          If AnsiPos(ChTbl, ChIEP) <> 0 then  // Chaîne trouvée
          Begin
            Trouve := True;
            Break;
          End;
          If ((CptTable = NbCol) and  (Not Trouve)) Then
          Begin
            VerifPresenceChamps := False;
            Break;
          End;
        End;
      End;
      if Trouve then VerifPresenceChamps := True;
    End;
    Et la question ?
    J’y viens.
    Ma fonction est un TOR (Tout Ou Rien) et ne me satisfait pas.
    S’il manque un ou plusieurs champs elle me dit qu’il manque quelque chose mais sans préciser quoi.
    Voici donc ma question :
    Est t’il possible de créer dynamiquement autant de variables booléennes que nécessaire (dont le nombre est donné par Liste.count) et dans ce cas, au lieu de retourner un booléen, ma fonction renverra une liste afin de passer l’info sur ce qui manque.
    Précisions complémentaires :
    1-le contenu de liste est chargé depuis un fichier texte afin de palier aux variations de libellés de la base de donnée originale (je me suis déjà fais avoir) sans avoir à toucher au code.
    2-Je suis quasiment débutant (mais tout le monde s’en est déjà rendu compte).
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    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 460
    Points : 24 874
    Points
    24 874
    Par défaut
    un TBooleanDynArray (unit Types) pour faire l'affaire non ?
    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
    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
    Je te propose de passer en paramêtre non pas 1 mais 2 TstringList (à passer en VAR).
    Celle que tu as déja (Liste) et une autre où tu mets les résultats ('0' si pas OK et '1' si OK par exemple).
    DOnc du coup si ton resultat est à false tu vas voir dans ta TStringList d'où vient le pb.
    ....
    Je suis clair ?

  4. #4
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par ShaiLeTroll
    un TBooleanDynArray (unit Types) pour faire l'affaire non ?
    Je regarde dans F1 (je n'ai jamais utilisé çà), je fais quelques essais et je te rends compte
    Merci en attendant.

  5. #5
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par philnext
    Je te propose de passer en paramêtre non pas 1 mais 2 TstringList (à passer en VAR).
    Celle que tu as déja (Liste) et une autre où tu mets les résultats ('0' si pas OK et '1' si OK par exemple).
    DOnc du coup si ton resultat est à false tu vas voir dans ta TStringList d'où vient le pb.
    ....
    Je suis clair ?
    Je répondais à ShaiLeTroll et ton message est arrivé entre temps.
    Je modifie la 2eme liste et je la retourne ensuite en lieu et place du booléen c'est bien çà?
    Je n'y aurais pas pensé, c'est simple et çà doit fonctionner.
    Quelques tests et je posterai résolu.
    Merci.

  6. #6
    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
    Oui, j'aurais dit 'en plus' du boolean.
    L'avantage des tStringList c'est que tu peux aussi stocker des choses plus précises que '0' ou '1'. Notamment les pbs de changements de formats.

    D'autre part pour simplifier ton code tu as la Méthode IndexOf pour une tStringList.
    te renvoie -1 si Toto fait partie de la TStringList ou son index sinon.

  7. #7
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par philnext
    Oui, j'aurais dit 'en plus' du boolean.
    L'avantage des tStringList c'est que tu peux aussi stocker des choses plus précises que '0' ou '1'. Notamment les pbs de changements de formats.

    D'autre part pour simplifier ton code tu as la Méthode IndexOf pour une tStringList.
    te renvoie -1 si Toto fait partie de la TStringList ou son index sinon.
    Je ne connais pas cette méthode "IndexOf('Toto')" elle va m'interresser.
    Je viens de voir le "j'aurais dit 'en plus' du boolean" Un fonction peut retourner plus d'un Objet? comment fait-on?

    Je viens de tester la méthode que tu m'as indiqué plus tôt, et elle fonctionne parfaitement pour le renvoi et la récupération mais je ne peux libérer la mémoire. j'ai le message d'erreur suivant lorsque le compilateur arrive sur la ligne en rouge.
    EAccessViolation Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000
    Voici mon code d'appel de la fonction
    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
    Try
      LChpsIE := Tstringlist.Create;
      LChpsIE := VerifPresenceChamps(LChamps, LChamps, vRangeIEP, NbCol);
      For CptTable := 0 to LChpsIE.Count -1 do
        If AnsiPos('=Absent', LChpsIE.Strings[CptTable]) <> 0 then  // Chaîne trouvée
          Memo1.Lines.Add('Dans la table Export : ' + LChpsIE.Strings[CptTable])
        Else Memo1.Lines.Add('Le champs : ' + LChpsIE.Strings[CptTable] +
                ' est présent dans la table Export');
    finally
      vXLClasTbl.Close;   
      vXLClasIEP.Close;  
      vMSExcel.DisplayAlerts := True ;               // message d'alerte en route
      vMSExcel.Quit;                                      // Ferme Excel
      VarClear(vMSExcel);                               // Variant effacé
      VarClear(vXLClasseurs);                          // Variant effacé
      VarClear(vXLClasTbl);                             // Variant effacé
      VarClear(vXLClasIEP);                             // Variant effacé
      VarClear(vFeuilTbl);                                // Variant effacé
      VarClear(vFeuilIEP);                                // Variant effacé
      LChamps.Free;                                       // Libération de la mémoire
      LChpsIE.Free; // Libération de la mémoire

  8. #8
    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
    Euh..comme tout ton code n'est pas présent ce n'est pas évident...mais ce ne serait pas plutot sur le free de la ligne précédente qu'il y aurait le pb ? (on ne voit pas le create associé...)

  9. #9
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par philnext
    Euh..comme tout ton code n'est pas présent ce n'est pas évident...mais ce ne serait pas plutot sur le free de la ligne précédente qu'il y aurait le pb ? (on ne voit pas le create associé...)
    Voici mon code en entier (entre temps j'ai fait certains essai) c'est bien sur le dernier .Free que çà plante et si je le met en commentaire çà passe sans problème (sauf qu'évidemment la mémoire n'est pas libérée).
    Dans un premier temps j'avais seulement fait un Clear cf(orange), j'ai ensuite libéré puis recréé mais c'est pareil, c'est sur la sortie que çà plante.
    Peut-être y a t'il un problème d'affectation (Bleu)?
    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
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    procedure TForm1.BtCptTable_EClick(Sender: TObject);
    Var
       vMSExcel,
       vXLClasseurs,
       vXLClasIEP,
       vXLClasTbl,
       vFeuilIEP,
       vFeuilTbl,
       vRangeIEP,
       vRangeTbl   : variant;
       CptT, CptP  : Word;
       NbCol       : Byte;
       CptTable    : Byte;
       Colonne     : String[2];
       LChamps     : TStrings;
       LChpsIE     : TStrings;
       ChampAbsent : Boolean;
       AffTrouve   : Boolean;
    begin
        LChamps           := Tstringlist.Create;
        LChamps.LoadFromFile(ChBasR + 'ListeChamps_E.TXT'); // Charge depuis le fichier
    
        FBaseT := ChBasR + FTbl_E;
        FBaseD := ChBasR + FIEP_E;
        Memo1.Lines.Add('FBaseT: ' + FBaseT);
        Memo1.Lines.Add('FBaseD: ' + FBaseD);
        BtMaJTable_E.Enabled := true;
        ChampAbsent := False;
        AffTrouve   := False;
    
          vMSExcel := CreateOleObject('Excel.Application');     // Crée l'interface
          vMSExcel.Visible := False;                            // Interface invisible
          vMSExcel.DisplayAlerts := False ;                     // message d'alerte en route
          try
            vXLClasseurs := vMSExcel.Workbooks;
            // BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE -
            vXLClasTbl    := vXLClasseurs.Open(FBaseT,unassigned,True); // IEP  ReadOnly à True
            vFeuilTbl     := vXLClasTbl.WorkSheets[1];
            vFeuilTbl.UsedRange.Select;                        // La plage de cellules utilisées est sélectionnée
            Memo1.Lines.Add('Feuille de Table_x sélectionnée');
            vFeuilTbl.UsedRange.Sort(vFeuilTbl.Range['A1','A1'], xlDescending,
              EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
              xlGuess, 1, False, xlTopToBottom, EmptyParam);    // La plage sélectionnée est triée
            Memo1.Lines.Add('plage de Table_x sélectionnée est triée');
            NbTLigT := vFeuilTbl.UsedRange.Rows.count;         // Nombre de lignes utilisées dans la table
            Memo1.Lines.Add('Nombre de lignes utilisées dans la table Table_x : ' + IntToStr(NbTLigT));
            vRangeTbl :=  vFeuilTbl.Range['A1', 'V' + IntToStr(NbTLigP)].Value;
          Finally
            vXLClasTbl.Close;   // vXLWorkbook.Close(vSaveChanges, aFileName);
            VarClear(vXLClasTbl);                               // Variant effacé
            VarClear(vFeuilTbl);                                // Variant effacé
          End;
            // BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE -
    
          try
            // IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP -
            vXLClasIEP    := vXLClasseurs.Open(FBaseD,unassigned,True); // IEP  ReadOnly à True
            Memo1.Lines.Add('Classeur ouvert: ' + FBaseD);
    
            vFeuilIEP     := vXLClasIEP.WorkSheets[1];
            vFeuilIEP.UsedRange.Select;                        // La plage de cellules utilisées est sélectionnée
            Memo1.Lines.Add('Feuille de Export sélectionnée');
            vFeuilIEP.UsedRange.Sort(vFeuilIEP.Range['A1','A1'], xlDescending,
              EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
              xlGuess, 1, False, xlTopToBottom, EmptyParam);    // La plage sélectionnée est triée
            Memo1.Lines.Add('plage de Export sélectionnée est triée');
            NbTLigP := vFeuilIEP.UsedRange.Rows.count;         // Nombre de lignes utilisées dans la table
            Memo1.Lines.Add('Nombre de lignes utilisées dans la table Export : ' + IntToStr(NbTLigP));
            NbCol   := vFeuilIEP.UsedRange.Columns.count;         // Nombre de Colonnes utilisées dans la table
            Memo1.Lines.Add('Nombre de Colonnes utilisées dans la table Export : ' + IntToStr(NbCol));
            case NbCol of
              01 : Colonne := 'A';
              02 : Colonne := 'B';
              03 : Colonne := 'C';
              04 : Colonne := 'D';
              05 : Colonne := 'E';
              06 : Colonne := 'F';
              07 : Colonne := 'G';
              08 : Colonne := 'H';
              09 : Colonne := 'I';
              10 : Colonne := 'J';
              11 : Colonne := 'K';
              12 : Colonne := 'L';
              13 : Colonne := 'M';
              14 : Colonne := 'N';
              15 : Colonne := 'O';
              16 : Colonne := 'P';
              17 : Colonne := 'Q';
              18 : Colonne := 'R';
              19 : Colonne := 'S';
              20 : Colonne := 'T';
              21 : Colonne := 'U';
              22 : Colonne := 'V';
              23 : Colonne := 'W';
              24 : Colonne := 'X';
              25 : Colonne := 'Y';
              26 : Colonne := 'Z';
              27 : Colonne := 'AA';
              28 : Colonne := 'AB';
              29 : Colonne := 'AC';
              30 : Colonne := 'AD';
              31 : Colonne := 'AE';
            end;
            vRangeIEP :=  vFeuilIEP.Range['A1', Colonne + IntToStr(NbTLigP)].Value;
          Finally
            vXLClasIEP.Close;   // vXLWorkbook.Close(vSaveChanges, aFileName);
            vMSExcel.DisplayAlerts := True ;                    // message d'alerte en route
            VarClear(vXLClasIEP);                               // Variant effacé
            VarClear(vFeuilIEP);                                // Variant effacé
          End;
            // IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP - IEP -
    
            // CONTRÔLE PRESENCE DE TOUS LES CHAMPS NECESSAIRES
          try
            LChpsIE.Clear;        
            LChpsIE.Free;                                       // Libération de la mémoire
            LChpsIE := Tstringlist.Create;
            LChpsIE := VerifPresenceChamps(LChamps, LChamps, vRangeIEP, NbCol);
            For CptTable := 0 to LChpsIE.Count -1 do
              If AnsiPos('=Absent', LChpsIE.Strings[CptTable]) <> 0 then  // Chaîne trouvée
              Begin // Ce champs est absent
                Memo1.Lines.Add('Dans la table Export : ' + LChpsIE.Strings[CptTable]);
                ChampAbsent := True;
              End Else Memo1.Lines.Add('Le champs : ' + LChpsIE.Strings[CptTable] +
                ' est présent dans la table Export');
            // CONTRÔLE PRESENCE DE TOUS LES CHAMPS NECESSAIRES TERMINE
    
            // Début du traitement de mise à jour
            if Not ChampAbsent then // aucun champ important ne manque
            Begin
              For CptT := 2 to NbTLigT do
              Begin
                For CptP := 2 to NbTLigP do
                Begin
                  If AnsiPos(VarToStr(vRangeTbl[1,CptT])), VarToStr(vRangeIEP[1,CptP]) <> 0 then  // Chaîne trouvée
                  Begin  // Début de Mise à jour des données sur affaire trouvée
                    AffTrouve := True;
     
                  End;   // Fin de Mise à jour des données sur affaire trouvée
                End;
                If Not AffTrouve then
                begin   // Début de Mise à jour des données sur affaire NON trouvée
                End;    // Fin de Mise à jour des données sur affaire NON trouvée
              End;
            End; // if Not ChampAbsent then // aucun champ important ne manque
            // traitement de mise à jour terminé
          finally
            vMSExcel.DisplayAlerts := True ;                    // message d'alerte en route
            vMSExcel.Quit;                                      // Ferme Excel
            VarClear(vMSExcel);                                 // Variant effacé
            VarClear(vXLClasseurs);                             // Variant effacé
            VarClear(vRangeIEP);                                // Variant effacé
            VarClear(vRangeTbl);                                // Variant effacé
            LChamps.Free;                                       // Libération de la mémoire
            LChpsIE.Free;                                       // Libération de la mémoire
         end;                                                  // Fin du Try Finally
    end;
    
    Function VerifPresenceChamps(Liste, Lret: TStrings; Table: Variant; NbCol: Byte): TStrings;
    Var
       CptListe, CptTable : Byte;
       Trouve : Boolean;
       ChTbl, ChIEP : String;
    Begin
      Trouve := False;
      For CptListe := 0 to Liste.Count -1 do
      Begin
        // Liste.IndexOf('Toto') // -1 si non trouvé ou index si trouvé
        ChTbl := Liste.Strings[CptListe];
        For CptTable := 1 to NbCol do
        Begin
          ChIEP := VarToStr(Table[1,CptTable]);
          If AnsiPos(ChTbl, ChIEP) <> 0 then  // Chaîne trouvée
          Begin
            Trouve := True;
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '++' + IntToStr(CptTable);
            Break;
          End;
          If ((CptTable = NbCol) and  (Not Trouve)) Then
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '=Absent';
        End;
        Trouve := False;
      End;
      VerifPresenceChamps := Lret;
    End;
    Je n'ai pas pu utiliser le Liste.IndexOf('Toto') indiqué par philnext car le texte recherché est dans le variant, dans la (les) liste(s) il y est forcément puisque c'est "l'étalon" (Suis-je clair?).

  10. #10
    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
    pour le Indexof j'aurais remplacé
    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
      For CptListe := 0 to Liste.Count -1 do
      Begin
        // Liste.IndexOf('Toto') // -1 si non trouvé ou index si trouvé
        ChTbl := Liste.Strings[CptListe];
        For CptTable := 1 to NbCol do
        Begin
          ChIEP := VarToStr(Table[1,CptTable]);
          If AnsiPos(ChTbl, ChIEP) <> 0 then  // Chaîne trouvée
          Begin
            Trouve := True;
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '++' + IntToStr(CptTable);
            Break;
          End;
          If ((CptTable = NbCol) and  (Not Trouve)) Then
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '=Absent';
        End;
        Trouve := False;
      End;
    par
    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
     
      Begin
        // Liste.IndexOf('Toto') // -1 si non trouvé ou index si trouvé
        For CptTable := 1 to NbCol do
        Begin
          ChIEP := VarToStr(Table[1,CptTable]);
          if Liste.IndexOf(ChIEP ) >= 0 then // si  Chaîne trouvée
          Begin
            Trouve := True;
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '++' + IntToStr(CptTable);
            Break;
          End;
          If ((CptTable = NbCol) and  (Not Trouve)) Then
            Lret.Strings[CptListe] := Lret.Strings[CptListe] + '=Absent';
        End;
        Trouve := False;
      End;

  11. #11
    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
    Pour ton autre pb ton appel de fonction n'est pas très 'catholique'.

    Le plus correct (pour moi) serait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LChpsIE := Tstringlist.Create;
    bResult := VerifPresenceChamps(LChamps, LChpsIE , vRangeIEP, NbCol);
    
    //ça oblige à modifier ta fonction en 
    
    VerifPresenceChamps(LChamps :tstringlist;var LChpsIE :tStringlist , vRangeIEP, NbCol : integer) : boolean;
    
    //voir l'aide sur les paramétres de fonctions pour le VAR
    
    

  12. #12
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par philnext
    Pour ton autre pb ton appel de fonction n'est pas très 'catholique'.
    Le plus correct (pour moi) serait de faire :
    Merci je vais tester tout çà cet après-midi
    à+

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

Discussions similaires

  1. Utilisation des variables dans une fonction
    Par DeLorbe dans le forum Débuter
    Réponses: 6
    Dernier message: 05/02/2010, 10h50
  2. Utiliser des variables dans une fonction
    Par zugolin dans le forum Langage
    Réponses: 7
    Dernier message: 10/04/2009, 15h11
  3. déclaration des variables dans une fonction
    Par kawther dans le forum Débuter
    Réponses: 4
    Dernier message: 22/10/2008, 01h17
  4. Passer des variables dans une fonction
    Par Herlece dans le forum PL/SQL
    Réponses: 11
    Dernier message: 11/07/2008, 14h18
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

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