TQDataSet 新提供了一个 OnCustomSort 属性,用于让用户指定自己的排序规则。如果设置了 OnCustomSort 事件的值,则 TQDataSet 会调用 OnCustomSort 事件来获取两条记录的比较结果。下面是一个在 Windows 下按拼音排序的例子:
//按拼音比较两条记录的大小 procedure TForm1.DoSortBySpell(ADataSet: TQDataSet; ARecord1, ARecord2: TQRecord; var AResult: Integer); begin AResult := CompareStringW( // 按汉语拼音排序 MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRCP), NORM_IGNORECASE or NORM_IGNOREWIDTH, PWideChar(ARecord1.Values[2].CurrentValue.AsString), -1, PWideChar(ARecord2.Values[2].CurrentValue.AsString), -1) - CSTR_EQUAL; end; procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(FDataSet.OnCustomSort) then//如果已经指定了自定义排序,则关闭自定义排序 FDataSet.OnCustomSort := nil else//设置自定义排序比较规则 FDataSet.OnCustomSort := DoSortBySpell; end;
在 DoSortBySpell 中,记录的 Values[2] 对应的是 Name 字段,也就是说将数据集的 Name 字段的拼音顺序。效果如下图: