3

フォームがデータベース内の EXE の外部に保持されているアプリケーションには、C++ Builder を使用します。アプリケーション コードは C++ です

これにより、再コンパイルせずにフォームとフォーム/アクションを変更できます。以下は、フォームをロードするジョブを実行するコードのスニペットです。

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

参照されているすべてのクラスを登録するために呼び出すことができる組み込み関数があるかどうか知りたいです。自分ですべてのオブジェクトのメモリストリームまたはファイルをスキャンし、それぞれに対して RegisterClass を呼び出すことは可能だと思いますが、誰かが既にこれを行った関数を知っていることを望んでいました。

そのため、すべてのフォームがこれらのクラスをすべて使用するわけではないため、実際に継承されるものだけを登録するとよいでしょう。

4

2 に答える 2

1

私の意見では、ここでのアプローチはまさに正しいです。私は何年も前に Delphi2 を使用して同じアプローチを取りましたが、VCL で決して取り上げられなかった ReadComponent() として、独自のクラス ファクトリと ObjectToText/TextToObject 関数を実装する必要がありました。

必要なクラスのみを登録するという 2 番目の点については、登録は 1 回だけで済みますか? また、クラスを登録する必要があるかどうかを判断するオーバーヘッドは、すべてを登録するコストを上回ります。繰り返しますが、そのままにしておきます。

于 2009-09-16T23:17:43.813 に答える
0

私は既存の機能を知りません - 私には、そうしなければならないことは非常にまれなことのようです。フォーム DFM をデータベースに保存するアプローチ (ユニットの CPP ファイルと H ファイルに別々に保存されますか?) も奇妙です。「これにより、再コンパイルせずにフォームとフォーム/アクションを変更できます」と言うのは知っていますが、個人的にはそれらをDLLに保存して再コンパイルします-少なくとも、ビルドシステムによっては、バージョン管理され、ユニットが「ユニット」として保存されます。あなたのシステム要件がわからないことは認めますが、おそらくあなたのやり方でそれを行う正当な理由があるでしょう.

ただし、あなたのアプローチを考えると、ストリームをスキャンし、オブジェクト句を探して、それらのコンポーネントを登録してから ReadComponent を呼び出すことがおそらく最善の方法だと思います。

DFM を個別に保存しても (イベントとアクション ハンドラーを変更するためだけに)、メイン アプリケーションにコンパイルされた CPP ファイルと H ファイルが残ります。そこから、すでにコンポーネントを登録して組み込み済みなので、これはまったく不要ではないでしょうか。

于 2009-06-30T02:59:59.007 に答える