假設我們有一個包含 5 個欄位的資料集,顯示在 DBGrid 中。
用戶想要在網格中的任何位置定位文本。
如果我想搜索所有欄位或者我必須實作自定義代碼來實作這一點,有沒有辦法使用 TDataset.Locate() 方法?
uj5u.com熱心網友回復:
簡短的回答是您將需要一些自定義代碼,因為當您使用多個欄位呼叫 Locate 時,您必須傳遞一個包含要在相應欄位中匹配的值的變體陣列。盡管您可以指定匹配可以基于部分鍵(欄位)值,但要匹配的模式不能跨越多個欄位。
幸運的是,有一種直接的方法可以達到您想要的結果,如下所示:
在資料集中添加一個FieldKind fkInternalCalc的計算字串欄位,我們稱之為AllFields。
在資料集的 OnCalcFields 中,將 AllField 的值設定為資料集所有其他欄位的 AsString 值的串聯;
針對 AllFields 欄位呼叫 Locate,代碼如下
if MyDataSet.Locate('AllFields', AValue, [loPartialKey]) then;
這就是你所需要的。
例子
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
MyDataSet: TClientDataSet;
DataSource1: TDataSource;
Button1: TButton;
DBNavigator1: TDBNavigator;
edSearch: TEdit;
procedure FormCreate(Sender: TObject);
procedure MyDataSetCalcFields(DataSet: TDataSet);
procedure edSearchChange(Sender: TObject);
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
AField : TField;
i : Integer;
begin
AField := TIntegerField.Create(Self);
AField.FieldName := 'ID';
AField.DataSet := MyDataSet;
AField := TStringField.Create(Self);
AField.FieldName := 'FieldA';
AField.DataSet := MyDataSet;
AField := TStringField.Create(Self);
AField.FieldName := 'FieldB';
AField.DataSet := MyDataSet;
AField := TStringField.Create(Self);
AField.FieldName := 'FieldC';
AField.DataSet := MyDataSet;
AField := TStringField.Create(Self);
AField.FieldName := 'FieldD';
AField.DataSet := MyDataSet;
AField := TStringField.Create(Self);
AField.FieldName := 'AllFields';
AField.Size := 255; // increase if necessary
AField.FieldKind := fkInternalCalc; // not fkCalculated
AField.DataSet := MyDataSet;
MyDataSet.CreateDataSet;
for i := 1 to 100 do begin
MyDataSet.InsertRecord([i, 'value' IntToStr(i), 'value' IntToStr(i), 'value' IntToStr(i), 'value' IntToStr(i)]);
end;
end;
procedure TForm1.MyDataSetCalcFields(DataSet: TDataSet);
var
S : String;
i : Integer;
begin
S := '';
for i := 0 to DataSet.FieldCount - 2 do // the 2 is to stop the loop before the AllFields filed
S := S DataSet.Fields[i].AsString;
DataSet.Fields[5].AsString := S; // AllField is field 5
end;
procedure TForm1.edSearchChange(Sender: TObject);
begin
if edSearch.Text <>'' then
MyDataSet.Locate('AllFields', edSearch.Text, [loPartialKey, loCaseInsensitive])
else
MyDataSet.First;
end;
注意:要使上述代碼起作用,MyDataSet 的資料集型別需要是支持 fkInternalCalc 欄位型別的型別,例如 TClientDataSet。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315621.html
標籤:德尔福
