MyBaseを試してみる。(CloneCursorでOnFilterRecord)
次のようにDBGridを2段配置して、下段にフィルター処理されたレコードを表示させてみました。期待する動作は、
CloneCursorでClientDataSet2を設定し、更にClientDataSet2.OnFilterRecordを設定して、それによりフィルター処理されることです。
しかしながら、いざ実行してみると正しくフィルターできませんでした。というかClientDataSet1のOnFilterRecordのデータが表示されています。
CloneCursorのヘルプを読んでみると、第2のパラメーターの設定によることがわかりました。
CloneCursor側のOnFilterRecordを使う場合には、次のようにすると動作しました。
// サンプルデータ
procedure MakeSample(DataSet: TDataSet);
var
No: Integer;
F: Boolean;
begin
F := DataSet.Active;
if not F then
DataSet.Open;
try
// サンプルデータの追加
No := 0;
with DataSet do
begin
Appendrecord(['iPod Touch']);
Appendrecord(['Zaurus C-860']);
Appendrecord(['Delphi 2009 Handbook']);
Appendrecord(['GEORGIA BLACK']);
CheckBrowseMode;
end;
finally
if not F then
DataSet.Close;
end;
end;
// データベースの作成
procedure CreateDB(CDS: TClientDataSet; UsingIndex: Boolean);
var
I, No: Integer;
begin
CDS.Close;
CDS.FieldDefs.Add('ITEM',ftWideString,20);
CDS.CreateDataSet;
CDS.Close;
for I := 0 to CDS.FieldDefs.Count - 1 do
CDS.FieldDefs[I].CreateField(CDS);
CDS.Open;
MakeSample(CDS);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// データベースの作成
CreateDB(ClientDataSet1, False);
end;
procedure TForm1.ClientDataSet1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := AnsiPos(Edit1.Text,DataSet.FieldByName('ITEM').AsString) > 0
end;
procedure TForm1.ClientDataSet2FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := AnsiPos(Edit2.Text, DataSet.FieldByName('ITEM').AsString) > 0
end;
// Filter
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ClientDataSet2.Filtered := not ClientDataSet2.Filtered;
if ClientDataSet2.Filtered then
begin
ClientDataSet2.CloneCursor(ClientDataSet1, False, False);
ClientDataSet2.Filtered := True;
end;
end;
しかしながら、いざ実行してみると正しくフィルターできませんでした。というかClientDataSet1のOnFilterRecordのデータが表示されています。
CloneCursorのヘルプを読んでみると、第2のパラメーターの設定によることがわかりました。
procedure CloneCursor(Source: TCustomClientDataSet; Reset: Boolean; KeepSettings: Boolean = False); virtual;
Online Help for Delphi® XE2 and C++Builder® XE2 DBClient.TCustomClientDataSet.CloneCursor
日本語ページを見つけられなかったので、ヘルプを読んでね(^-^)
CloneCursor側のOnFilterRecordを使う場合には、次のようにすると動作しました。
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ClientDataSet2.Filtered := not ClientDataSet2.Filtered;
if ClientDataSet2.Filtered then
begin
ClientDataSet2.CloneCursor(ClientDataSet1, TRUE, False);
ClientDataSet2.OnFilterRecord := ClientDataSet2FilterRecord;
ClientDataSet2.Filtered := True;
end;
end;
| 固定リンク
