procedure TdfrmSysAuth.DBGrid3DblClick(Sender: TObject); var strFieldName: String; begin strFieldName := DBGrid3.Columns[DBGrid3.SelectedIndex].Field.FieldName;
procedure TForm1.DBGrid1TitleClick(Column: TColumn); column.FieldName;// 就是对应的字段 begin
//============================================================================== //点击DBGrid标题栏对查询结果排序************************************************ //============================================================================== function DBGridTitleOrder(Column: TColumn): integer; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //DBGrid.DataSource.DataSet is TTable***************************************** //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ procedure TableOrder; begin end; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //DBGrid.DataSource.DataSet is TQuery***************************************** //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ procedure QueryOrder; var SQLStr, OrderFieldName, TempStr: string; i, OrderPos: integer; SavedParams: TParams; begin if not (TQuery(TDBGrid(Column.Grid).DataSource.DataSet).State in [dsBrowse]) then Exit; SavedParams := nil; for i:=0 to Column.Grid.FieldCount-1 do begin {TDBGrid(Column.Grid).Columns[i].Font.Color := clBlack;} TDBGrid(Column.Grid).Columns[i].Title.Caption := TDBGrid(Column.Grid).Columns[i].Field.DisplayName; end; if not (Column.Field.FieldKind in [fkData,fkLookup]) then Exit; if Column.Field.FieldKind=fkData then OrderFieldName := LowerCase(Column.Field.FieldName) else OrderFieldName := LowerCase(Column.Field.KeyFields); while Pos(OrderFieldName,';')<>0 do OrderFieldName := copy(OrderFieldName,1,Pos(OrderFieldName,';')-1)+','+copy(OrderFieldName,Pos(OrderFieldName,';')+1,100); with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do begin SQLStr := LowerCase(SQL.Text); if ParamCount>0 then begin SavedParams := TParams.Create; SavedParams.Assign(Params); end; OrderPos := pos('order',SQLStr); if (OrderPos=0) or (pos(OrderFieldName,copy(SQLStr,OrderPos,100))=0) then begin Result := 1; TempStr := ' order by ' + OrderFieldName + ' asc'; {Column.Title.Caption := Column.Title.Caption + '(▲)';} {Column.font.Color := clRed;} end else if pos('asc',SQLStr)=0 then begin Result := 1; TempStr := ' order by ' + OrderFieldName + ' asc'; {Column.Title.Caption := Column.Title.Caption + '(▲)';} {Column.font.Color := clRed;} end else begin Result := 2; TempStr := ' order by ' + OrderFieldName + ' desc'; {Column.Title.Caption := Column.Title.Caption + '(▼)';} {Column.font.Color := clGreen;} end; 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; Open; end; end; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //DBGrid.DataSource.DataSet is TADODataSet************************************ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ procedure ADODataSetOrder; begin with (TDBGrid(Column.Grid).DataSource.DataSet as TCustomADODataSet) do begin if (Pos(Column.Field.FieldName, Sort)=1) and (Pos(' DESC', Sort)=0) then begin Result := 2; Sort := Column.Field.FieldName + ' DESC' end else begin Result := 1; Sort := Column.Field.FieldName + ' ASC'; end; end; end; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //DBGrid.DataSource.DataSet is TClientDataSet********************************* //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ procedure ClientDataSetOrder; begin TDBGrid(Column.Grid).Tag := TDBGrid(Column.Grid).Tag xor Round(Exp(Column.Index * Ln(2))); with (TDBGrid(Column.Grid).DataSource.DataSet as TClientDataSet) do begin if Column.Field.DataType<ftAutoInc then begin if (TDBGrid(Column.Grid).Tag and Round(Exp(Ln(2) * Column.Index)))=0 then begin AddIndex(Column.FieldName + 'InxDES', Column.FieldName, [ixDescending]); IndexName := Column.FieldName + 'InxDES'; Result := 2; end else begin AddIndex(Column.FieldName + 'InxASC', Column.FieldName, []); IndexName := Column.FieldName + 'InxASC'; Result := 1; end; end; end; end; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ begin if (TDBGrid(Column.Grid).DataSource.DataSet is TTable) then TableOrder else if (TDBGrid(Column.Grid).DataSource.DataSet is TQuery) then QueryOrder else if (TDBGrid(Column.Grid).DataSource.DataSet is TADODataSet) then ADODataSetOrder else if (TDBGrid(Column.Grid).DataSource.DataSet is TClientDataSet) then ClientDataSetOrder; end;
procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin if DBGrid1.datasource.dataset.sort=Column.FieldName then DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC' else DBGrid1.datasource.dataset.sort:=Column.FieldName; end;不记得了,好像是sort吧
DBGrid1Boolean: boolean; //全局变量
ADOTable1: TADOTable;
procedure TForm1MainMenu.DBGrid1TitleClick(Column: TColumn); begin with ADOTable1 do begin if DBGrid1Boolean then TADOTable(ADOTable1).Sort := Column.FieldName + ' DESC' else TADOTable(ADOTable1).Sort := Column.FieldName; DBGrid1Boolean := not(DBGrid1Boolean); end; end;
to:snjun(@军军@) procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin if DBGrid1.datasource.dataset.sort=Column.FieldName then DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC' else DBGrid1.datasource.dataset.sort:=Column.FieldName; end;編譯時報錯. undeclared identifier.'sort'
var
strFieldName: String;
begin
strFieldName := DBGrid3.Columns[DBGrid3.SelectedIndex].Field.FieldName;
column.FieldName;// 就是对应的字段
begin
//点击DBGrid标题栏对查询结果排序************************************************
//==============================================================================
function DBGridTitleOrder(Column: TColumn): integer;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DBGrid.DataSource.DataSet is TTable*****************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TableOrder;
begin end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DBGrid.DataSource.DataSet is TQuery*****************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure QueryOrder;
var
SQLStr, OrderFieldName, TempStr: string;
i, OrderPos: integer;
SavedParams: TParams;
begin
if not (TQuery(TDBGrid(Column.Grid).DataSource.DataSet).State in [dsBrowse]) then Exit;
SavedParams := nil;
for i:=0 to Column.Grid.FieldCount-1 do
begin
{TDBGrid(Column.Grid).Columns[i].Font.Color := clBlack;}
TDBGrid(Column.Grid).Columns[i].Title.Caption := TDBGrid(Column.Grid).Columns[i].Field.DisplayName;
end;
if not (Column.Field.FieldKind in [fkData,fkLookup]) then Exit;
if Column.Field.FieldKind=fkData
then OrderFieldName := LowerCase(Column.Field.FieldName)
else OrderFieldName := LowerCase(Column.Field.KeyFields);
while Pos(OrderFieldName,';')<>0 do OrderFieldName := copy(OrderFieldName,1,Pos(OrderFieldName,';')-1)+','+copy(OrderFieldName,Pos(OrderFieldName,';')+1,100);
with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
begin
SQLStr := LowerCase(SQL.Text);
if ParamCount>0 then
begin
SavedParams := TParams.Create;
SavedParams.Assign(Params);
end;
OrderPos := pos('order',SQLStr);
if (OrderPos=0) or (pos(OrderFieldName,copy(SQLStr,OrderPos,100))=0) then
begin
Result := 1;
TempStr := ' order by ' + OrderFieldName + ' asc';
{Column.Title.Caption := Column.Title.Caption + '(▲)';}
{Column.font.Color := clRed;}
end else if pos('asc',SQLStr)=0 then
begin
Result := 1;
TempStr := ' order by ' + OrderFieldName + ' asc';
{Column.Title.Caption := Column.Title.Caption + '(▲)';}
{Column.font.Color := clRed;}
end else
begin
Result := 2;
TempStr := ' order by ' + OrderFieldName + ' desc';
{Column.Title.Caption := Column.Title.Caption + '(▼)';}
{Column.font.Color := clGreen;}
end;
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;
Open;
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DBGrid.DataSource.DataSet is TADODataSet************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ADODataSetOrder;
begin
with (TDBGrid(Column.Grid).DataSource.DataSet as TCustomADODataSet) do
begin
if (Pos(Column.Field.FieldName, Sort)=1)
and (Pos(' DESC', Sort)=0) then
begin
Result := 2;
Sort := Column.Field.FieldName + ' DESC'
end else
begin
Result := 1;
Sort := Column.Field.FieldName + ' ASC';
end;
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DBGrid.DataSource.DataSet is TClientDataSet*********************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ClientDataSetOrder;
begin
TDBGrid(Column.Grid).Tag := TDBGrid(Column.Grid).Tag xor Round(Exp(Column.Index * Ln(2)));
with (TDBGrid(Column.Grid).DataSource.DataSet as TClientDataSet) do
begin
if Column.Field.DataType<ftAutoInc then
begin
if (TDBGrid(Column.Grid).Tag and Round(Exp(Ln(2) * Column.Index)))=0 then
begin
AddIndex(Column.FieldName + 'InxDES', Column.FieldName, [ixDescending]);
IndexName := Column.FieldName + 'InxDES';
Result := 2;
end else
begin
AddIndex(Column.FieldName + 'InxASC', Column.FieldName, []);
IndexName := Column.FieldName + 'InxASC';
Result := 1;
end;
end;
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
begin
if (TDBGrid(Column.Grid).DataSource.DataSet is TTable) then TableOrder
else if (TDBGrid(Column.Grid).DataSource.DataSet is TQuery) then QueryOrder
else if (TDBGrid(Column.Grid).DataSource.DataSet is TADODataSet) then ADODataSetOrder
else if (TDBGrid(Column.Grid).DataSource.DataSet is TClientDataSet) then ClientDataSetOrder;
end;
begin
if DBGrid1.datasource.dataset.sort=Column.FieldName then
DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC'
else
DBGrid1.datasource.dataset.sort:=Column.FieldName;
end;不记得了,好像是sort吧
ADOTable1: TADOTable;
procedure TForm1MainMenu.DBGrid1TitleClick(Column: TColumn);
begin
with ADOTable1 do
begin
if DBGrid1Boolean then
TADOTable(ADOTable1).Sort := Column.FieldName + ' DESC'
else
TADOTable(ADOTable1).Sort := Column.FieldName;
DBGrid1Boolean := not(DBGrid1Boolean);
end;
end;
然后重新刷新,最笨的办法了 ,呵呵!!
begin
if DBGrid1.datasource.dataset.sort=Column.FieldName then
DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC'
else
DBGrid1.datasource.dataset.sort:=Column.FieldName;
end;編譯時報錯. undeclared identifier.'sort'