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 103 104 105 106 107 108 109 110
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, contnrs;
type
TMetaClass = class of TVehicule;
TVehicule = class(TObject)
constructor create(); virtual; abstract;
end;
TVoiture = class(TVehicule)
constructor create(); reintroduce;
end;
TForm1 = class(TForm)
Button2: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Déclarations privées }
Vehicules: TObjectList;
ListofObj: TStringList;
procedure registerClassByName(classe: TMetaclass);
function getClassByName(nom: string): TMetaclass;
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Enregistrer une classe
procedure TForm1.registerClassByName(classe: TMetaclass);
begin
// Ajout de la classe si elle n'est pas déjà référencée
if (ListofObj.IndexOf(classe.ClassName) = -1) then
begin
ListofObj.AddObject(classe.ClassName,TObject(classe));
end;
end;
// Obtenir une classe par son nom
function TForm1.getClassByName(nom: string): TMetaclass;
var
i : integer;
begin
// Recherche dans la liste des classByName
i := ListofObj.IndexOf(nom);
// si pas trouvé, on renvoie nil
if (i = -1) then
begin
result := nil;
end
// si trouvé, on renvoie la classe associée
else
begin
result := TMetaclass(ListofObj.objects[i]);
end
end;
constructor TVoiture.create();
begin
ShowMessage('Voiture créée!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Vehicules := TObjectList.Create();
ListofObj := TStringList.Create;
registerClassByName(TVoiture);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(Vehicules);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Vehicules.add(getClassByName(ListBox1.Items.Strings[ListBox1.ItemIndex]).Create());
end;
end. |
Partager