Accéder à une variable d'une unité, dans une autre unité

Accéder à une variable d'une unité, dans une autre unité - Delphi/Pascal - Programmation

Marsh Posté le 25-04-2003 à 10:15:57    

Slt.
Nouveau petit problème, cette fois-ci,
j'ai déclaré et rempli un tableau dans une
unité2 et je désire l'utiliser dans une unité1.
Il est déclaré en tant que variable globale,
cad avant l'implémentation, et j'ai bien mis
l'unité2 dans le uses de l'unité1.
Je ne comprends pas pourquoi il ne peut pas
y accéder..
Faut-il obligatoirement créer un héritage ??
 
Merci.

Reply

Marsh Posté le 25-04-2003 à 10:15:57   

Reply

Marsh Posté le 25-04-2003 à 10:30:50    

Bon alors, par ou commencer?
 
je crois que le prob c'est que tu a déclaré une classe dans unit2 et une variable ds unit1 . Pr acceder à ton tableau, tu dois passer par cette variable.
 
j'vais te donner un exemple, tu comprendra mieux [:xman]  
 
ds unit1 tu as qqch du style

Code :
  1. uses unit2.pas


 
ds unit2 tu dois avoir qqch du style

Code :
  1. type Tform2 //par ex
  2. public
  3. tab1:array of string;//le tableau
  4. ...
  5. private
  6. ....
  7. protected
  8. ....


 
Si tu reviens ds unit1 qqpart il doit y avoir

Code :
  1. var
  2. form2:Tform2
  3. ...


du coup, pour acceder à ton tableau, tu dois taper  

Code :
  1. Form2.tab1[i]


 
Alors, j'ai bon??
 :whistle:

Reply

Marsh Posté le 25-04-2003 à 10:51:50    

Ben en fait, je viens de tester comme ça :
 
Dans unit2 :
 

Code :
  1. type
  2.   TMenu2 = class
  3.   public
  4.     tab: Array of string;
  5. var
  6.   Menu2: TMenu2;


 
 
Dans unit1 :
 

Code :
  1. uses unit2
  2. Menu2.tab // utilisé dans une procédure


 
 
Ca compile très bien, mais à l'exécution, ya
un problème de violation d'accès à une certaine adresse..
 
 
 

Reply

Marsh Posté le 25-04-2003 à 11:00:19    

ça c'est parce que tu utilise un tableau dynamique.
 
tu dois utiliser setlength pr initialiser ton tableau

Reply

Marsh Posté le 25-04-2003 à 11:09:48    

J'ai utilisé SetLength dans unit2 !!
 
Mais en fait, je viens de m'apercevoir que
ça merde juste avant que je fasse appelle
à ce tableau dans unit1.
Ca merde lorsque, dans unit1, je fais appel
à une procédure de unit2 en faisant :
Menu2.procedure
 
Pourtant, ça marche avec d'autres choses..
Je vais voir tout ça, je pense que je vais
trouver l'erreur..   :)

Reply

Marsh Posté le 25-04-2003 à 11:15:55    

doit y avoir un objet (menu2 par ex) qui est pas instancé ou un truc du genre [:spamafote]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 11:20:07    

L'erreur se produit lorsque je fais

Code :
  1. SetLength(tab,100) // par exemple


 
mais uniquement lorsque tab est déclaré
dans la partie public !!!
Je l'ai remis dans la partie var
et ça marche sans problème..........
... à part que je n'y ai plus accès dans unit1 !!!!  :fou:

Reply

Marsh Posté le 25-04-2003 à 11:22:08    

dans var au niveau de interface ou au niveau de implementation ? c'est dans la 1e partie
et y a pas de raison que tu n'y aies pas accès


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 11:34:22    

c'est déclaré dans var de l'interface !!
et qd je le mets dans public dans interface ==> erreur..
 
Et dans var de interface, je n'y ai pas accès
dans l'unit1 en faisant Menu2.tab   :fou:

Reply

Marsh Posté le 25-04-2003 à 11:35:15    

heu si tu le mets hors de la classe tu dois pas mettre menu2. devant vu que c'est le nom de l'objet (instance de la classe)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 11:35:15   

Reply

Marsh Posté le 25-04-2003 à 11:38:26    

HAAAAAAAAAA !!!!
OK, merci bcp, ça marche !!!!
 
Mais je pensais que c'était dans la classe..
Je croyais que ma classe représentait TOUTE l'unité !
 
On en apprend tous lesjours !!
Merci !!!!  :jap:  :jap:  
Et Bounty aussi !!  :jap:  :jap:

Reply

Marsh Posté le 25-04-2003 à 11:42:50    

Si jamais tu as des "tab" ailleurs et qu'il y a un risque de confusion, tu peux mettre unit2.tab pour préciser que c'est le tav de unit2 que tu veux utiliser


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 11:52:42    

Ndmax a écrit :

HAAAAAAAAAA !!!!
OK, merci bcp, ça marche !!!!
 
Mais je pensais que c'était dans la classe..
Je croyais que ma classe représentait TOUTE l'unité !
 
On en apprend tous lesjours !!
Merci !!!!  :jap:  :jap:  
Et Bounty aussi !!  :jap:  :jap:  


De rien
pour etre complet j'ajouterai qu' une classe se definit comme suis:
 
ds la partie interface

Code :
  1. type
  2.   Tclass1=class
  3.     private
  4.     variable1:string;
  5.     procedure xyz;
  6.     protected
  7.     public
  8.     //ne pas oublier le constructeur et le destructeur à placer  ici
  9.   end;
  10.   Tclass2=class
  11.     private
  12.     protected
  13.     public
  14.   end;
  15. end;//fin declaration des types


et dans la partie implementation:

Code :
  1. procedure Tclass1.xyz
  2. var
  3. a:string;
  4. begin
  5. variable1=a;//exemple à la con mais bon
  6. end;


Message édité par bounty le 25-04-2003 à 11:53:28
Reply

Marsh Posté le 25-04-2003 à 11:58:58    

Ok, merci !!  :jap:  
 
Mais je n'utilise jamais de constructeurs
et destructeurs...
Il faut absolument s'en servir ??
 
En fait, je connais bien le Java,
mais je ne sais pas si c'est la même chose.
Déjà en Java, pas besoin de destructeur,
c'est automatique..
 
Ici, je ne me sers que des uses pour utiliser
d'autres "unités" ou "classes" mais jamais les
contructeurs qu'il faut créer soi-même..

Reply

Marsh Posté le 25-04-2003 à 12:00:14    

Tiens tant qu'on y est, si tu commences en Delphi et qu'on ne t'impose pas de conventions d'écriture particulières, il vaut mieux suivre les recommendations de Borland au niveau de l'écriture du code :
http://community.borland.com/artic [...] 80,00.html
Si tout le monde utilise un même standard c'est plus agréable pour l'échange d'infos ;)
Et le Pascal étant justement assez lisible, autant l'écrire de manière à ce qu'il le reste :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 12:02:24    

Ndmax a écrit :

Mais je n'utilise jamais de constructeurs
et destructeurs...
Il faut absolument s'en servir ??


 
Si ta classe a des autres classes qu'elle doit libérer (.Free), il faut mettre ça dans le destructeur. Idem s'il y a des opérations à faire lorsque tu détruis l'objet.
Pour le constructeur, c'est surtout pour l'initialisation de données que tu peux en avoir besoin. Sinon il y a un constructeur par défaut (.Create) qui vient du TObject (toutes les classes descendent obligatoirement de TObject même si on ne le spécifie pas)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-04-2003 à 12:23:52    

OK, je savais que toutes les classes
descendaient de TObject, comme en Java d'ailleurs ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed