TFormの子クラスを作成しようとしています
これは私が今持っているコードです:
interface
TfrmEndoscopistSearch = class(TForm)
public
/// original constructor kept for compatibility
constructor Create(AOwner : TComponent); overload; override;
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload;
end;
動作しているように見えますが、コンパイラの警告が常に表示されます。
[警告] test.pas(44):メソッド 'Create'は、基本型 'TCustomForm' の仮想メソッドを非表示にします。
次のように、2番目のreintroduce
の前にoverload
を追加してみてください。
TfrmEndoscopistSearch = class(TForm)
public
/// original constructor kept for compatibility
constructor Create(AOwner : TComponent); overload; override;
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); reintroduce; overload;
end;
これはTurboDelphiでコンパイルされます。 public
メソッドのオーバーロードが制限されているため、コンパイルするにはpublished
が必要でした。
これを回避する本当に簡単な方法があります。 新しいコンストラクターに別の名前を付けます。他の一般的な言語とは異なり、Delphiには名前付きコンストラクターがあります。それらをCreateと呼ぶ必要はありません。新しいCreateWithDatasetを呼び出すことができ、仮想Createコンストラクターにまったく干渉しません。
TfrmEndoscopistSearch = class(TForm)
/// original constructor kept for compatibility
constructor Create(AOwner: TComponent); override;
/// additional constructor allows for a caller-defined base data set
constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = '');
end;
実際、このクラスを多態的にインスタンス化しない限り、元のコンストラクターも必要ありません。あなたはこのようにあなたの新しいものを宣言することができます:
TfrmEndoscopistSearch = class(TForm)
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce;
end;
TfrmEndoscopistSearchで引数1つのコンストラクターを直接呼び出そうとすると、コンパイルエラーが発生します。
(多態的に作成するには、通常、Application.CreateFormを使用する必要があります。
Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch);
これは常に、TComponentで導入された1引数の仮想コンストラクターを呼び出します。それがあなたのメインフォームでない限り、あなたはそれをする必要はありません。私は Application.CreateFormに対する私の気持ち について書いたことがあります。)
constructor Create(AOwner:Tcomponent;str:string);overload;
...
constructor TfrmEndoscopistSearch.Create(AOwner: Tcomponent; str: string);
begin
inherited Create(AOwner);
showmessage(str);
end;
これはトリックを行う必要があります