Automatizzare RegisterClass in C ++ Builder VCL
-
20-08-2019 - |
Domanda
Usiamo C ++ Builder per un'applicazione i cui moduli sono mantenuti esterni a EXE in un database. Il codice dell'applicazione è C ++
Questo ci consente di modificare i moduli e il modulo / le azioni senza ricompilare. Ecco uno snippet di codice che esegue il lavoro di caricamento di un modulo.
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();
Sono curioso di sapere se ci sono funzioni incorporate che posso chiamare per registrare tutte le classi referenziate. Suppongo che sia possibile scansionare personalmente il flusso di memoria o il file per tutti gli oggetti e chiamare RegisterClass per ciascuno, ma speravo che qualcuno conoscesse la funzione che già lo ha fatto.
In quanto tale, non tutti i moduli usano tutte queste classi, quindi sarebbe bello registrare solo quelli che sono effettivamente ereditati.
Soluzione
L'approccio che hai qui è esattamente giusto, secondo me. Ho adottato lo stesso approccio anni fa usando Delphi2, anche se ho dovuto implementare la mia factory di classe e le funzioni ObjectToText / TextToObject di ReadComponent () mai presenti nel VCL.
Sul tuo secondo punto di registrazione solo delle classi richieste, sicuramente devono registrarsi una sola volta? E il sovraccarico di determinare se una classe deve essere registrata, supererà il costo di registrazione di tutto. Ancora una volta, lo lascerei così com'è.
Altri suggerimenti
Non conosco alcuna funzione esistente - mi sembra una cosa abbastanza rara da fare, per me. Anche l'approccio di memorizzazione dei moduli DFM in un database (sono memorizzati separatamente nei file CPP e H per l'unità?) È strano. So che dici & Quot; Questo ci consente di modificare i moduli e il modulo / le azioni senza una ricompilazione & Quot; ma personalmente li memorizzerei in una DLL e li ricompilerei - almeno allora, a seconda del sistema di compilazione, verrà aggiornato e avrai l'unità memorizzata come " unit " . Devo ammettere che non conosco i requisiti di sistema e probabilmente hai buone ragioni per farlo a modo tuo.
Tuttavia, dato il tuo approccio, penso che la scansione del flusso, la ricerca di clausole di oggetti e la registrazione di tali componenti prima di chiamare ReadComponent sia probabilmente l'approccio migliore.
La memorizzazione separata di DFM (al fine di modificare solo eventi e gestori di azioni) lascia comunque i file CPP e H compilati nell'applicazione principale. Da ciò, non avresti già i componenti registrati e integrati, quindi questo è completamente inutile?