Salut Caribou !
150 TForm dans un seul EXE, j'ai connu ^_^ !
TActionList, ah bien, ça donne une idée du style, un peu plus rigoureux que des event handler direct !
Une gestion des habilités ! ouais classique
Ok, je vois, bon je suppose que créer les fenêtres une par une dans une bouche serait trop pénible, question de contexte pour le Create de la TForm, tu as besoin de DB ou d'objet métier !
Phase 1 :
Enumération des fenêtres !
Méthode 1
- Voir si l'on peut choper les ressources dans l'exe, tu cherches toutes les ressources qui commence par TPF0, avantage peu de code, faut juste savoir explorer la liste de ressources, j'ai jamais essayé, je suppose que c'est uniquement via API EnumResourceNames avec une CallBack, une TStringList pour stocker les noms de Classes
Un THabilitesManager aurait la TStringList et une méthode RegisterFormResourceName(String AResourceName);
THabilitesManager.RegisterFormResourceName(lpszName); // lpszName = LPTSTR = PChar = PAnsiChar ou PWideChar selon Delphi, StrPas est implicite selon mes souvenirs
Avantage, pas de code à maintenir si de nouvelles fenêtres sont ajoutées et pas plus pour les anciennes auxquelles ont ajoute des ActionList
Méthode 2
- Une vraie "Class Registry", avec une TClassList interne, tu ajoutes dans la section Initialization l'appel à RegisterForm(TFormClass AClass);
C'est proche de la proposition de popo, mais plusieurs avantages : chaque fenêtre reste indépendante pas besoin d'avoir un uses de 150 unités pour le Register
On gère au niveau Classe et non pas au niveau Instance
juste qu'une fois la classe enregistrée, on a pas besoin de maintenir le register pour chaque TActionList ajouté, on peut même comparer la DB qui stocke les droits avec l'état courant du dernier exe
Cela peut ainsi permettre d'ajouter automatiquement une valeur par défaut et avertir l'administrateur de nouveaux menus sans habilité
Par contre, le Register il ne faut pas l'oublier dans Initialization et cela disperse le code, c'est un petit défaut
C++Builder :
THabilitesManager::RegisterForm(__classid(TMaClasseDuFichier));
Delphi (je suis rouillé) :
THabilitesManager.RegisterForm(TMaClasseDuFichier);
Comme la ressouce à le nom de la TForm, c'est facile de retrouver la ressource
Méthode 1
RegisterForm c'est
1 2
| FRegisteredResNameList: TStringList;
FRegisteredResNameList.Add(AResourceName); |
Méthode 2
RegisterForm c'est
1 2
| FRegisteredClassList: TClassList;
FRegisteredClassList.Add(AClass); |
Méthode 1
TResourceStream.Create(FindResourceHInstance(FindClassHInstance(TMaClasseDuFichier)), FRegisteredResNameList[i], PChar(RT_RCDATA));
Méthode 2
new TResourceStream(FindResourceHInstance(FindClassHInstance(TMaClasseDuFichier)), FRegisteredClassList[i].ClassName, PChar(RT_RCDATA));
Phase 2 :
Pseudo Fenêtre !
Tu utilises un TComponent, un TResourceStream, la méthode TStream.ReadComponent pour charger la ressources
1 2 3 4
| var
MaForm: Component;
MaForm := ResourceStream.ReadComponent(nil); |
Ensuite, un ComponentCount pour trouver le ActionList par sa Classe (InheritsFrom ou is)
1 2 3 4 5 6
| for (int i = 0; i < MaForm->ComponentCount; i++)
{
if (MaForm->Components[i]->InheritsFrom(__classid(TActionList)))
//if MaForm.Components[i] is TActionList then
là facile ... tu as un TActionList
} |
la Méthode 2 en code
1 2 3 4 5 6 7 8 9 10 11
| class THabilitesManager : public TObject
....
private
static THabilitesManager* FSingleton;
TClassList* FRegisteredFormClassList;
public
static THabilitesManager* GetInstance();
static void RegisterForm(TFormClass AClass);
__property RegisteredFormClassCount = {read=GetRegisteredFormClassCount};
__property RegisteredFormClasses[int Index] = {read=GetRegisteredFormClass}; |
1 2 3 4 5 6 7 8 9 10 11 12 13
|
/*static*/ THabilitesManager* THabilitesManager::GetInstance()
{
if ( ! FSingleton)
FSingleton = new THabilitesManager(); // Thread Unsafe !!!
return FSingleton;
}
/*static*/ void THabilitesManager::RegisterForm(TFormClass AClass)
{
GetInstance()->RegisteredFormClassList->Add(AClass);
} |
Partager