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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top