2

こんにちは、私は TControl の子孫を開発しています。THTMLBaseControl と名付けましょう。このコントロールは実行時に、そのコントロールの設定に基づいて HTML コードのみを生成および出力します。そのため、Windows Messaging システムを含む基本 TControl クラスとメソッドのすべての追加プロパティは次のとおりです。実際には実行時に使用されず、メモリ オーバーヘッドが発生します。

そのコントロールを TControl から継承する必要があるため、デザイン時にすべての IDE デザイナ機能を使用できます。

しかし、実行時には、設計時に必要なこれらのプロパティのほとんどすべてが必要ありません。

また、すべてのコントロールがその THTMLBaseControl から継承されているため、コントロール クラスごとにラッパー クラスを作成することはできません。コードが大量に複製されるためです。

したがって、実行時に必要なのは、クラスがインスタンス化される前に、親クラスを変更して、TControl のように「TComponent」から継承された TmyBaseControl という名前の別の TControl に似たクラスに基づいてインスタンス化できるようにすることですが、そうではありません。 TControl のすべてのメモリ オーバーヘッドがあり、THTMLBaseControl に必要なプロパティとメソッドのみが含まれます。

私は実際にGUIを持っていません.rutimeはHTMLのみを提供するWebサーバーであり、intrawebとRaudusが行うことですが、常に問題はすべてTControlに基づいているため、実行時に作成して生成する必要があります使用されていない大量のメモリとプロセスのオーバーヘッド。また、実行時にインスタンス化された THTMlBaseControl の子孫が、TControl からではなく TmyBaseControl からすべてのプロパティとメソッドを継承するような解決策があるかもしれません。

VMT をハッキングする方法があるのを見てきましたが、おそらく他の解決策があり、それを見ていません。NewInstance、ClassParent、および TnstanceSize クラス メソッドの変更は既に完了していますが、どのクラスからのものかを指定する必要があり、継承された THTMLBaseControl クラスごとに同じ手順を実行する必要があります。

そして、すべてのために:これは単なる疑いです。コンポーネントをTEdit、TPanelなどのコントロールにする必要があり、デザイナーIDEで表示および編集可能にする必要があります。独自のTControlクラスを作成することもできますが、再利用できるかどうかを考えていました.コードはすでに存在します。

よろしく

4

1 に答える 1

10

実行時にクラスを変更することはできません。オブジェクトがインスタンス化されると、そのクラスが固定されます。オブジェクトをハッキングして VMT ポインターを変更し、別のクラスを参照させることはできますが、それでも主な問題であるメモリ使用量には対処できません。VMT ポインターを変更しても、オブジェクトのすべてのメモリは既に使用されています。割り当てられました。VMT ポインタを変更しても、魔法のようにオブジェクトが占有するメモリが少なくなるわけではありません。

最初にできることは、 からの下降をやめることですTControl。お気づきのように、それが提供するものは必要ありません。必要なのは、設計時にフォームにドロップしてそのプロパティを設定できるものだけです。そのために必要なのは だけなTComponentので、の代わりにそれを基本クラスにしますTControlTTimer次に、GUI のない のようなものが得られます。それが済んだら、もう必要ありませんTForm。代わりに、TDataModule設計時に非ビジュアル コンポーネントを管理するために特別に設計された にコンポーネントを配置できます。

于 2013-07-12T14:31:48.707 に答える