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 :

Problème de déclaration


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Par défaut Problème de déclaration
    bonjour tlm,
    j'ai utilisé une procedure, mais au moment de l'execution ya un message d'erreur m'indiquant que la procedure n'est pas déclaré,alors je l'ai déclaré dans l'unit1,mais tjrs le msg d'erreur sachant que cette procedure est utilisé par unit1 et unit3.
    ou devrais-je la déclaré.
    merci

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    si tu utilise une procedure de unit1 dans unit3, il faut rajouter unit1 a la liste de uses de Unit3.

    apres, verifie que tu utilises bien la procedrue avec les bon parametres ...

    Sinon ton message n'est pas tres tres clair ... et demande quelques precisions

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Par défaut
    en vérifiant unit1 été dans la liste des uses de unit3,j'ai déclaré la procédure ds unit 1 et3,mnt j'ai les msg d'erreur suivant:
    not enough actual parameters
    Unsatisfied forward or external declaration

  4. #4
    Membre expérimenté
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Par défaut
    Lorsque tu as écrit ta procédure dans Unit1 tu as pensé a rajouter devant le nom de la form devant?

    comme ceci
    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
    Unit Unit1
    
    interface
    
    Uses (...)
    
    Type
      TForm1 = class(TForm)
      ...
      Procedure MaProcedure;
      private
      public
      end;
    
    Var 
      Form1 : TForm1;
    
    implementation
    
    {$R *.DFM}
    
    Procedure TForm1.MaProcedure;
    Begin
    End;

  5. #5
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par sofianoo
    en vérifiant unit1 été dans la liste des uses de unit3,j'ai déclaré la procédure ds unit 1 et3,mnt j'ai les msg d'erreur suivant:
    not enough actual parameters
    Unsatisfied forward or external declaration
    Si ta procedure est declaree dans unit1, tu n'as pas besoin de la declarer dans unit3 ... quand a l'erreur forward c'est parce que tu as du la declarer mais pas l'implementer.

    Ensuite il y a aussi la portee des fonctions.
    Je pense que ca vient de la.
    Si tu declare une fonction dans implementation elle est declare localement a l'unitee donc non exportable. Il faut declarer son prototype dans interface pour qu'elle puisse etre utilisé ailleur.

    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Unit1;
    Interface
     
    Implementation
     
    procedure MaProc;
    Begin
    [...]
    End;
    Ca c'est une procedure locale a unit1 et untilisable uniquement ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Unit1;
    Interface
     
    Procedure MaProc;
     
    Implementation
     
    Procedure MaProc;
    Begin
    [...]
    End;
    Ici, le prototype de la declaration dans la section interface rend la procedure publique et pourra etre utilise dans toutes les unitees qui inclu Unit1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Unit3;
    Interface
     
    Uses Unit1;
     
    Implementation
     
    Procedure UneProcedure;
    Begin
    MaProc;
    End;
    Ici le code est exact et l'appel a MaProc correct car j'ai inclut Unit1 dans la liste des uses.
    A noter que ca ne marche que dans le 2e cas de declaration (publique) sinon bien sur que ca ne marchera pas car MaProc sera limité a unit1 ....

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Par défaut
    j'ai suivi vos coseil mais je sais pas pkoi ça marche pas voici un bout de mon pg:
    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
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls, DBCtrls, StdCtrls, Mask, DB, DBTables, XPMan,
      JvExControls, JvGradient, Grids, DBGrids, Buttons, JvButton,
      JvNavigationPane;
    
    type
      TForm1 = class(TForm)
        
      private
        { Private declarations }
      public
        procedure Ma_proc(Sender: TObject);{ Public declarations }
      end;
    
    var
      Form1: TForm1;
      NombrePages:integer;
    
    implementation
    
    uses Unit2, Unit3, Unit4, Unit5;
    
    {$R *.dfm}
    procedure Ma_proc;
    begin
    end;
    
    procedure TForm1.SpeedButton7Click(Sender: TObject);
     var Rech:integer;
    begin
    Rech:=strtoint(inputbox('Rechercher','Entrer le numéro de l''offre','1'));
    if not table1.FindKey([rech])then
    begin
    messagedlg('Le Numéro de l''offre que vous avez saisie n''existe pas',
                mtinformation,[mbok],0);
    end;
    table1.Edit;
    table1.Post;
    table2.Edit;
    table2.Post;
    QuickReport4.Query1.active:=false;
    QuickReport4.Query1.Params[0].value:=strtoint(DBEdit7.Text);
    QuickReport4.Query1.active:=true;
    QuickReport4.Prepare;
    NombrePages:=QuickReport4.QRPrinter.PageCount;
    QuickReport4.QRPrinter.Free;
    QuickReport4.QRPrinter := nil;
    Ma_proc;
    QuickReport4.PREVIEW;
    end;
    
    
    end.
    le pb c'est que méme dans unit1 j'ai les messages d'erreur suivant:
    [Error] Unit1.pas(215): Not enough actual parameters
    [Error] Unit1.pas(77): Unsatisfied forward or external declaration: 'TForm1.Ma_proc'
    [Fatal Error] Mon_prog.dpr(8): Could not compile used unit 'Unit1.pas'

  7. #7
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    bonjour,

    ou tu fais

    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
    type
      TForm1 = class(TForm)
        
      private
        { Private declarations }
      public
        procedure Ma_proc(Sender: TObject);{ Public declarations }
      end;
    
    implementation
    
    uses Unit2, Unit3, Unit4, Unit5;
    
    {$R *.dfm}
    procedure TForm1.Ma_proc(Sender: TObject);
    begin
    end;
    
    
    QuickReport4.QRPrinter := nil;
    Ma_proc(self);
    QuickReport4.PREVIEW;
    mais je ne vois pas comment tu feras pour l'utiliser dans unit3.

    ou bien

    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
    type
      TForm1 = class(TForm)
        
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    procedure Ma_proc(monparamêtre : TmonParamêtre);
    
    
    implementation
    
    uses Unit2, Unit3, Unit4, Unit5;
    
    {$R *.dfm}
    procedure Ma_proc(monparamêtre : TmonParamêtre);
    begin
    end;
    
    
    QuickReport4.QRPrinter := nil;
    Ma_proc(Paramêtre);
    QuickReport4.PREVIEW;
    avec utilisation possible dans unit3


    dans ton cas,
    1) tu utilise une méthode déclarée comme procedure de TForm1 donc
    elle doit être implémentée comme tel. tu l'as implémentée comme une procédure interne de l'unit.

    2) tu utilise une procédure de Tform1 sans paramêtre alos que tu l'as déclarée avec paramêtre.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Par défaut
    dans mon cas ya pas de paramétre donc je dois la déclaré sans paramétre?

  9. #9
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    bah oui.

  10. #10
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Par défaut
    alors je bloc ou j'ai loupé qque chose!! je l'ai declaré dans public comme suit
    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
    public
        procedure Mr_Melle(Sender: TObject);{ Public declarations }
      end;
    var
      Form1: TForm1;
      NombrePages:integer;
    
    implementation
    
    uses Unit2, Unit3, Unit4, Unit5;
    
    {$R *.dfm}
    procedure Mr_Melle(Sender: TObject);
    begin
    if (form2.combobox2.itemindex=0)or
       (form2.combobox2.itemindex=1)or
       (form2.combobox2.itemindex=2)or
       (form2.combobox2.itemindex=3)then
    begin
    QuickReport4.QRlabel27.Caption:='Mr.';
    end
    else
    if (form2.combobox2.itemindex=5)then
      begin
      QuickReport4.QRlabel27.Caption:='Melle.';
      end
      else
        if (form2.combobox2.itemindex=4) then
          begin
            QuickReport4.QRlabel27.Caption:='';
          end;
    end;
    procedure TForm1.SpeedButton5Click(Sender: TObject);
    begin
    table1.Edit;
    table1.Post;
    table2.Edit;
    table2.Post;
    QuickReport4.Query1.active:=false;
    QuickReport4.Query1.Params[0].value:=strtoint(DBEdit7.Text);
    QuickReport4.Query1.active:=true;
    QuickReport4.Prepare;
    NombrePages:=QuickReport4.QRPrinter.PageCount;
    QuickReport4.QRPrinter.Free;
    QuickReport4.QRPrinter := nil;
    Mr_Melle(self);
    QuickReport4.PREVIEW;
    end;
    mais il ya ce msg
    [Error] Unit1.pas(77): Unsatisfied forward or external declaration: 'TForm1.Mr_Melle'
    [Fatal Error] OFFRE_DES_PRIX.dpr(8): Could not compile used unit 'Unit1.pas'

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

Discussions similaires

  1. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28
  2. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  3. problème de déclaration
    Par dirty_boy dans le forum C
    Réponses: 2
    Dernier message: 16/09/2005, 11h56
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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