7

メソッドをオーバーライドできるように、TToolBar を MyTToolBar という別のクラスでサブクラス化したいと考えています。私は Delphi を初めて使用しますが、さまざまな方法を 2 時間試した後、TToolBar の代わりに MyTToolBar を使用することができません。ビジュアル コンポーネント クラスのメソッドをオーバーライドしたいと思ったのは、私が初めてではありません。

私は、ビジュアル コンポーネントのサブクラス化が容易な Xcode のバックグラウンドを持っています。親クラス (MySuperClass など) のサブクラス (MySubclass など) を作成し、Xcode の Interface Builder ビューでサブクラスを割り当てるだけです。サブクラスは自動的に認識されて使用されます。

Delphi RAD Studio XE3 でこれを行うことができないのはなぜですか?

TToolBar を TForm に追加した後、クラスを変更できないようです。Object Inspector と .PAS ソース コード ファイルを試してみました。.PAS ファイルのクラスを変更すると、ツールバーが「Vcl.ComCtrls.TToolBar 型である必要がありますが、MyTToolbar として宣言されています。宣言を修正しますか?」というエラー メッセージが表示されます。これはばかげているようです...

ああ、また、新しいコンポーネント ウィザードを使用して、[ファイル] -> [新規] -> [その他] -> [Delphi プロジェクト] -> [Delphi ファイル] -> [コンポーネント] を選択しました。MyTToolBar の祖先を TToolBar として選択し、「サンプル」パレット ページに登録するように指示します。ただし、「サンプル」ページには表示されません。

4

3 に答える 3

18

XCode のアプローチに最も近いのは、Delphi で「インターポーザ」クラスを使用することです。基本的に、標準的な使用法のために IDE が作成するコードを変更することはありませんTToolBarTToolBar代わりに、標準コンポーネントから派生するが名前も付けられている新しいクラスを宣言し、標準が宣言されたTToolBarにコンパイラに見えるようにします。コンパイラが最後に確認したクラスは、 DFMがストリーミングされるたびにインスタンス化される実際のクラス タイプになります。TToolBarTToolBarTForm

次の 2 つの方法のいずれかを使用して、カスタムTToolBarクラスを標準クラスの後にコンパイラに表示させることができます。TToolBar

  1. TToolBarクラスと同じユニットでカスタム クラスを宣言しますTForm

    unit MyForm;
    
    interface
    
    uses
      ..., Vcl.ComCtrls, ...;
    
    type
      TToolBar = class(Vcl.ComCtrls.TToolBar)
        // override what you need...
      end;
    
      TMyForm = class(TForm)
        ToolBar1: TToolBar; // <-- do not change this!
        ...
      end;
    
    implementation
    
    // implement custom TToolBar as needed...
    
    // normal TForm implementation code as needed ...
    
    end.
    
  2. ユニットが追加された後、ユニットの句にTToolBar追加される独自のユニットでカスタムクラスを宣言できます。TFormusesComCtrls

    unit MyToolBar;
    
    interface
    
    uses
      ..., Vcl.ComCtrls;
    
    type
      TToolBar = class(Vcl.ComCtrls.TToolBar)
        // override what you need...
      end;
    
    implementation
    
    // implement custom TToolBar as needed...
    
    end.
    

    .

    unit MyForm;
    
    interface
    
    uses
      ..., Vcl.ComCtrls, ..., MyToolBar;
    
    type
      TMyForm = class(TForm)
        ToolBar1: TToolBar; // <- do not change this!
        ...
      end;
    
    implementation
    
    // normal TForm implementation code as needed ...
    
    end.
    

このアプローチは、プロジェクト単位でのみ機能します。カスタムTToolBarクラスを複数のプロジェクトで使用する場合は、@KenWhite の説明のように IDE にインストールし、標準の代わりに使用することをお勧めしますTToolBarTMyToolBar名前付け(またはその他) に戻りTToolBarます。インターポーザーとして使用するつもりはないので、もう名前を付けないでください。パッケージがプロジェクト オプションで「ランタイムおよびデザインタイム」としてマークされていることを確認します (ランタイムのみのパッケージとデザインタイムのみのパッケージを個別に作成することは、この説明の範囲外です)。 TMyToolBar設計時に、TForm他のコンポーネントと同様にドロップできるようになります。そうでない場合は、正しく設定されていません。

于 2013-02-09T00:31:47.617 に答える
5

既存のフォームのコンポーネントを変更するには、それが実際に IDE が設計時にインスタンスを作成できるコンポーネントである必要があります。もちろん、これはIDEが最初にそれを認識しなければならないことを意味します。

これを行う方法は、独自の子孫コンポーネントを作成し、実際に設計時パッケージで IDE にインストールすることです。その後、標準バージョンの代わりにフォームにドロップするか、既存のフォームに少し作業を加えて置き換えることができます。(ただし、最初にバージョンを作成してインストールする必要があります。)

File->New->Package (Delphi)IDE のメニューから開始します。他のプロジェクトと同じようにパッケージを保存します (たとえば、MyComponents.dpk)。

を使用して、右側のペインFile->New->Other->Delphi Filesをダブルクリックします。Componentウィザードが開始され、New Component派生元にする (または新しいコンポーネントを設計する) 既存のコンポーネントを選択できます。

ウィザードの手順に従うと、コンポーネントの基本的なシェルが完成します。

unit MyToolBar1;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ToolWin, Vcl.ComCtrls;

type
  TMyToolBar = class(TToolBar)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyToolBar]);
end;

end.

新しい子孫に必要な機能を実装し、ファイルを保存します。

Project Manager(デフォルトでは IDE の右上のウィンドウ) でパッケージを右クリックしInstall、コンテキスト メニューから選択します。これにより、パッケージがコンパイルおよびビルドされ、IDE に自動的にインストールされます。(私が示した例Samplesでは、呼び出しで示されている内容に基づいて、パレットのページに新しいコンポーネントを配置しRegisterComponentsます。)

上記を行った後、既存のフォームを変更できます (最初に .pas および .dfm ファイルのバックアップを作成してください! )。TToolBarあなたが言及したものと、以下の手順でシェルを投稿したサンプル置換を使用します。

ソース コード エディタでクラス名を手動で からTToolBarに変更しTMyToolBarます。

フォームを右クリックしView as Text、コンテキスト メニューから選択します。

を見つけてTToolBar、 から に変更TToolBarTMyToolBarます。

もう一度右クリックしView as Form、コンテキスト メニューから選択します。これらの手順を正しく行った場合、ツールバーをクリックするとTMyToolBarオブジェクト インスペクタに表示されます。表示されない場合 (またはエラー メッセージが表示される場合) は、何か問題があります。コード エディターの上部にあるタブを右クリックして [はい] を選択Close tabし、変更の保存に関するプロンプトに対して [いいえ] と答えて、必要に応じて最初に作成するように指示したバックアップ コピーから復元します。

于 2013-02-09T00:31:19.853 に答える
1

クラスの単元を作成します。

Unit YourComponent;
interface
uses
 ....
Type
 TYourNewClass=Class(ExistingClass)
   private
   ...
   protected
   ...   
   public
   ...
   published
  end;

  procedure Register;

implementation

.....

procedure Register;
begin
  RegisterComponents('YourPalette', [TYourNewClass]);
end;

新しいパッケージを作成 (または独自の既存のパッケージを開く) し、ユニットを追加して、Package.bpl にインストールを選択します。

于 2013-02-09T00:23:51.747 に答える