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 utiliser deux units pour une seule fiche


Sujet :

Delphi

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut comment utiliser deux units pour une seule fiche
    Bonjour.
    J'ai un petit problème avec une notion pour delphi7. Je souhaiterais pouvoir programmer deux unités, une principale et une auxiliaire, pour une seule fiche. Mon problème est de comprendre comment faire interagie les deux fiches.
    Je vous donne un code d'exemple :
    l'unité principale :

    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
    unit testdeuxunits;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      a:integer;
     
     
    implementation
    uses unit2;
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    a:=strtoint(edit1.text);
    showmessage(inttostr(a));
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
    b:integer;
    begin
    b:=valeurf(a);
    showmessage('la valeur de f est '+inttostr(b));
    end;
     
    end.
    l'unité auxillaire :


    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
    unit Unit2;
     
    interface
    uses testdeuxunits,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    var
    f:integer;
     
    implementation
     
    function valeurf(alpha:integer):integer;
    begin
     
    f:=alpha*10;
    end;
     
    end.


    Si je fait fonctionner directement la fonction f dans l'unité auxillaire, et je demande le résultat dans l'unité proncipale, ça marche. Le fait est que comme j'ai l'interface graphique dans l'unité principale, j'aimerais utiliser la fonction f définie dans unit2 dans l'unité testdeuxunits en utilisant la valeur a rentrée par l'utilisateur. Or ça m'affiche inlassablement b=0.
    Désolé de mon incompétance, mais je me forme un peu sur le tas par nécessité.
    merci

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut et bienvenue sur DVP.

    Ta fonction valeurf ne renvoie pas de valeur.

    Réécris la comme ceci, en affectant la valeur de retour à Result:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ValeurF(const Alpha: Integer): Integer;
    begin
      Result := Alpha * 10; 
    end;
    @+ Claudius

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    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
     
    unit testdeuxunits;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
     
      private
      public
      end;
     
    var
      Form1: TForm1;
     
     
    implementation
     
    {$R *.dfm}
     
    uses
      Unit2; 
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if TryStrToInt(Edit1.Text, unit2.Alpha) then
       showMessage( IntToStr(unit2.Alpha) );
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      showmessage('la valeur de f est '+ IntToStr(unit2.ValueF));
    end;
     
    end.
    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
    unit Unit2;
     
    interface
     
    function ValueF : integer;
     
    var
      Alpha : integer = 0;
      Multiplicator : integer = 10;
     
    implementation
     
    function ValeurF: integer;
    begin
      result := Alpha * Multiplicator;
    end;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    merci pour vos conseils.
    Effectivement il y avait un problème avec ma fonction.
    Je voudrais savoir en plus s'il y a possibilité d'utiliser la valeur rentrée dans le edit1 dans le l'unité auxiliaire... Je dois à terme modifier un programme plus gros, dans lequel une unité exterieure fait des calculs grace à des constantes lues dans l'unité principale, calcul dont je veux utiliser le résultat dans l'unité principale.
    Quel est la syntaxe pour appeler dans l'unité proncipale une procédure écrite dans l'unité auxiliaire ?
    Merci pour tout, vous me sauvez ma journée

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Tiens! Je profite du fait que le sujet ait été abordé pour poser une autre question en rapport avec celle-ci:
    Le petit morceau de code qui suit,
    Est-ce que ça fait une différence si on le met dans la section interface plutot que dans la section implémentation? En gros, puis-je le mettre avec les autres uses de l'Unit principale? (Je sais que ça marche, car c'est ce que je fais, mais je voulais savoir s'il y avait une convention...)

  6. #6
    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 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Dmognin :
    Quel est la syntaxe pour appeler dans l'unité proncipale une procédure écrite dans l'unité auxiliaire ?
    Pour utiliser, depuis l'Unit1 dont le uses contient Unit2, la function ValeurF(const Alpha: Integer): Integer; déclarée dans l'interface de l'Unit2 la sytaxe est toute simpliste il suffit d'écrire MonResultat:=ValeurF(Alpha).

    A DanCode :
    Les Uses ... Est-ce que ça fait une différence si on le met dans la section interface plutot que dans la section implémentation?
    Si l'Unit1 est la fiche principale dont le Uses de l'interface cite les autres unités auxquelles elle fait appel et que par exemple dans la Nième Unit on a besoin d'utiliser une routine située dans l'Unit1 dans ce cas pour éviter le problème du serpent qui se mord la queue (référencement circulaire) on cite l'Unit1 dans le uses de la partie implémentation de la Nième Unit.

    Au fait : ton histoire d'intégrales qui devait déboucher sur un problème de graphisme c'est fini ?

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    alors tu n'as pas l'air de savoir la différence entre INTERFACE et IMPLEMENTATION :

    l'interface est la partie visible d'une unité par les autres unités.
    l'implementation est la partie privée d'une unité, invisible par les autres unités.

    si tu déclarer l'unité 1 dans l' interface use de l'unit2, 3 ou 4 il y aura redondance d'appel cyclique d'unité.

    les unité "auxiliaire" peuvent être appelé indifférement dans l'interface use ou l'implementation use.
    l'unité principale, par contre, ne s'appelle que dans l'implementation use des unité "auxiliaire", on essayera plutot de ne pas avoir à la déclarer dans les unité auxiliaire pour ne pas empecher la réutilisabilité de ces dernières.
    on préféra donc mettre en place un systeme de Set/Get via des fonctions par exemple pour definir les valeurs dans les unités auxiliaire.

    ce qui donne :

    ProjetX.dpr -> le projet principal
    Xmain.pas -> unité principale du projet

    Xtypes.pas -> unité auxiliaire contenant les types
    Xconsts.pas -> unité auxiliaire contenant les constantes
    Xutils.pas -> unité auxiliaire contenant les fonctions outils
    Xclass.pas -> unité auxiliaire contenant les classes

    voyont les clause uses de chaques unités :

    ProjetX.dpr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    program ProjetX;
     
    uses
     TFormX in 'XMain.pas',
     XTypes in 'XTypes.pas',
     XConsts in 'XConsts.pas',
     XUtils in 'XUtils.pas',
     XClass in 'XClass.pas';
     
    begin
      { ... }
    end.
    Xmain.pas :
    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
     
    unit XMain;
     
    interface
     
    uses
      Windows, SysUtils, Classes, Controls, Dialogs, Messages, Forms,
      XUtils, XClass;
     
    type
      TFormX = class(TForm)
      {...}
     
    implementation
     
    uses
      XTypes, XConsts;
     
    { ... }
     
    end.
    XTypes.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    unit XTypes;
     
    interface
     
    uses
      Windows, SysUtils;
     
    type
      { ... }
     
    implementation
     
    end.
    XConsts.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unit XConsts;
     
    interface
     
    const
      { ... }
     
    implementation
     
    end.
    XUtils.pas :
    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
     
    unit XUtils;
     
    interface
     
    uses
      Windows, SysUtils, XTypes, XConsts;
     
    function { ... }
    procedure { ... }
     
    implementation
     
    function { ... }
    begin
      { ... }
    end;
     
    procedure { ... }
    begin
      { ... }
    end;
     
    end.

    XClass.pas :
    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 XClass;
     
    interface
     
    uses
      Windows, SysUtils, Classes, XTypes, XConsts, XUtils;
     
    type
      TX = class
        { ... }
      end;
     
    implementation
     
     
    { TX }
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  8. #8
    Membre à l'essai
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    OK merci pour la clarification.

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    merci vous êtes parfait

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

Discussions similaires

  1. Comment utiliser plusieurs models pour une seule vue
    Par jérémyp8 dans le forum ASP.NET MVC
    Réponses: 11
    Dernier message: 09/07/2020, 23h22
  2. Réponses: 6
    Dernier message: 30/04/2008, 00h24
  3. Deux mappings pour une seule et même classe
    Par myocean dans le forum Hibernate
    Réponses: 3
    Dernier message: 18/04/2008, 16h43
  4. utiliser deux formulaire avec une seule action
    Par fouyou dans le forum Struts 1
    Réponses: 4
    Dernier message: 28/05/2007, 20h40

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