我正在开发一个TClientDataset,用户可以根据一些标准随时过滤。我的问题是,我们希望数据集的光标在过滤后“大部分”保持在同一位置。 (“大多数情况下”在双引号中,当然,如果记录被过滤掉,它不能停留在同一个地方)。
在做了一些研究之后,我能想到的最好的是:
procedure RefreshFilter;
var
I : Integer;
sFilter : string;
vIndexValue: array of TVarRec;
vIndexValueAsVar : Array of Variant;
begin
sFilter := GenerateNewFilterExpression;
if sFilter <> MyDataset.Filter then
begin
if MyDataset.IndexFieldCount > 0 then
begin
SetLength(vIndexValueAsVar, MyDataset.IndexFieldCount);
SetLength(vIndexValue, MyDataset.IndexFieldCount);
for I := 0 to MyDataset.IndexFieldCount - 1 do
begin
vIndexValueAsVar[I] := MyDataset.IndexFields[I].AsVariant;
vIndexValue[I].VType := vtVariant;
vIndexValue[I].VVariant := @vIndexValueAsVar[I];
end;
end;
MyDataset.Filtered := sFilter <> '';
Mydataset.Filter := sFilter;
if MyDataset.IndexFieldCount > 0 then
begin
MyDataset.FindNearest(vIndexValue);
end;
end;
end;
即使它工作得很好,我发现解决方案有点“笨重”。我想知道是否有一些内置功能或不同的方法可能更优雅,更少“沉重”。
请不要提及书签...更改活动过滤器后书签无法正常工作,如果您的记录被过滤掉,则完全没有。