当然可以,
Type
TDBGridClickEvent = procedure (Column: TColumn) of object;
property OnTitleClick: TDBGridClickEvent;
Type
TDBGridClickEvent = procedure (Column: TColumn) of object;
property OnTitleClick: TDBGridClickEvent;
TDbGridClickEvent是自定义类吗?
我知道OnTitleClick事件是系统已有事件,请问如何编辑排序代码?
我对此很陌生,请不吝赐教。
方法:
1。首先定义一个全局变量flag,初使值为0,表示没有进行排序
2。在OnTitleClick事件中,判断flag的值
case:0
//对query进行排序
query1.close;
query1.SQL.Clear;
//SQL里的代码与你先前的一样,这样一来就只对当前
//显示的记录进行排序
query1.Add('...... order by ;field desc');
//在这里,你还要判断用户点击的是哪一个字段
query1.paraByName('field').AsString:= ;
query1.active:=true;
flag:=1;//表示记录已经按降序排列了
case 1:
//方法同前,只不过将desc改为dsc
flag:=2;//表示记录已经按升序排列了
case 2:
//方法同前,只不过将esc改为desc
flag:=1;//表示记录已经按降序排列了
var
SqlStr,myFieldName,TempStr: string;
OrderPos: integer;
SavedParams: TParams;
begin
if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
if Column.Field.FieldKind =fkData then
myFieldName := UpperCase(Column.Field.FieldName)
else
myFieldName := UpperCase(Column.Field.KeyFields);
while Pos(myFieldName,';')<>0 do
myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
+ ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
begin
SqlStr := UpperCase(Sql.Text);
// if pos(myFieldName,SqlStr)=0 then exit;
if ParamCount>0 then
begin
SavedParams := TParams.Create;
SavedParams.Assign(Params);
end;
OrderPos := pos('ORDER',SqlStr);
if (OrderPos=0) or
(pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
TempStr := ' Order By ' + myFieldName + ' Asc'
else if pos('ASC',SqlStr)=0 then
TempStr := ' Order By ' + myFieldName + ' Asc'
else
TempStr := ' Order By ' + myFieldName + ' Desc';
if OrderPos<>0 then SqlStr := Copy(SqlStr,1,OrderPos-1);
SqlStr := SqlStr + TempStr;
Active := False;
Sql.Clear;
Sql.Text := SqlStr;
if ParamCount>0 then
begin
Params.AssignValues(SavedParams);
SavedParams.Free;
end;
Prepare;
Open;
end;
end;
这些代码只是我看过,但没有试过,可以试一试,注意其实质是利用query进行的排序