Tu peut aussi utiliser le pattern "Singleton"
1- pour cela tu doit déclarer dans l'unité où se trouve la declaration de ta fiche
A- une variable qui represente le nombre de reference à ta fiche (elle sera initialisée à 0)
B- une variable InternalInstance : TMaFiche c'est la une reference interne à ton unique instance
2- aussi tu doit modifier le constructeur et le destructeur en diminuant leur visibilité. Mais je sais pas si c'est faisable en Delphi, tu peut au lieu de ça interdir l'appele directe des constructeur/destructeur par un petit bidouillage (illustré dans le code)
3- Tu ajoutes deux fonctions :
class function GetSingleInstance:TMaFiche;
pour avoir une référence a ton instance unique
procedure ReleaseInstance;
pour libéré une référence a ton instance
4- pour finir voici un code d'exemple
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| unit U_MaFiche;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMaFiche = class(TForm)
private
{ Déclarations privées }
class procedure AddRef;
class procedure ReleaseRef;
public
// Constructeur et Destructeur protégé
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
// les Methodes à utilisé a la place du constructeur et destructeur
class function GetSingleInstance: TMaFiche;
procedure ReleaseInstance;
end;
var
MaFiche: TMaFiche;
implementation
{$R *.dfm}
var
InternalInstance: TMaFiche;
RefCount: Integer;
CanCallConstructor,
CanCallDestructor: Boolean;
{ TMaFiche }
constructor TMaFiche.Create(AOwner: TComponent);
begin
if CanCallConstructor then
inherited
else
raise Exception.Create('Impossible d''appelé directement le constructeur');
end;
destructor TMaFiche.Destroy;
begin
if CanCallDestructor then
inherited
else
raise Exception.Create('Impossible d''appelé directement le Destructeur');
end;
class procedure TMaFiche.AddRef;
begin
Inc(RefCount);
end;
class function TMaFiche.GetSingleInstance: TMaFiche;
begin
CanCallConstructor := True;
try
if not Assigned(InternalInstance) then
begin
RefCount := 0;
InternalInstance := Create(nil);
end;
AddRef;
Result := InternalInstance;
finally
CanCallConstructor := False;
end;
end;
procedure TMaFiche.ReleaseInstance;
begin
CanCallDestructor := True;
try
ReleaseRef;
if RefCount <= 0 then
begin
Free;
InternalInstance := nil;
end;
finally
CanCallDestructor := False;
end;
end;
class procedure TMaFiche.ReleaseRef;
begin
Dec(RefCount);
end;
initialization
InternalInstance := nil;
RefCount := 0;
CanCallConstructor := False;
CanCallDestructor := False;
end. |
N! c'est pas du code très securisé, je l'es ecrit juste pour illustrer mes propos.
==============================================
Bonne chance
Partager