Bonjour,
Je n'arrive pas à appeler une fonction définie dans une autre unité. Si cette fonction est dans la même unité que la procédure l'executant, pas de problème. Mais si je déplace le code de la fonction dans une autre unité, rien ne va plus (voir messages d'erreur plus bas).
Pourtant, dans le petit programme de test ci-dessous, ca fonctionne tres bien.
J'ai beau chercher partout (docs, internet), je ne trouve pas d'explication à ce problème :
Où placer la définition de la fonction, comment la codifier, y a-t-il des interdictions ?
Je teste dans tous les sens, mais rien n'y fait
Programme de test
1ere unité
==========
2eme unité
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 unit U_Fonction_et_unites; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, U_Fonction; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} // ===================================== procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption := MEF(12345); end; // ===================================== procedure TForm1.Button1Click(Sender: TObject); begin Application.Terminate; end; // ===================================== end.
Cela fonctionne parfaitement.
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 U_Fonction; interface uses SysUtils; type TFunction = function:String; function MEF(CleNum : Integer) : String; implementation // ====================================== function MEF(CleNum : Integer) : String; var CleAlpha : String; begin CleAlpha := 'Clé Alpha = ' + IntToStr(Clenum); Result := CleAlpha; end; // ===================================== end.
Mais dans des unités comportant beaucoup de procédures, j'obtiens le message :
Voici un extrait des mes deux unités :[Erreur] SFM_DM.pas(341): Identificateur non déclaré : 'MEF_CleAlpha'
[Erreur fatale] SFM_00.pas(156): Impossible de compiler l'unité utilisée 'SFM_DM.pas'
1- La fonction, dans SFM_00 :
2- L'unité executant la fonction
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 unit SFM_00; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, Menus, ComCtrls, Printers, IniFiles, idGlobal; type TSFM00 = class(TForm) ... function MEF_CleAlpha(WClenum: Integer): String; { Que je laisse cette instruction ou non, cela ne change rien } ... procedure Quitter1Click(Sender: TObject); ... private { Déclarations privées } public { Déclarations publiques } end; var SFM00: TSFM00; ... implementation uses SFM_DM; {$R *.dfm} // -------------------------------------------------------------------- // Fonction Mise en forme clé alpha // -------------------------------------------------------------------- function MEF_CleAlpha(WClenum: Integer): String; var ..... begin // Init Clé alpha (mise en forme) // =============================== ..... Result := R; end;
Comment et où déclarer cette fonction ?
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 unit SFM_DM; interface uses SysUtils, Classes, DB, DBTables, BDE, Dialogs, Windows, IniFiles, SFM_MD, DateUtils, Graphics; {uses Windows, Dialogs, DB, ComCtrls, } type private { Déclarations privées } public { Déclarations publiques } end; var SFMDM: TSFMDM; ... implementation uses SFM_00, SFM_01, SFM_13, SFM_02, SFM_CT; {$R *.dfm} // -------------------------------------------------------------------- // Init Clé alpha & Libelle "Radié" // -------------------------------------------------------------------- procedure TSFMDM.MembresCalcFields(DataSet:TDataSet); begin // Mise en forme Clé alpha membre MembresWCle_alpha.Value := MEF_CleAlpha(MembresA_AKLE.Value); end;
Partager