新しいTEditコンポーネントを開発しようとしています。Delphiコンポーネントの開発 - コンポーネント内のイベントの伝播
TDBFilterEdit = class(TEdit)
成分は、その編集フィールドに入力された文字列に基づいて関連付けられたデータセットをフィルタ処理することを意味します。
これは私のコンポーネントは次のようになります。今
type
TDBFilterEdit = class(TEdit)
private
{ Private-Deklarationen }
fFilter:String;
fDataSource:TDataSource;
fDataSet:TDataSet;
fText:string;
protected
{ Protected-Deklarationen }
procedure SetFilter(value:String);
procedure SetDS(value:TDataSource);
procedure FilterRecords(DataSet:TDataSet; var Accept:Boolean);
procedure Change(Sender:TObject);
procedure SetText(value:String);
public
{ Public-Deklarationen }
constructor Create(AOwner:TComponent);
published
{ Published-Deklarationen }
property Text:String read fText write SetText;
property Filter:String read fFilter write SetFilter;
property DataSource:TDataSource read fDataSource write SetDS;
end;
それは、コンポーネントの開発に来るとき、私はかなり初心者です。私の最初のアイデアは、データソースが自分のコンポーネントに割り当てられ、編集コンポーネントのテキストが変更されたときにトリガーするとすぐに、データセットのOnFilterRecordメソッドをオーバーライドすることでした。
procedure TDBFilterEdit.SetDS(value:TDataSource);
var
myaccept:Boolean;
begin
fDataSource:=value;
fDataSet:=fDataSource.DataSet;
if fDataSet=nil then Exit;
fDataSet.OnFilterRecord:=FilterRecords;
if Filter<>'' then fDataSet.OnFilterRecord(fDataSet,myaccept);
end;
私の問題は、コンポーネントのTextプロパティが更新されたことをコンポーネントに認識させる方法がわかりません。 OnChangeメソッドを次のコードでオーバーライドしようとしました。
procedure TDBFilterEdit.Change(Sender:TObject);
begin
Filter:=Text;
inherited Change();
end;
ただし、これまでのところ役に立たないです。
をこれを行うには、変更内で呼び出されたメソッド(DoOnChangeと呼ばれることがあります)を記述し、必要なものを実行します。特別なイベントハンドラを呼び出すこともできます。 VCLのさまざまなDoOnxxxxメソッドを見て、すぐにそのアイデアを得るべきです。 – MartynA