Variable globale accessible partout [Résolu]

haldrix 4 Messages postés mercredi 23 juillet 2003Date d'inscription 3 avril 2006 Dernière intervention - 30 mars 2006 à 12:20 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 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
Afficher la suite 

5 réponses

Répondre au sujet
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 31 mars 2006 à 02:04
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_shining
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 mars 2006 à 13:18
0
Utile
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
Commenter la réponse de Cirec
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 mars 2006 à 13:23
0
Utile
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
Commenter la réponse de Cirec
haldrix 4 Messages postés mercredi 23 juillet 2003Date d'inscription 3 avril 2006 Dernière intervention - 30 mars 2006 à 15:10
0
Utile
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
Commenter la réponse de haldrix
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 31 mars 2006 à 12:26
0
Utile
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%">
Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.