Variable globale accessible partout

Résolu
haldrix Messages postés 4 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 3 avril 2006 - 30 mars 2006 à 12:20
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 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

5 réponses

cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 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

TMyFunction = class(TObject)
private
public
property Function2 : TMyFunction2 read FFunction1 write FFunction2;
end;

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)

enjoy.

Shining Freeman.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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;

RechargeTout;
...
end.

@+
Cirec
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 mars 2006 à 13:23
PS :
dans la première déclaration
unit sys;
interface
type
TFonctionsBDD = class(TObject)
Class(TObject) n'est pas utile.

unit sys;
interface
type
TFonctionsBDD = class Suffit amplement
private
public
procedure RechargeTout;
end;

@+
Cirec
0
haldrix Messages postés 4 Date d'inscription mercredi 23 juillet 2003 Statut Membre Derniè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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
31 mars 2006 à 12:26
une classe juste pour une procedure c'est pas terrible et ça sert pas a grand chose.

unit BDDFunc;

interface

uses ....

Procedure BDDUpdateAll( [Args] );

implementation

procedure BDDUpdateAll( [Args] );
begin
... code ...
end;

end;

voila, il suffirat de declarer l'unité dans les uses et d'appeler la procedure.

<hr size="2" width="100%">
0
Rejoignez-nous