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 :

comment avoir accès aux variables et fonctions d'une forme depuis une autre fonction?


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut comment avoir accès aux variables et fonctions d'une forme depuis une autre fonction?
    Bonjour, j'ai le code suivant et ma question est mise en commentaire dans le 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
     
    unit FM_Main;
     
    interface
     
    uses  {...}
     
    type
      TF_Main = class(TForm)
        private {...}
        protected {...}
        public 
         function g (...):string;
         procedure h(....);
         a: TADOConnection;
         b: TADOQuery;
     end;
    function f (r : string) : string;
     
    implementation
     
    function TF_Main.g(...):string;
    begin 
    {corps de la fonction g}
    end;
     
    procedure TF_Main.h(...);
    begin 
    {corps de la fonction g}
    end;
    function f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;

    Merci D'avance les gas

  2. #2
    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
    tu transformes ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TFMain.f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    tu fais <ctrl><Alt><C> : ça va déclarer ta fonction en 'private' tu as accès dans cette fonction à tous les éléments demandés.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Soit la variable globale généralement associé à une form, soit tu passe un paramètre en plus qui est une form de la classe TF_Main

    soit par soucis de logique objet, tu fais une méthode de classe qui prend en paramètre la form

    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
     
    unit FM_Main;
     
    interface
     
    uses  {...}
     
    type
      TF_Main = class(TForm)
        private {...}
        protected {...}
        public 
         function g (...):string;
         procedure h(....);
         class function f (r : string) : string;
         a: TADOConnection;
         b: TADOQuery;
     end;
     
     
    implementation
     
    function TF_Main.g(...):string;
    begin 
    {corps de la fonction g}
    end;
     
    procedure TF_Main.h(...);
    begin 
    {corps de la fonction g}
    end;
     
    class function TF_Main.f (r : string; const F_Main: TF_Main) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par philnext
    tu transformes ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TFMain.f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    tu fais <ctrl><Alt><C> : ça va déclarer ta fonction en 'private' tu as accès dans cette fonction à tous les éléments demandés.
    JE ne peux pas transformer f en une fonction de TF_Main, car j'en ai besoin pour l'appeler depuis l'exterieur ce qui ne marchera pas si la fonction est dans le bloc type .... end;

    Citation Envoyé par ShaiLeTroll
    Soit la variable globale généralement associé à une form, soit tu passe un paramètre en plus qui est une form de la classe TF_Main
    comment faire STP je suis pas fort en delphi.
    Merci d'avance

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    aah ok j ai pas vu le code. je vais essayer 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
    Si tu veux l'appeler de l'extérieur de la passe de 'private' en 'public' (copier/coller)

  7. #7
    Membre du Club
    Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Ce que je fais toujours, lorsque j'ai des fonctions que je dois utiliser dans des forms différents, c'est ajouter à mon projet une unité (donc un .pas sans .dfm) et j'ymets dedans toutes les fonctions communes... Exemple

    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
    unit iBase;
     
    interface
     
    uses
       Windows, Messages, Etc etc etc
     
    type
       function F( param divers ) : integer;
     
    (...)
     
    implementation
     
      function F( param divers ) : integer;
      begin
         // mon calcul
      end;
    (...)
    J'ai donc une unité iBase.pas sur disque. J'en fais le uses (Maj+F11) dans toutes les fiches où j'ai besoin de ma fonction F...

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par philnext
    Si tu veux l'appeler de l'extérieur de la passe de 'private' en 'public' (copier/coller)
    je l'ai essayé mais ca ne marche pas. En fait mon appel de l'exterieur sera depuis une dll, donc dans ma dll je fais appel à cette fonction et si cette fonction est déclarée comme TF_Main.f alors elle n'est pas visible dans la dll meme si elle est en public, à moins si j'ai pas mis la clauses export dans le bon endroit...
    Merci

  9. #9
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Ce que je fais toujours, lorsque j'ai des fonctions que je dois utiliser dans des forms différents, c'est ajouter à mon projet une unité (donc un .pas sans .dfm) et j'ymets dedans toutes les fonctions communes... Exemple
    si tu veux avoir acces à ta fonction à partir de toute tes form, la réponse de PaulR est très bonne. C'est également de cette façon que je procède !

  10. #10
    Membre habitué Avatar de aliwassem
    Inscrit en
    Janvier 2004
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 293
    Points : 157
    Points
    157
    Par défaut

    Pour moi avec les variables je les declarent dans la section Public comme par example dans la Form1 je declare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Var1,Var2 :string;
    et dans la Form2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form1.Var1 := ........;
    .....

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut ca marche + petit probleme
    Citation Envoyé par ShaiLeTroll
    Soit la variable globale généralement associé à une form, soit tu passe un paramètre en plus qui est une form de la classe TF_Main

    soit par soucis de logique objet, tu fais une méthode de classe qui prend en paramètre la form

    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
     
    unit FM_Main;
     
    interface
     
    uses  {...}
     
    type
      TF_Main = class(TForm)
        private {...}
        protected {...}
        public 
         function g (...):string;
         procedure h(....);
         class function f (r : string) : string;
         a: TADOConnection;
         b: TADOQuery;
     end;
     
     
    implementation
     
    function TF_Main.g(...):string;
    begin 
    {corps de la fonction g}
    end;
     
    procedure TF_Main.h(...);
    begin 
    {corps de la fonction g}
    end;
     
    class function TF_Main.f (r : string; const F_Main: TF_Main) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    C'est la solution qui me va le meiux, ca compile. merci.
    A moins j'ai une petite question: voici la fonction d'où j'appelle les autres variables de TF_Main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function GetTypeDeal(refcon : string; const F_Main: TF_Main): string;
    begin
       F_Main.AdoQuery1.Connection       := F_Main.ADOConnectionSophis;
       F_Main.ADOQuery1.SQL.Text := 'select sicovam from histomvts where refcon ='+ refcon ;
       F_Main.ADOQuery1.open;
       F_Main.ADOQuery1.SQL.Text:='select ADI_GETALLOTEMENT(' + F_Main.ADOQuery1.FieldByName('SICOVAM').AsString + ') as colonne from dual';
       F_Main.ADOQuery1.open;
       Result := F_Main.ADOQuery1.FieldByName('colonne').AsString;
    end;
    mais le problème c'est que à l'execution mon programe plante à la premiere ligne de cette fonction avec un message d'erreur de type EAccess Violation...
    Je ne sais pas d'ou ca vient! Je précise que ADOConnectionSophis est un champs du type TF_Main qui est une connexion à une certaine base de données. je crois qu'àprès l'appel de la fonction ces champs sont ignorés !!!! enfin j'en sais pas trop.

    Voyez vous le pb. Merci d'avance

  12. #12
    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
    Tu es sur que tu as fait le create de
    F_Main.AdoQuery1 ?

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    function f (r : string) : string;
    begin
    //Mon souci c'est comment avoir accès au variable a et b ainsi qu'à g et h
    end;
    Suggestion simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function f (r : string; frm : TF_Main) : string;
    begin     // accès aux trucs déclarés dans le type TF_Main donc valable pour  toutes les var Form1, Form2 créées statiquement ou dynamiquement à partir du type TF_Main 
                u:=frm.a;
                v:=frm.b;
                w:=frm.g (...):string;
                frm.h(....);
    end;
    Remarque : Comme a,b,g et h n'existent que dans le type TF_Main on ne peut évidemment pas remplacer le frm : TF_Main par frm : TForm en conséquence de quoi je laisserais la fonction f dans l'unité de déclaration du type TF_Main et éviterais de la mettre dans une "unité-caisse-à-outils-communs" qu'on trimballe d'une appli à l'autre.

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Ce que je fais toujours, lorsque j'ai des fonctions que je dois utiliser dans des forms différents, c'est ajouter à mon projet une unité (donc un .pas sans .dfm) et j'ymets dedans toutes les fonctions communes... Exemple
    Je fais de même sauf que mon unité-caisse-à-outils est un .pas AVEC .dfm
    Exemple :

    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
    unit uCaisseAOutils;
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Math, Buttons, ExtCtrls;
    
    type
      TFormCaisseAOutils = class(TForm)
        EditNumerique: TEdit;
        .....
        procedure EditNumeriqueKeyPress(Sender: TObject; var Key: Char); // ça marche même sans mettre cette procedure dans les déclarations publiques
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      FU1 : TFormCaisseAOutils;
    implementation
    
    {$R *.DFM}
    
    procedure TForm1.EditNumeriqueKeyPress(Sender: TObject; var Key: Char);
    begin     if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)])
              then Key := #0;
              if Key = DecimalSeparator
              then if Pos(DecimalSeparator, (Sender as TEdit).Text) <> 0 then Key := #0;
    end;
    ... et pour utiliser une procédure de la caisse à outils dans une autre unité, dans le cas de l'exemple ci-dessus je le fais avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormGen.FormCreate(Sender: TObject);
    begin   ...
              Edit1.OnKeyPress:=FU1.EditNumeriqueKeyPress;
              Edit8.OnKeyPress:=FU1.EditNumeriqueKeyPress;
              ...
    end;
    ... cela permet d'élargir le contenu de la caisse à outils à bon nombre de routines concernant des composants d'utilisation répétitive.

  15. #15
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Citation Envoyé par Gilbert Geyer
    type
    TFormCaisseAOutils = class(TForm)
    EditNumerique: TEdit;
    .....
    procedure EditNumeriqueKeyPress(Sender: TObject; var Key: Char); // ça marche même sans mettre cette procedure dans les déclarations publiques
    private
    { Déclarations privées }
    public
    je ne comprend pas ton commentaire...
    la procédure est EditNumeriqueKeyPress est public dans ce cas precis!!!
    au même titre que l'edit EditNumerique....

    en gros ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type
      TFormCaisseAOutils = class(TForm)
        EditNumerique: TEdit;
        ..... //cette partie est public aussi !!!
      private
        { Déclarations privées }
      public
        procedure EditNumeriqueKeyPress(Sender: TObject; var Key: Char);  
    end;
    c'est pareil...sauf qu'il faut assigner l'evenement par programmation


    Sinon moi je préfère ecrire un objet singleton qui sert de manager de tous mes globals necessaire à l'appli comme gestion des logs, messages, functions ou objet partagée etc....

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    A Kaféine, à propos de mon commentaire :
    type
    TFormCaisseAOutils = class(TForm)
    EditNumerique: TEdit;
    ..... //cette partie est public aussi !!!
    private { Déclarations privées }
    public
    Je reformule donc mon commentaire comme suit "ça marche même sans mettre la procedure EditNumeriqueKeyPress() dans la rubrique nommée Public, c'est à dire en la laissant devant la rubrique private, c'est à dire dans la partie qui se comporte de façon similaire à celle nommée explicitement Public".

    Et comme la déclaration de la procédure en question se place automatiquement devant la rubrique private lors de sa création je ne vois pas l'intérêt de la déplacer puisque ça marche.

    c'est pareil...sauf qu'il faut assigner l'evenement par programmation
    Ok sur "c'est pareil". Par contre dans tous les cas il faut assigner l'évènement par une ligne de code pour chacun des Edit concernés et si tous les Edit doivent être numériques cela peut se régler dans une boucle.

  17. #17
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Merci pour cette préscision.
    alors on est d'accord

  18. #18
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Kaféine :
    alors on est d'accord
    Oui ... mais même si tu n'étais pas d'accord t'as le droit d'avoir un point de vue différent

Discussions similaires

  1. Accès à une méthode d'une form depuis une autre autre form
    Par arngrimur dans le forum Windows Forms
    Réponses: 16
    Dernier message: 13/01/2012, 15h45
  2. Comment avoir accès aux écrans de notification
    Par DEV-10 dans le forum Administration
    Réponses: 7
    Dernier message: 05/09/2009, 10h44
  3. Acces aux control d'une form depuis une classe
    Par PhilCou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/07/2008, 09h59
  4. Réponses: 2
    Dernier message: 17/06/2008, 11h38
  5. [C++ 1.1] Comment avoir accès aux méthodes d'une dll ?
    Par jacklsurf dans le forum Framework .NET
    Réponses: 6
    Dernier message: 15/04/2006, 22h49

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