Comment utiliser une classe d'un paquet chargé dynamiquement ?
Je ne connaissais pas du tout l'utilisation dynamique des paquets.
J'ai donc regardé ce tutoriel : http://sjrd.developpez.com/delphi/tutoriel/compoplugin/ (Surtout les chapitres I - B, I - C, I - E)
Comme conseillé dans le chapitre 'I - E', j'ai créé une classe ancêtre :Puis, la classe du paquet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 TClassTestAncetre = class(TComponent) public procedure Test; virtual; abstract; function GetDate: String; virtual; abstract; end;Et enfin, mon application faisant appel au paquet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 TClassTest = class(TClassTestAncetre) public procedure Test; override; function GetDate: String; override; end; ... procedure TClassTest.Test; begin ShowMessage('Test'); end; function TClassTest.GetDate: String; begin Result := FormatDateTime('dd/mm/yyyy', Now); end; ... initialization RegisterClass(TClassTest); finalization UnregisterClass(TClassTest); end.Et j'obtiens une violation d'accès sur la création de l'objet Instance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TForm1.BtnClasseTestClick(Sender: TObject); var Module: HMODULE; Classe: TPersistentClass; Instance: TClassTestAncetre; // Instance: TClassTest; begin Module := LoadPackage(NOM_PAQUET); if Module <> 0 then begin try Classe := GetClass('TClassTest'); if Assigned(Classe) then begin if Classe.InheritsFrom(TClassTestAncetre) then begin Instance := TClassTestAncetre(Classe).Create(nil); // <<-- Plante ici ! try Instance.Test; finally Instance.Free; end; end else ShowMessage('not Classe.InheritsFrom(TClassTestAncetre) !'); end else ShowMessage('not Assigned(Classe) !'); finally UnloadPackage(Module); end; end; end;
Que ce soit une variable de type TClassTest ou TClassTestAncetre n'y change rien.
Qu'est ce que j'ai raté ?
Partager