DbGrid很难完成这个事情,建议你用TSortGrid,留下E-mail,我发给你,有Demo.

解决方案 »

  1.   

    谢谢,我也需要!
    [email protected]
      

  2.   

    [email protected]
    谢谢 !
      

  3.   

    在DBGrid中还不一样可以实现,而且也很简单,在OnDrawColumnCell中写几句代码就是了。
      

  4.   

    你要对DBGrid进行派生了。很麻烦的,我曾经做过一个通用的排序DBGrid,写了很多代码还是不太理想,不过要实现你的显示图标的功能倒不难。要的话留下Email
      

  5.   

    管它图标还是字符,只要看起来像就可以了。
    OnbuttonClick时间中改变标题,就可以了。
      

  6.   

    这个问题不难吧,在DbGrid的onTitleClick实践中写代码可以实现:
    var FSort,FSortField : string;
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      if not DBGrid1.Active then exit;
      for iFieldCount := 0 to DBGrid1.Columns.Count - 1 do
      begin
         if (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▼') or (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▲') then
         begin
            DBGrid1.Columns[iFieldCount].Title.Caption := Copy(DBGrid1.Columns[iFieldCount].Title.Caption,1,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-3);
            break;
         end;
      end;
      if Column.FieldName = FSortField then
      begin
         if FSort = 'DESC' then
            FSort := 'ASC'
         else
            FSort := 'DESC';
      end
      else begin
        FSortField := Column.FieldName;
        FSort := 'ASC';
      end;
      if FSort = 'ASC' then
         Column.Title.Caption := Column.Title.Caption + ' ▲'
      else
         Column.Title.Caption := Column.Title.Caption + ' ▼';
     Dataset1.Sort := Column.FieldName + ' ' + FSort;
      

  7.   

    我要得不是排序的方法,是排序完成后在ColunmTitle上显示一个向上或向下的
    三角形图标
      

  8.   

    同意prometheusphinx(白日梦) 的做法,以前我是这样做的,现在的是从TCustomDBGrid继承了一个TxlDBGrid,代码如下:procedure TxlDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
      AState: TGridDrawState);
    var
      dc: TColumn;
      w: integer;
      r: TRect;
      bmp: TBitmap;
      ads: TCustomADODataSet;
    begin
      inherited;
      // Draw DBGrid's title when sorted
    {  if ACol <= 0 then
      begin
        Canvas.TextOut(ARect.Left + 2, ARect.Top + 2, IntToStr(ARow));
      end;}
      if FUseSortHint and (ARow <= 0) and (ACol > 0) then
      begin
        if assigned(DataSource) and assigned(DataSource.DataSet)// actived?
          and (DataSource.DataSet is TCustomADODataSet) then
        begin
          ads := TCustomADODataSet(DataSource.DataSet);
          dc := Columns[ACol - 1];
          if Pos(UpperCase(dc.FieldName + ' '), UpperCase(ads.Sort)) <> 1 then
            Exit;
          w := Canvas.TextWidth(dc.Title.Caption);
          r.Left := ARect.Left + w + 1;
          r.Right := ARect.Right - 1;
          r.Top := ARect.Top + 1;
          r.Bottom := ARect.Bottom - 1;
          bmp := TBitmap.Create;
          try
    //        bmp.Height := Canvas.TextHeight('W') - 4;
            bmp.Height := r.Bottom - r.Top - 4;
            bmp.Width := bmp.Height;
            bmp.Canvas.Pen := FSortCanvas.Pen;
            bmp.Canvas.Brush := FSortCanvas.Brush;
            bmp.Canvas.CopyMode := FSortCanvas.CopyMode;
            if UpperCase(ads.Sort) <> UpperCase(dc.FieldName + ' DESC') then
            begin// asc
              bmp.Canvas.Polygon([Point(0, bmp.Height - 1),
                Point(bmp.Width - 1, bmp.Height - 1),
                Point((bmp.Width - 1) div 2, 0)]);
            end
            else
            begin// desc
              bmp.Canvas.Polygon([Point(0, 0), Point(bmp.Width - 1, 0),
                Point((bmp.Width - 1) div 2, bmp.Height - 1)]);
            end;
            bmp.TransparentColor := clWhite;
            bmp.Transparent := True;
            w := r.Right - r.Left - 2;
            if bmp.Width > w then
              if w < 0 then
                bmp.Width := 0
              else
                bmp.Width := w;
            Canvas.Draw(r.Left + 2, r.Top + 2, bmp);
          finally
            bmp.Free;
          end;
        end;// assigned...
      end;end;
      

  9.   

    找了一下,找到了以前写的那段代码:procedure TFCommonForm.DBGridDrawTitle(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
      grd: TDBGrid;
      qry: TADOQuery;
      obj: PDBGridParams;
      tmpColor: TColor;
      tmpFont: TFont;
      hgh: integer;
    begin
      exit;
      grd := TDBGrid(Column.Grid);
    {  //这里你用不到,屏蔽掉
      if CanNotModify(Column) then
      begin
        grd.Canvas.Font.Color := _READONLYCOLOR;
        grd.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;}
      // Draw DBGrid's title when sorted
      if Assigned(grd.DataSource) then
      if Assigned(grd.DataSource.DataSet) then
      if grd.DataSource.DataSet is TADOQuery then
      begin
        qry := TADOQuery(grd.DataSource.DataSet);
        if Pos(Column.FieldName ,qry.Sort) = 1 then
        begin
    //      grd.Canvas.Pen.Width := 2;
          tmpFont := grd.Canvas.Font;
          try// if create tcanvas will has question
            grd.Canvas.Font := grd.TitleFont;
            hgh := grd.Canvas.TextHeight('W');
          finally
            grd.Canvas.Font := tmpFont;
          end;
          tmpColor := grd.Canvas.Pen.Color;
          grd.Canvas.Pen.Color := clRed;
          try
    //        grd.Canvas.Pen.Mode := pmNot;
          if qry.Sort <> Column.FieldName + ' DESC' then
          begin// asc
            grd.Canvas.MoveTo(Rect.Left, hgh + 2);
            grd.Canvas.LineTo(Rect.Left + hgh, hgh + 2);
            grd.Canvas.LineTo((Rect.Left + hgh + Rect.Left) div 2, 2);
            grd.Canvas.LineTo(Rect.Left, hgh + 2);
          end
          else
          begin// desc
            grd.Canvas.MoveTo(Rect.Left, 2);
            grd.Canvas.LineTo(Rect.Left + hgh, 2);
            grd.Canvas.LineTo((Rect.Left + hgh + Rect.Left) div 2, hgh + 2);
            grd.Canvas.LineTo(Rect.Left, 2);
    {        grd.Canvas.Polygon([Point(Rect.Left, 2), Point(Rect.Right, 2),
                Point((Rect.Right + Rect.Left) div 2, hgh + 2)]);
    }      end;
    //       DBGrid1.Canvas.Pen.Mode := pmCopy;
          finally
            grd.Canvas.Pen.Color := tmpColor;
          end;
        end;
        if grd.Tag <= 0 then Exit;
        obj := PDBGridParams(grd.Tag);
        // if obj^.OldDrawColumnCell = DBGridDrawTitle
        // dead recycle will occur
        if Assigned(obj^.OldDrawColumnCell) then
          obj^.OldDrawColumnCell(Sender, Rect, DataCol, Column, State);
      end;end;
      

  10.   

    上面两段代码中,重画处的代码你应该知道怎么改吧,把它改为你的代码,如:Create一TBitmap,并LoadFromResourceID或LoadFromResourceName,然后画上去
      

  11.   

    真是的,按eightlin(编程浪子) 的方法改改就完全可以了。
    把图画到Column[i].的 Rect 去主OK!!!
    画图知道怎么编吧.
      

  12.   

    不好吧,我是用ADOQuery的Sort来排序的,只要对DBGrid一Refresh,ADOQuery就不会排序了,这时Title上还有三角形的,再说了,Title.Caption也可能被使用,这时有一个三角形多怪啊
      

  13.   

    做一个公用过程,就可以都行了;
    单击一下 升序, 再为降序;procedure dmDBGridSortByTitle(Column: TColumn);
    const
      cstrASC = '▲';    cstrDESC= '▼';
    var
      I, ordPos: integer;    selStr, ordStr: string;
    Begin    if not (Column.Field.DataSet is TQuery) then Exit;
      if Column.Field.FieldKind <> fkData then Exit;
      for I := 0 to Column.Collection.Count-1 do
      with Column.Collection.Items[I] as TColumn do
      begin      Title.Caption := StringReplace(Title.Caption, cstrASC, '', []);
        Title.Caption := StringReplace(Title.Caption, cstrDESC, '', []);
      end;
      with Column.Field.DataSet as TQuery do
      begin  ordPos := Pos('ORDER BY', UpperCase(SQL.Text));
        if ordPos > 0 then
        begin   selStr := Copy(SQL.Text, 1, ordPos-1);
          ordStr := Copy(SQL.Text, ordPos, StrLen(SQL.GetText));
        end
        else
        begin  ordStr := SQL.Text;
          ordStr := '';
        end;
        Close;
        if ordStr = '' then
        begin   SQL.Text := SQL.Text + ' ORDER BY ' + Column.FieldName + ' ASC';
          Column.Title.Caption := Column.Title.Caption + cstrASC;
        end
        else
        begin  if Pos(UpperCase(Column.FieldName) + ' ASC', UpperCase(ordStr)) > 0 then
          begin
            SQL.Text := selStr + StringReplace(ordStr, ' ASC', ' DESC', []);
            Column.Title.Caption := Column.Title.Caption + cstrDESC;
          end
          else
          begin   SQL.Text := selStr + ' ORDER BY ' + Column.FieldName + ' ASC';
            Column.Title.Caption := Column.Title.Caption + cstrASC;
          end;
        end;
        Open;
      end;  end;