DBGrid. Сортировка. Отображение маленьких треугольников в заголовке.

Начинающий SQL 2008
Дата: 28.04.2011 11:38:53
Здравствуйте! Есть Delphi7 и обычный DBGrid, который сортируется по клику на заголовок:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
 f: string;
begin
 ADOQuery1.DisableControls;
 f := Column.FieldName;

 if ColumnIdx = Column.Index then
  if OrderbY = ' ASC' then OrderbY := ' DESC' else  OrderbY := ' ASC'
 else OrderbY := ' ASC';

 ADOQuery1.Sort := '[' + f + ']' + OrderbY;
 ColumnIdx := Column.Index;

 ADOQuery1.EnableControls;
end; // DBGrid1TitleClick

Перекрыл DrawCell
type TDBGrid = class(DBGrids.TDBGrid)
 protected
  procedure DrawCell (ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;

и символ треугольника для сортировки вывожу через Image:
procedure TDBGrid.DrawCell (ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
...
 if (ARow = 0) and (ACol = ColumnIdx) then
  if OrderbY = ' ASC' then
   Canvas.Draw(ARect.Right - 11, ARect.Top + 4,  Form1.img_asc.Picture.Bitmap)
  else
   Canvas.Draw(ARect.Right - 11, ARect.Top + 4,  Form1.img_desc.Picture.Bitmap);
end; // DrawCell
Картинка с другого сайта.


Есть какой-нибудь более лучший способ отображать эти треугольнички, чем через Image?
Johnmen
Дата: 28.04.2011 11:44:33
Просто выводить на канвас рисунок.
Все возможные рисунки могут лежать в ImageList.
DimaBr
Дата: 28.04.2011 11:55:17
Начинающий SQL 2008
Дата: 28.04.2011 12:00:35
Все возможные рисунки могут лежать в ImageList.
ОК.

Просто я думал, что есть какая-нибудь встроенная возможность, например
  DrawFrameControl(MyCanvas.Handle, MyRect, DFC_BUTTON, MyStyle or DFCS_FLAT);
рисует CheckBox ...
Начинающий SQL 2008
Дата: 28.04.2011 12:01:30
DimaBr,
Спасибо за идею со шрифтом Arial !
Johnmen
Дата: 28.04.2011 12:07:20
Со шрифтом некрасиво... :)
DimaBr
Дата: 28.04.2011 12:31:15
  DrawFrameControl(Canvas.Handle,Rect(0,0,16,16),DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTON3STATE);
  DrawFrameControl(Canvas.Handle,Rect(16,0,32,16),DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTONPUSH)
DimaBr
Дата: 28.04.2011 12:33:31
Оно ?
Начинающий SQL 2008
Дата: 28.04.2011 12:46:17
Johnmen
Со шрифтом некрасиво... :)
Картинка с другого сайта.
Ну, в общем, да.
  if OrderbY = ' ASC' then
   Windows.TextOutW(Canvas.Handle, ARect.Right - 12, ARect.Top + 2, #$25B2, 1)
  else
   Windows.TextOutW(Canvas.Handle, ARect.Right - 12, ARect.Top + 2, #$25BC, 1);


DimaBr
 DrawFrameControl(Canvas.Handle,Rect(0,0,16,16),DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTON3STATE);
 DrawFrameControl(Canvas.Handle,Rect(16,0,32,16),DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTONPUSH)
Так лучше!
Начинающий SQL 2008
Дата: 28.04.2011 13:50:32
В общем, сделал так:
 if (ARow = 0) and (ACol = ColumnIdx) then
  if OrderbY = ' ASC' then
   DrawFrameControl(Canvas.Handle, Rect(ARect.Right-12, 1, ARect.Right, 14), DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTON3STATE)
  else
   DrawFrameControl(Canvas.Handle, Rect(ARect.Right-12, 1, ARect.Right, 14), DFCS_BUTTONRADIOMASK,DFCS_INACTIVE+DFCS_BUTTONPUSH)

Для наглядности склеил 2 картинку в одну:
Картинка с другого сайта.