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 :

Overload


Sujet :

Langage Delphi

  1. #1
    JMF
    JMF est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Overload
    Bonjour,

    j'ai une fonction pour enregistrer un mouvement de marchandise dans une table. On peut passer en paramètre un TQuery qui sera alors utilisé pour effectuer la requete ou bien Nil et dans ce cas un TQuery par défaut sera utilisé.

    Nous sommes en train de passer certaines applications en DBExpress mais comme cela se fait progressivement, il faudrait pouvoir faire cohabiter les 2 fonctionnements.

    Les classes TQuery et TSQLQuery n'ayant pas le même ancêtre, je n'ai pas pu utiliser cette technique.

    J'ai donc pensé écrire une version surchargée de la méthode mais lorsqu'on passe un Nil, il y a ambiguité.
    Il y a-til un moyen de dire qu'en cas d'ambiguité, il faut utiliser telle version. Une sorte de version par défaut.

    N'ayant réussi à trouver un moyen de faire cela, j'ai pensé mettre mon argument en Variant. Ainsi je teste le type de la classe de l'argument et j'agit en conséquence. Seulement un Variant ne semble pas pouvoir avoir Nil pour valeur.

    Là je suis à court d'idée.
    Quelqu'un aurait-il une solution ?

    Merci beaucoup.

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    Salut,

    si le problème est juste de définir une fonction par défaut en cas de nul, tu peux utiliser une valeur par défaut de paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        procedure Test(Obj : TQuery); overload;
        procedure Test(Obj : TADOQuery = nil); overload;
     
    //--> dans les cas suivants
     
      Test(MaQuery); //Fait la première
      Test(MaQueryADO); //Fait la deuxième
      Test(nil); //Fait la deuxième
      Test; //Fait la deuxième
    A+---------------> Nat <-------------------

  3. #3
    JMF
    JMF est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Salut rbag,

    merci pour ton aide mais malheureusement j'ai d'autres arguments dans ma méthode, je ne peux donc mettre une valeur par défaut au premier sans en mettre aux autres.

    Par contre j'ai eu une autre idée : passer un pointer vers le NIL/TQuery/TSQLQuery et selon le type de l'argument le transtyper en conséquence.

    Seulement je dois mal gérer mon pointeur (Je n'en ai jamais utilisé encore ) car lors du Open sur le TQuery/TSQLQuery, j'obtiens l'erreur suivante : Erreur à la création du handle de curseur.

    Voici le code que j'utilise :
    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
     
    PROCEDURE TDM_Divers.Ajouter_Mouvement(Query:Pointer;Table:TAcces_Table;Mouvement:TAcces_Mouvement);
    BEGIN
      IF NOT Assigned(Query) THEN
        Query:=Query_Divers;
     
        IF TObject(Query).ClassName = 'TQuery' THEN
        BEGIN
          WITH TQuery(Query) DO
            BEGIN
                Close;
                SQL.Text:='____Ma_requête_SQL____';
                Open;
              END;
          END
          ELSE
          BEGIN
            WITH TSQLQuery(Query) DO
              BEGIN
                Close;
                SQL.Text:='____Ma_requête_SQL____';
                Open;
              END;
          END;
        END;
      {$ENDIF}
    END;
    BTW si quelqu'un a une idée pour éviter de répéter le bloc de code concernant l'execution de la requête, je suis preneur.

    Merci.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    'ai fait un test vite fait, sur mon ordi ça marche (quasiment le même code). Tu n'aurais pas oublié qq chose ou fait une erreur dans le code ?
    A+---------------> Nat <-------------------

  5. #5
    JMF
    JMF est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bah mince alors. Je ne vois pas où est mon erreur (d'un autre côté si je la voyais je ne te demanderais pas de l'aide )

    Pourrais tu me montrer le code de ton test stp ?
    Merci.

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    Pas de pb:
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenQry(QBDE);
      OpenQry(QSQL);
      OpenQry(nil);
    end;
     
    procedure TForm1.OpenQry(Query: pointer);
    begin
      if not Assigned(Query) then
        Query := QSQL;
      if TObject.ClassName = 'TQuery' then begin
        TQuery(Query).Close;
        TQuery(Query).SQL.Clear;
        TQuery(Query).SQL.Add('SELECT * FROM MaTable');
        TQuery(Query).Open;
      end else begin
        TSQLQuery(Query).Close;
        TSQLQuery(Query).SQL.Clear;
        TSQLQuery(Query).SQL.Add('SELECT * FROM MaTable');
        TSQLQuery(Query).Open;
      end;
    end;
    A+---------------> Nat <-------------------

  7. #7
    JMF
    JMF est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    En effet cela fonctionne, l'erreur doit venir du reste de mon code.

    Merci beaucoup pour ton aide.

    BTW il y a une erreur dans ton code, tu oublies de transtyper l'argument ici : if TObject.ClassName = 'TQuery'

  8. #8
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    TQuery et TSQLQuery ont un ancetre commun : TDataSet, c'est celui-ci qu'il faut prendre comme type de paramètre et tester dans la procédure le type réel de composant :

    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
    procedure TForm1.OpenQry(Query:TDataSet); 
    begin 
      if not Assigned(Query) then 
        Query := QSQL; 
      if Query Is TQuery then begin 
        TQuery(Query).Close; 
        TQuery(Query).SQL.Clear; 
        TQuery(Query).SQL.Add('SELECT * FROM MaTable'); 
        TQuery(Query).Open; 
      end else begin 
        TSQLQuery(Query).Close; 
        TSQLQuery(Query).SQL.Clear; 
        TSQLQuery(Query).SQL.Add('SELECT * FROM MaTable'); 
        TSQLQuery(Query).Open; 
      end; 
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  9. #9
    JMF
    JMF est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci Nono40 mais en fait j'avais déjà trouvé cette solution seulement pris par les contraintes du boulot j'ai oublié de l'indiquer. Je suis vraiment désolé.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/10/2005, 15h28
  2. [Traduction] Overload et Override en français ?
    Par vbrabant dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2005, 18h44
  3. [Dll] Exportations de procedures Overload
    Par Clorish dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2005, 10h19
  4. overload ...problem
    Par Didier100 dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/07/2004, 10h16
  5. Règles de surcharge avec overload ?
    Par Benjamin GAGNEUX dans le forum Langage
    Réponses: 5
    Dernier message: 07/07/2004, 17h19

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