StringGrid的固定行点击的事件是什么?? 怎么做到点击固定行进行排序? 应该先将stringgrid的options->goRowSelect设为true。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我已解决了这个问题,可改成Delphi 若满意,别忘了加分噢,我花了半天时间。void GetRC(TStringGrid *StringGrid1,int X,int Y, int &row,int &col){ row=col=-1; int s; s=StringGrid1->RowHeights[0]; if (Y<=s) row=0; //是固定行 else for (int i=StringGrid1->TopRow; i<StringGrid1->RowCount && s<=StringGrid1->GridHeight; i++) { s+=StringGrid1->RowHeights[i]+ StringGrid1->GridLineWidth; if (Y<=s) { row=i; break; } } s=StringGrid1->ColWidths[0]; if (X<=s) col=0; // 是固定列 else for (int i=StringGrid1->LeftCol; i<StringGrid1->ColCount && s<=StringGrid1->GridWidth; i++) { s+=StringGrid1->ColWidths[i]+ StringGrid1->GridLineWidth; if (X<=s) { col=i;break; } }}void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y){ int row=-1,col=-1; GetRC(StringGrid1,X,Y,row,col); if (row>=0 && col>=0) ShowMessage("这是第"+String(row)+"行\n\n" " 第"+String(col)+"列");} 排序就更简单,用TStringList::Sort(),若非字典顺序,就用 TStringList::CustomSort(),不过要自行遍个比较函数.Delphi类似void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y){ int row=-1,col=-1; GetRC(StringGrid1,X,Y,row,col); if (row>=0 && col>=0) ShowMessage("这是第"+String(row)+"行\n\n" " 第"+String(col)+"列"); if (row>0 && col==0) // 点击了固定行了 { // 对行排序 TStringList *ss=new TStringList(); ss->AddStrings(StringGrid1->Rows[row]); ss->Sort(); StringGrid1->Rows[row]=(TStrings *)ss; delete ss; } } } bcb,我已经再c++builder中给你加了分了,在这里我再给你加上20分。你如果把排序问题做好,我就把剩下的分都给你。 我用的TStringList是带对象的,即用TStringList->AddObject((*TObject)ss)加入的,TStringGrid的一行就是一个对象值,希望你能对TStringList中对象的任意属性将TStringList排序。 你要求的排序不应该算难,主要是有一个例子让你参考。任意属性都可排序,关键要自行编写一个 比较的回调 函数,下面的 MyCompFun1( )及MyCompFun2( )就要两个这样函数;通过两个索引下标项index1与index2,访问到你要排序的关键属性值,假设存放到中间变量value1、value2中,然而设法比较这两个值,若 > 则须设法返回正值,= 返回0 ,< 返回负值,简单灵活。我假想你的对象结构是 MyObject,有个属性.ABC是排序关键字int __fastcall MyCompFun1(TStringList *List, int index1,int index2){ String value1=List->Strings[index1]; String value2=List->Strings[index2]; return(value1.AnsiCompare(value2));}typedef struct { // 用户目标对象结构 int ABC; int v1; } MyObject;int __fastcall MyCompFun2(TStringList *ss, int index1,int index2){ MyObject *p1=(MyObject *)ss->Objects[index1]; MyObject *p2=(MyObject *)ss->Objects[index2]; int value1,value2; if (p1==NULL) // 要考虑是否空指针 value1=0; else value1=p1->ABC; if (p2==NULL) value2=0; else value2=p2->ABC; return(value1-value2);}void __fastcall TForm1::Button1Click(TObject *Sender){ TStringList *ss=new TStringList(); ss->AddStrings(ListBox1->Items); ss->CustomSort(MyCompFun1); // 比较函数作参数排序 ListBox1->Items=ss; delete ss;}不知能否达到你的要求????? 我也想知道这个问题的解决办法,可bcb用的是c吧,难道在delphi中stringgrid就没有对点击事件的处理吗,sztanj老兄如果已经知道处理方法请email给我一份代码好吗,谢谢!!!祝大家有个好心情! sql+delphi的简单问题 如何做图文混排编辑器 如何控制MessageBox中MB_OK!或者是中文显示“确定”,或者是英文提示:“OK” 急!出500分求解!!!http://expert.csdn.net/Expert/topic/2314/2314739.xml?temp=.4611017 如何使用Delphi中的TMonthCalendar日期控件? 怎样得到在windows系统中是否设置"启用休眠"? 横报表问题 动态生成控件TChart的问题? 如何彻底除去一个已安装的组件 小问题!关于WINDOWS的编程。 我的升级包不好用 delphi 图形的问题
若满意,别忘了加分噢,我花了半天时间。void GetRC(TStringGrid *StringGrid1,int X,int Y,
int &row,int &col)
{
row=col=-1;
int s;
s=StringGrid1->RowHeights[0];
if (Y<=s)
row=0; //是固定行
else
for (int i=StringGrid1->TopRow;
i<StringGrid1->RowCount &&
s<=StringGrid1->GridHeight; i++)
{
s+=StringGrid1->RowHeights[i]+
StringGrid1->GridLineWidth;
if (Y<=s)
{
row=i;
break;
}
}
s=StringGrid1->ColWidths[0];
if (X<=s)
col=0; // 是固定列
else
for (int i=StringGrid1->LeftCol;
i<StringGrid1->ColCount &&
s<=StringGrid1->GridWidth; i++)
{
s+=StringGrid1->ColWidths[i]+
StringGrid1->GridLineWidth;
if (X<=s)
{
col=i;break;
}
}
}void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int row=-1,col=-1;
GetRC(StringGrid1,X,Y,row,col);
if (row>=0 && col>=0)
ShowMessage("这是第"+String(row)+"行\n\n"
" 第"+String(col)+"列");
}
就用 TStringList::CustomSort(),不过要自行遍个比较
函数.Delphi类似void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int row=-1,col=-1;
GetRC(StringGrid1,X,Y,row,col);
if (row>=0 && col>=0)
ShowMessage("这是第"+String(row)+"行\n\n"
" 第"+String(col)+"列");
if (row>0 && col==0) // 点击了固定行了
{ // 对行排序
TStringList *ss=new TStringList();
ss->AddStrings(StringGrid1->Rows[row]);
ss->Sort();
StringGrid1->Rows[row]=(TStrings *)ss;
delete ss;
}
} }
我用的TStringList是带对象的,即用TStringList->AddObject((*TObject)ss)加入的,
TStringGrid的一行就是一个对象值,希望你能对TStringList中对象的任意属性将TStringList排序。
你要求的排序不应该算难,主要是有一个
例子让你参考。任意属性都可排序,关键要
自行编写一个 比较的回调 函数,下面的
MyCompFun1( )及MyCompFun2( )就要两个
这样函数;通过两个索引下标项index1与
index2,访问到你要排序的关键属性值,
假设存放到中间变量value1、value2中,
然而设法比较这两个值,若 > 则须设法返回
正值,= 返回0 ,< 返回负值,简单灵活。
我假想你的对象结构是 MyObject,有个
属性.ABC是排序关键字int __fastcall MyCompFun1(TStringList *List,
int index1,int index2)
{
String value1=List->Strings[index1];
String value2=List->Strings[index2];
return(value1.AnsiCompare(value2));
}typedef
struct { // 用户目标对象结构
int ABC;
int v1;
} MyObject;int __fastcall MyCompFun2(TStringList *ss,
int index1,int index2)
{
MyObject *p1=(MyObject *)ss->Objects[index1];
MyObject *p2=(MyObject *)ss->Objects[index2]; int value1,value2; if (p1==NULL) // 要考虑是否空指针
value1=0;
else
value1=p1->ABC; if (p2==NULL)
value2=0;
else
value2=p2->ABC; return(value1-value2);
}void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *ss=new TStringList();
ss->AddStrings(ListBox1->Items);
ss->CustomSort(MyCompFun1); // 比较函数作参数排序
ListBox1->Items=ss;
delete ss;
}
不知能否达到你的要求?????