12

Delphi 7 で、フォームに他のフォームからコンポーネントを継承させたいプロジェクトに取り組んできました。私はこれを機能させることができましたが、次の問題に遭遇しました(将来的に他の人を助けるために解決策を投稿するつもりです):

  1. フォームの .pas ファイルで、他のフォームから継承するようにフォームを変更しますが、祖先フォームからコンポーネントを取得しません。
  2. 特定の子孫フォームの場合、設計時にフォームを開くと、次のエラー メッセージが表示されます。最初に先祖フォームを手動で開く必要があり、その後で子孫フォームを開くことができました。
4

2 に答える 2

27

まず、フォームを視覚的に継承する方法がわからない人のために、通常どおり祖先フォームを作成します。次に、[ファイル] > [新規] > [その他] に移動します。現在のプロジェクトの名前のタブを選択し、継承元のフォームを選択します。現在のプロジェクトの一部ではないフォームから継承する場合は、そのフォームを開いて右クリックし、[リポジトリに追加] を選択します。次に、[ファイル] > [新規] > [その他] に移動し、適切なタブからそのフォームを選択できます。

それを考えると、いくつかの子孫フォームがすでに作成されているため、上記のプロセスに従うことができなかったため、問題が発生しました。また、Delphi が作成する標準コードからフォームにいくつかの変更を加えました。次のガイドラインを使用して、視覚的なフォームの継承に関するすべての問題を解決できました。

  • 子孫フォームの .pas ファイルでは、フォームのクラスが正しい祖先クラスから継承されている必要があります。たとえば、次のようになります。
    type TMyForm = class(TAncestorForm)
  • 子孫フォームの .dfm の最初の行には、 のinherited代わりに単語が含まれている必要があります。次にobject例を示します。
    inherited MyForm: TMyForm
  • 編集: ダブル チェックの後、以下は不要です: 先祖フォームの .pas ファイルには、Delphi が作成する標準グローバル変数が必要です。
    var AncestorForm: TAncestorForm;
  • プロジェクトの .dpr ファイルのusesセクションには、ユニットのファイル名の後にコメントとして同じグローバル変数が必要です。例:
    unAncestor in 'unAncestor.pas' {AncestorForm}

メモ/ヒント:

  • 必要に応じて、祖先フォームと子孫フォームの両方を非自動作成にすることができます ([プロジェクト] > [オプション] > [フォーム] > [フォームの自動作成] で設定)。
  • 子孫フォームのプロパティを祖先フォームの値に戻すには、[オブジェクト インスペクタ] でプロパティを右クリックし、[継承に戻す] を選択します。
  • コンポーネントのすべてのプロパティ値を祖先の値に戻すには、コンポーネントを右クリックし、[継承に戻す] を選択します。
于 2008-10-10T08:21:26.003 に答える
1

DPRはそれよりも少しトリッキーに思えます。私の場合、TFrame から派生した祖先を作成しました。次に、TAncestorFrame から複数のフレームを派生させました。私の DPR の uses 句は次のようになりました。

uses
  Forms,
  ancestorFrame in 'ancestorFrame.pas' {AncestorFrame : TFrame},
  frame1Unit in 'frame1Unit.pas' {frame1:TFrame},
  frame2Unit in 'frame2Unit .pas' {frame2:TFrame},

DPROJ ファイルは次のようになります。

<DCCReference include="frame1Unit.pas">
  <Form>frame1</Form>
  <DesignClass>TFrame</DesignClass>
</DCCReference>

派生フレームは次のようになります。

TFrame1 = class(TAncestorFrame)

Derived Frames .DFM ファイルには、次のように記載する必要があります。

inherited Frame1:TFrame1
于 2009-10-23T17:48:30.743 に答える