haldrix
Messages postés4Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention 3 avril 2006
-
30 mars 2006 à 12:20
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
31 mars 2006 à 12:26
Bonjour,
je voudrais créer un objet accéssible partout dans mon application,
un objet un peu comme system en java, ou en delphi.
c'est a dire que je veux pouvoir dire dans une de mes classes quelquechose du style:
system.FonctionsBDD.RechargeTout; OK?
Pour l'instant voila comment je m'y prend:
dans un fichier 'sys.pas' (car system existe deja),
je declare mon objet 'FonctionsBDD' comme un descendant de TObject
et dans FonctionsBDD, je declare 'procedure RechargeTout' :
unit sys;
interface
type
TFonctionsBDD = class(TObject)
private
public
procedure RechargeTout;
end;
var
FonctionsBDD : TFonctionsBDD ;
implementation
end.
Ensuite,
dans un autre fichier, qui a besoin d'utiliser la fonction 'rechargeTout',
je met 'uses sys'
et je peux acceder aux fonctions:
unit ma_class;
interface
uses
sys;
...
implementation
...
sys.FonctionsBDD.RechargeTout;
...
end.
MAIS LE PROBLEME c'est que je ne sais pas ou mettre le
sys.FonctionsBDD : = TObject.create Du coup a la compilation ca passe mais a l'execution j'ai une erreur du style 'violation d'acces..'
Voila si vous avez une idee je preneur.
Merci d'avance,
michel
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 31 mars 2006 à 02:04
effectivement TMyFunction = class suffit amplement car delphi d'une manière interne va interprété celà comme étant TMyFunction = Class(TObject) mais il est fortement recommander d'écrire class(TObject) pour une meilleur visisibilité du code, car en effet TMyFunction = class; indique à Delphi que notre programme utilise une classe accessible plus loin ...
exemple
certes !!!, on peut toujours mettre TMyFunction2 juste avant .., mais il ya des cas particuliers où il est difficile de mettre toutes les classes dans l'ordre croissant d'où cette 'surcharge de classes'.
maintenant revenons à nos boutons euhh moutons....
arf sys comme nom d'unité pas vraiment top !!!, mieux vaut renommé l'unité en "Shared.pas"
unit Shared;
interface
type
TFonctionsBDD = class(TObject)
private
public
procedure RechargeTout;
end;
var
FonctionsBDD : TFonctionsBDD ;
implementation
// on peut voir ça comme un evenement OnCreate de l'unité "Shared" et non pas FonctionsBDD
Initialization
FonctionsBDD := TFonctionsBDD.Create;
// evenement OnDestroy de l'unité "Shared"
Finalization
FonctionsBDD.Free;
FonctionsBDD := Nil; // c'est le fameux FreeAndNil
end.
comment ça marche ?
Dès qu'une unité quelconque aura dans sa clause Uses "Shared" la classe FonctionsBDD sera instancié(qu'une seule fois), autrement dit si une autre unité fait appel à celle-ci et qu' la classe a déja été instancié, il n'y aura donc pas de doublure !!, ça permet ainsi de partager FonctionsBDD avec toute l'application
inutile de détruire FonctionsBDD , cette classe sera egalement automatiquement détruite(voir Finalization)
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 30 mars 2006 à 13:18
Salut,
ta violation d'accès viens du fait que tu à créer une classe et lors de l'utilisation dans ce cas il faut, avant l'appel de la procédure, créer l'objet qui contient la procédure a appeler si non ben une erreur se produit.
unit sys;
interface
type
TFonctionsBDD = class(TObject)
private
public
procedure RechargeTout;
end;
var
FonctionsBDD : TFonctionsBDD ; Pas utile implementation
Procedure TFonctionBDD.RechargeTout;
Begin
....
End;
end.
Utilisation :
unit ma_class;
interface
uses
sys;
...
implementation
...
With TFonctionsBDD.Create do
Begin
sys.FonctionsBDD.RechargeTout;
Free;
End;
...
end.
Où encore comme ceci :
unit sys;
interface
procedure RechargeTout;
implementation
Procedure RechargeTout;
Begin
.......
End;
end.
Utilisation :
unit ma_class;
interface
uses
sys;
...
implementation
...
sys.RechargeTout;
Où
RechargeTout;
...
end.
haldrix
Messages postés4Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention 3 avril 2006 30 mars 2006 à 15:10
En fait voila comment je fais:
j'ai laissé comme c'était (sauf pour la déclaration de la classe, merci, a present je met juste Tfonction = class )
mais en bas de mon unite apres l'implementation et tout ca, j'utilise Initialization,
ca permet de creer une variable au chargement de l'unité, c'est ce que je voulais, elle est ensuite detruite a la fermeture de l'application.
Une chose que je me demande c'est est-ce que si je met dans plusieurs fichiers le 'uses sys;' ca va creer plusieurs fois ma variable TFonctionBDD, ou est ce qu'elle n'est créée qu'une seule fois au demarrage de l'application.
Moi ce que je désire c'est la créer qu'une seule fois.
Voila merci pour tout.
Surtout pour la rapidite des reponses.
Michel
Vous n’avez pas trouvé la réponse que vous recherchez ?