通过 TQDataSet.OnCustomSort 属性来按拼音排序

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 字段的拼音顺序。效果如下图:

QDataSet_PY

分享到: