2009-06-25 5 views
2

Nous utilisons C++ Builder pour une application dont les formulaires sont conservés à l'extérieur du fichier EXE dans une base de données. Le code de l'application est C++Automatisation de RegisterClass dans C++ Builder VCL

Cela nous permet de modifier les formulaires et les formulaires/actions sans recompiler. Voici un extrait de code qui permet de charger un formulaire.

RegisterClass(__classid(TButton)); 
RegisterClass(__classid(TEdit)); 
RegisterClass(__classid(TRadioGroup)); 
RegisterClass(__classid(TGroupBox)); 
RegisterClass(__classid(TCheckBox)); 
RegisterClass(__classid(TRadioButton)); 
RegisterClass(__classid(TTimer)); 
RegisterClass(__classid(TListBox)); 
RegisterClass(__classid(TComboBox)); 
RegisterClass(__classid(TBitBtn)); 
RegisterClass(__classid(TSpeedButton)); 
RegisterClass(__classid(TMaskEdit)); 
RegisterClass(__classid(TProgressBar)); 

ms = new TMemoryStream; 
ms2 = new TMemoryStream; 

// Loading Module into Memory Stream 
ms->Position = 0; 
ms->LoadFromFile(Filename->Text); 
ms->Position = 0; 
pModule = new TForm(this); 

// Reading Module Definition 
if(!Inputisbin->Checked) 
{ 
     ms2->Position = 0; 
     ObjectTextToBinary(ms, ms2); 
     ms2->Position = 0; 
     ms2->ReadComponent(pModule); 
} 
else 
     ms->ReadComponent(pModule); 


Log->Lines->Add("Displaying Module"); 
pModule->Show(); 

Je suis curieux de savoir s'il y a des fonctions intégrées que je peux appeler pour enregistrer toutes les classes référencées. Je suppose qu'il est possible de scanner moi-même le flux mémoire ou le fichier de tous les objets et d'appeler RegisterClass pour chacun d'eux, mais j'espérais que quelqu'un connaissait la fonction qui l'avait déjà fait. En tant que tel, tous les formulaires n'utilisent pas toutes ces classes, donc il serait bien d'enregistrer seulement ceux qui sont réellement hérités.

Répondre

1

L'approche que vous avez ici est exactement exacte, à mon avis. J'ai pris la même approche il y a des années en utilisant Delphi2, bien que je devais implémenter ma propre classe de classe et les fonctions ObjectToText/TextToObject comme ReadComponent() jamais présenté dans la VCL.

Sur votre deuxième point d'enregistrement seulement les classes requises, sûrement ils ont seulement besoin d'enregistrer une fois? Et la surcharge de déterminer si une classe doit être enregistrée, l'emportera sur le coût de l'enregistrement de tout. Encore une fois, je le laisserais tel quel.

0

Je ne connais pas de fonctions existantes - cela me semble plutôt rare. L'approche consistant à stocker des DFM de formulaire dans une base de données (ils sont stockés séparément dans les fichiers CPP et H de l'unité?) Est également étrange. Je sais que vous dites "Cela nous permet de modifier les formulaires et les formulaires/actions sans recompiler" mais personnellement je les stockerais dans une DLL et recompilerais - au moins alors, en fonction de votre système de construction, ce sera versionné et vous aurez votre unité stockée comme une "unité". J'avoue que je ne connais pas les exigences de votre système et vous avez probablement une bonne raison de le faire à votre façon. Cependant, compte tenu de votre approche, je pense que l'analyse du flux, la recherche de clauses d'objet et l'enregistrement de ces composants avant d'appeler ReadComponent est probablement la meilleure approche.

Le stockage du DFM séparément (pour changer simplement les événements et les gestionnaires d'actions) laisse toujours les fichiers CPP et H compilés dans votre application principale. À partir de là, n'auriez-vous pas déjà les composants enregistrés et intégrés, donc c'est complètement inutile?

+0

la gestion des versions n'est pas un problème: notre système développé en interne gère les versions dans la base de données où le DFM est stocké. Merci pour la réponse. Les gestionnaires d'événements ne sont pas importants - j'ai fini par écrire mon propre ORM (Object Relational Mapper) pour connecter le DFM aux données et aux événements. Les événements sont écrits en Perl; nous avons intégré l'interpréteur Perl dans notre application. entre autres et nous pouvons toujours revenir à C/C++ comme nécessaire pour les domaines critiques de performance. Nous utilisons ce "travail de cadre" pour beaucoup de logiciels personnalisés en dehors du système pour lequel nous l'avons construit et qui nous a bien servis. – Eric

Questions connexes