Frage

Wir verwenden C ++ Builder für eine Anwendung, deren Formen gehalten außerhalb der EXE in einer Datenbank. Anwendungscode ist C ++

Dies ermöglicht es uns, die Formulare und Formular / Aktionen ohne erneute Kompilierung zu ändern. Hier ist ein Ausschnitt von Code, der die Aufgabe des Ladens eines Formulars erfolgen wird.

 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();

Ich bin neugierig, ob es irgendwelche integrierten Funktionen sind, kann ich referenzierten alle Klassen registrieren nennen. Ich nehme an, es ist möglich, die Speicher-Stream oder eine Datei für alle Objekte selbst zu scannen und rufen Register für jeden, aber hatte gehofft, jemand der Funktion wusste, dass dies bereits getan hat.

Als solches nicht alle Formen all diese Klassen verwenden entweder so wäre es schön sein, nur diejenigen zu registrieren, die tatsächlich vererbt werden.

War es hilfreich?

Lösung

Der Ansatz, den Sie hier haben, ist genau richtig, meiner Meinung nach. Ich habe die gleichen Ansatz Jahre Delphi2 verwenden, obwohl ich meine eigene Klasse Fabrik und ObjectToText / TextToObject Funktionen wie Readcomponent () nie in der VCL gekennzeichnet wird.

implementieren musste

Auf dem zweiten Punkt nur erforderliche Klassen registrieren, sicher nur sie brauchen Registrierung einmal? Und der Aufwand zu bestimmen, ob eine Klasse registriert werden muss, wird schwerer wiegen als die Kosten für alles zu registrieren. Auch hier würde ich es lassen, wie es ist.

Andere Tipps

Ich weiß nicht, von bestehenden Funktionen - es scheint eine ziemlich seltene Sache zu tun zu haben, zu mir. Der Ansatz der Form DFMs in einer Datenbank zu speichern ist auch ungerade (sie sind separat an die CPP und H-Dateien für das Gerät? Gespeichert). Ich weiß, dass Sie sagen: „So können wir die Formen und Form / Aktionen ohne erneute Kompilierung ändern“, aber ich persönlich würde speichern sie in einer DLL und Re-Kompilierung - zumindest dann, abhängig von Ihrem Build-System, wird es sein, versioniert und Sie Ihr Gerät als „Einheit“ gespeichert haben. Ich gebe zu ich weiß nicht, Ihre Systemanforderungen und Sie wahrscheinlich einen guten Grund haben es auf deine Weise zu tun.

Doch angesichts Ihrem Ansatz, den ich denke, die Stream-Scannen, für Klauseln Objekt suche und diese Komponenten Registrierung vor dem Aufruf von Readcomponent ist wahrscheinlich der beste Ansatz.

die DFM Speicher getrennt (um nur Ereignisse und Aktionshandler zu ändern) läßt immer noch die CPP und H-Dateien in der Hauptanwendung zusammengestellt. Daraus würde nicht haben Sie bereits die Komponenten registriert und eingebaut, so ist dies völlig unnötig?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top