该问题仅出现在 firemonkey 中。与 VCL 完美配合。
我有一个连接到(任何类型)网格的数据集(任何类型) 单击列标题时,必须按相应字段排序。
对于VCL
procedure TForm2.DBGrid1TitleClick(Column: TColumn);
begin
qrySec.IndexFieldNames := Column.FieldName;
end;
对于FMX
procedure TManFarmaQry.StringGrid1HeaderClick(Column: TColumn);
begin
case Column.Index of
0:
if mtblMedica.IndexFieldNames = 'Field1' then
mtblMedica.IndexFieldNames := 'Field1' + ':D'
else
mtblMedica.IndexFieldNames := 'Field1';
1:
if mtblMedica.IndexFieldNames = 'Field2' then
mtblMedica.IndexFieldNames := 'Field2' + ':D'
else
mtblMedica.IndexFieldNames := 'Field2';
2:
if mtblMedica.IndexFieldNames = 'Field3' then
mtblMedica.IndexFieldNames := 'Field3' + ':D'
else
mtblMedica.IndexFieldNames := 'Field3';
end;
end;
在 FMX 的情况下,观察到寄存器的重新排列,但它与任何内容都不对应。把一切都弄乱了。
我认为既然两种情况都使用了Firedac,那么问题就不存在了。那么bind中就存在同步问题。
德尔福10.3.3
希望我找到的解决方案能够为其他人服务,我把它留在这里。
procedure TManFarmaQry.StringGrid1HeaderClick(Column: TColumn);
begin
// Putting things practical
if mtblMedica.IndexFieldNames = LinkGridToDataSourceBindSourceDB1.Columns[Column.Index].MemberName then
mtblMedica.IndexFieldNames := LinkGridToDataSourceBindSourceDB1.Columns[Column.Index].MemberName + ':D'
else
mtblMedica.IndexFieldNames := LinkGridToDataSourceBindSourceDB1.Columns[Column.Index].MemberName;
// Here is the solution. Refresh datasource
LinkGridToDataSourceBindSourceDB1.Active := False;
LinkGridToDataSourceBindSourceDB1.Active := True;
end;