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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    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 Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    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
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    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

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    aah ok j ai pas vu le code. je vais essayer Merci

  5. #5
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Si tu veux l'appeler de l'extérieur de la passe de 'private' en 'public' (copier/coller)

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    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

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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;
    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

  8. #8
    Membre confirmé
    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
    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...

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    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

  10. #10
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Tu es sur que tu as fait le create de
    F_Main.AdoQuery1 ?

  11. #11
    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
    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.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    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
    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.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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