想要实现的功能是用户点击dbgrid的某一项,实现按该项表示的属性排序的功能
关键的问题是,如何得到鼠标指向的该列表示的属性名?
关键的问题是,如何得到鼠标指向的该列表示的属性名?
解决方案 »
- 唉! delphi for PHP?
- 组件没有注册类别,急呀!!!
- 如何动态控制 masterdata(主数据 band ) 数据的显示....... 请高手指教..
- 我装了一个InfoPower4000Pro_vcl7为什么里成只有一个wwdatasource和一个wwrecordviewpanel呀其他的呢,为什么没有呀
- 我想问一下在SQL 和在ACESS 里能同时运行的语句..请大家帮忙..
- 怎么取文件夹下的所有文件。要求遍历从第一个到最后一个。
- 如何获取文件夹容量,能够获得局域网里文件夹容量,如\\dbserver\e$\data\。顶者有分!
- 最近我做的一个软件总是在运行时报这样的错。急急!!!
- dbchart做曲线图,如歌根据Y轴数值不同动态改变曲线颜色。
- 各位同志,我有个问题搞不清楚.请不吝赐教.
- 把一个已经创建的对象写入共享内存,另一个进程从中取出来使用。
- 如何保存邮件附件并取得附件类型????
WXK_Form: TWXK_Form;
bSort: Boolean = False;procedure TWXK_Form.DBGridEh1TitleClick(Column: TColumnEh);
var
i: integer;
fieldname: string;
begin
//排序
i := Column.Index;
if bSort then
begin
fieldname := DBGridEh1.Columns[i].FieldName + ' ASC';
bSort := False;
end
else
begin
fieldname := DBGridEh1.Columns[i].FieldName + ' DESC';
bSort := True;
end; DM.WareHouse_ADOQuery.Sort := fieldname;
end;
在DBGrid的OnTitleClick事件中添加以下代码,其中AdoQuery1为DBGrid的Dataset
mousedown := mousedown + 1;
if ADOQuery1.IsEmpty then abort;
if mousedown mod 2 = 1 then
ADOQuery1.Sort := column.FieldName
else
ADOQuery1.Sort := column.FieldName + ' ' + 'DESC';
var
i:integer;
begin
if dm.gz.FieldByName(Column.FieldName).FieldKind =fkData then
begin
for i:=0 to DBGrid1.Columns.Count-1 do
begin
if DBGrid1.Columns[i]<>Column then
begin
if (copy(DBGrid1.Columns[i].Title.Caption,1,2)='▲') or (copy(DBGrid1.Columns[i].Title.Caption,1,2)='▼') then
DBGrid1.Columns[i].Title.Caption:=copy(DBGrid1.Columns[i].Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption));
end else
begin
if copy(Column.Title.Caption,1,2)='▲' then
begin
dm.gz.Sort:=Column.FieldName+' DESC';
Column.Title.Caption:='▼'+copy(Column.Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption));
end else
begin
dm.gz.Sort:=Column.FieldName+' ASC';
if copy(Column.Title.Caption,1,2)='▼' then
Column.Title.Caption:='▲'+copy(Column.Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption))
else Column.Title.Caption:='▲'+Column.Title.Caption;
end;
end;
end;
end;
end;
var
i:integer;
begin
Result:=nil;
for i:=0 to Grid.Columns.Count-1 do
if Grid.Columns.Items[i].FieldName=Name then
Result:=Grid.Columns.Items[i];
end;
procedure TOneDBForm.dbgCEATitleClick(Column: TColumn);
var
DataSet:TClientDataSet;
ASC:boolean;
Clm:TColumn;
begin
DataSet:=TClientDataSet(Column.Field.DataSet);
if Assigned(DataSet) and DataSet.Active then
begin
ASC:=(StrPos(PChar(Column.Title.Caption),'▼')<>nil)
and (DataSet.IndexName=Column.Fieldname);
Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
if Assigned(Clm) then
begin
DataSet.DeleteIndex(DataSet.IndexName);
Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
end;
if Asc then
begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixDescending]);
Column.Title.Caption:=Column.Title.Caption+'▲';
end
else begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,[]);
Column.Title.Caption:=Column.Title.Caption+'▼';
end;
DataSet.IndexName:=Column.Fieldname;
end;
end;
procedure TOneDBForm.cdsCEABeforeClose(DataSet: TDataSet);
var
Column:TColumn;
begin
DataSet:=TClientDataSet(dbgcea.DataSource.DataSet);
if Assigned(DataSet) then
begin
Column:=FindColumn(dbgcea,cdscea.IndexName);
if Assigned(Column) then
begin
cdscea.DeleteIndex(cdscea.IndexName);
Column.Title.Caption:=Copy(Column.Title.Caption,1,
Length(Column.Title.Caption)-2);
end;
end;
end;
的二次回复是ClientDataSet的排序。
{自定义的用于排序的函数}
function GetSortMode1:string;
var tempstr,sortstr,initstr :string;
begin
//获取排序字符串,“字段 排序常数”
sortstr := invoicequiry.ADOQuery1.Sort;
//利用空格获取排序常数
tempstr := copy(sortstr,pos(' ',sortstr),255); //uppercase转化成大写字母方便比较
if (uppercase(trim(tempstr)) = 'ASC') then
begin
tempstr := 'DESC';
end
else
begin
tempstr := 'ASC';
end;
result := tempstr;
end;然后再ontitleclick中实现如下:
procedure Tinvoicequiry.DBGrid1TitleClick(Column: TColumn);
var invoiceid,tempstr,sortstr,inittitile :string;
begin
adoquery1.Sort := column.DisplayName + ' ' + Getsortmode1;
end;测试时可以达到排序的效果,现在的问题是如何在排序的那个属性的那一栏内实现排序的标记呢?就是楼上各位实现中的那些三角符号,在我的程序中应该怎么添加呢,楼上各位的东西我看不太明白,
所以请在我的代码的基础上给予指点,多谢!