StringGrid的固定行点击的事件是什么? 怎么做到点击固定行进行排序?

sztanj 2000-09-13 05:08:00
加精
...全文
231 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sztanj 2000-09-16
  • 打赏
  • 举报
回复
麻烦你晚上帮我解决问题,十分感谢! 区区60分聊表敬意,请笑纳。
昨天晚上你在解决问题,我却在看电视,惭愧惭愧!!
sztanj 2000-09-15
  • 打赏
  • 举报
回复
我试了一下,点击固定行根本就不激发OnClick事件,怎么搞?
BCB 2000-09-15
  • 打赏
  • 举报
回复
(:|
非常抱歉,匆忙之中编出的GetRC()子程序还是出
了错,当行列多而滚动时,固定行列又被当成了普通行
列对待,返回的却不是0。应该首先判定是不是固定行
或列,下列有改进,若还有其它Bug,以后再改进。


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)+"列");
}
BCB 2000-09-15
  • 打赏
  • 举报
回复

考虑到不同的要求,固定行与固定列都有可能作为点击对
象,下面GetRC()函数可求出鼠标所点击的任意行与列,即
使滚动仍可正确,知道了行号、列号,事情就好办了。通用
性很好,众友不妨一试.

void GetRC(TStringGrid *StringGrid1,int X,int Y,
int &row,int &col)
{
row=col=-1; // 表示行列之外
int s;
s=0; // 计算行号
for (int i=StringGrid1->TopRow-1;
i<StringGrid1->RowCount &&
s<=StringGrid1->GridHeight; i++)
{
s+=StringGrid1->RowHeights[i]+
StringGrid1->GridLineWidth;
if (Y<s)
{
row=i;break;
}
}
s=0; // 计算列号
for (int i=StringGrid1->LeftCol-1;
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)+"列");
}

BCB 2000-09-15
  • 打赏
  • 举报
回复
在ONCLICK 中可访问
StringGrid1->Col
StringGrid1->Row
就可知道当前点击位置
BCB 2000-09-15
  • 打赏
  • 举报
回复
StringGrid的属性中已有当前行Row与列Col位置,
与ONCLICK()配合使用就可了再试试。
BCB 2000-09-15
  • 打赏
  • 举报
回复
固定行的确是个盲区,除了Mouse事件,其它都不行,下面程序
能间接地算出它的行号,并按字符串顺排序该行,若其它顺序
可用TStringList::CustomSort()代替Sort(),不过要自行编
个比较函数。程序稍长点,但能正确地达到目的.

void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int H=StringGrid1->RowHeights[0];
if (Y>H && X<StringGrid1->ColWidths[0])
for (int L=StringGrid1->TopRow;
L<StringGrid1->RowCount &&
H<=StringGrid1->GridHeight; L++)
{
H+=StringGrid1->RowHeights[L]+
StringGrid1->GridLineWidth;
if (Y<H)
{
ShowMessage("这是第"+String(L)+"行");
TStringList *ss=new TStringList();
ss->AddStrings(StringGrid1->Rows[L]);
ss->Sort();
StringGrid1->Rows[L]=(TStrings *)ss;
delete ss;
break;
}
}
}
// 试好了,别记了给俺加分,本人专家分还为0
sztanj 2000-09-13
  • 打赏
  • 举报
回复
我试了一下,点击固定行根本就不激发OnClick事件,点击其它行就可以激发OnClick事件。
sztanj 2000-09-13
  • 打赏
  • 举报
回复
OnClick里没有鼠标点击的位置或选择的cell的row,col呀。怎么办?
ace 2000-09-13
  • 打赏
  • 举报
回复
没有吧
只能在OnClick里处理,如果row 或 col 等于 0 就是固定行了

排序?重新填充一边吧

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧