DbGrid很难完成这个事情,建议你用TSortGrid,留下E-mail,我发给你,有Demo.
解决方案 »
- delphi 局域网消息接收
- DLL问题,可以付费解决此问题
- 关于TListView显示的一个奇怪问题
- 如何修改dataset的读写模式?
- 在线等:请问如何屏蔽掉控键中的键盘事件?
- 哪位大侠做过电子档案软件?
- 娱乐贴,求用delphi在任务管理器中弄出正弦曲线来
- 在Delphi中我知道一个对象,但是只知道他的一个父类型,我如何根据这个对象来创建一个和他一样类型的对象?
- 闲来无事,写了个解释全部的BDECODE的全程
- DELPHI中使用视图请教
- 请问 LoadBitmap(hInstance, 'BACKGROUND') 此函数的BACKGROUND windows资源自代马?
- 高分求教:如何创建有form的dll(用delphi)
[email protected]
谢谢 !
OnbuttonClick时间中改变标题,就可以了。
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;
三角形图标
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;
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;
把图画到Column[i].的 Rect 去主OK!!!
画图知道怎么编吧.
单击一下 升序, 再为降序;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;