//画一个三角形(dbgrid也行)用Ehlib的DBGridEh控件,它里面有内置箭头(如果要在DBGrid实现,可以参照其实现源码)。设计时指定,设置如 DBGridEh1.Columns[0].title.SortMarker:= smDownEh 或 smUpEh用代码实现,在DBGridEh1.OnTitle事件中: procedure TFQueryForm.DBGridEh1TitleClick(Column: TColumnEh); var sortstr: string; begin if not (DataSource.DataSet.Eof and DataSource.DataSet.Bof) then begin SortStr:=''; case Column.Title.SortMarker of smNoneEh: Column.Title.SortMarker:=smDownEh; smDownEh: Column.Title.SortMarker:=smUpEh; smUpEh:Column.Title.SortMarker:=smDownEh ; end; if Column.Title.SortMarker = smDownEh then SortStr:=Column.Field.FieldName+' DESC' else SortStr:=Column.Field.FieldName+' ASC'; with DataSource.DataSet as TADODataSet do Sort:= SortStr; end; end;
首先感谢两位的热情帮助, to fancier(OP&&(C/C++)) 你的意思是要借助于第三方控件 to qwertyasd(昊) 你的意思是放一个图象上去 不知道不借助第三方控件是否可以实现?
ListView1.StateImages:=ImageList1; procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin if Column.Index=0 then begin if Column[0].ImageIndex:=0 begin Column[0].ImageIndex:=1; ...... ...... end else Column[0].ImageIndex:=0 ; ..... ...... end; end; end;
//让Icon显示在右边ListView.StateImages:=ImageList1; ListView.Column[0].ImageIndex:=0; ShowHeaderIcon();//------------------------ procedure ShowHeaderIcon(); var h:THandle; i:Integer; hi:THDItem; begin h := GetDlgItem(ListView.Handle, 0); //get Header Handle for i := 0 to ListView.Columns.Count - 1 do begin hi.mask := HDI_FORMAT; Header_GetItem(h,i, hi); hi.mask := HDI_FORMAT; hi.fmt := hi.fmt or HDF_BITMAP_ON_RIGHT; Header_SetItem(h,i, hi); end; end;//不过,单击了列标题或者改变了列宽度后图象会跑到左边,需要拦截WM_PAIN消息,在该消息中再调用SetHeaderIcon()。
DBGridEh1.Columns[0].title.SortMarker:= smDownEh 或 smUpEh用代码实现,在DBGridEh1.OnTitle事件中:
procedure TFQueryForm.DBGridEh1TitleClick(Column: TColumnEh);
var
sortstr: string;
begin
if not (DataSource.DataSet.Eof and DataSource.DataSet.Bof) then
begin
SortStr:='';
case Column.Title.SortMarker of
smNoneEh: Column.Title.SortMarker:=smDownEh;
smDownEh: Column.Title.SortMarker:=smUpEh;
smUpEh:Column.Title.SortMarker:=smDownEh ;
end; if Column.Title.SortMarker = smDownEh then
SortStr:=Column.Field.FieldName+' DESC'
else
SortStr:=Column.Field.FieldName+' ASC'; with DataSource.DataSet as TADODataSet do
Sort:= SortStr;
end;
end;
ListView1.StateImages:=ImageList1;
ListView1.Column[0].ImageIndex:=0;
to fancier(OP&&(C/C++))
你的意思是要借助于第三方控件
to qwertyasd(昊)
你的意思是放一个图象上去
不知道不借助第三方控件是否可以实现?
procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
begin
if Column.Index=0 then
begin
if Column[0].ImageIndex:=0
begin
Column[0].ImageIndex:=1;
......
......
end else
Column[0].ImageIndex:=0 ;
.....
......
end;
end;
end;
ListView.Column[0].ImageIndex:=0;
ShowHeaderIcon();//------------------------
procedure ShowHeaderIcon();
var
h:THandle;
i:Integer;
hi:THDItem;
begin
h := GetDlgItem(ListView.Handle, 0); //get Header Handle
for i := 0 to ListView.Columns.Count - 1 do
begin
hi.mask := HDI_FORMAT;
Header_GetItem(h,i, hi);
hi.mask := HDI_FORMAT;
hi.fmt := hi.fmt or HDF_BITMAP_ON_RIGHT;
Header_SetItem(h,i, hi);
end;
end;//不过,单击了列标题或者改变了列宽度后图象会跑到左边,需要拦截WM_PAIN消息,在该消息中再调用SetHeaderIcon()。