// ---------------------------------------------------------------------------
// Form的构造函数中填充StrinGrid单元格
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
for (int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
{
for (int j = StringGrid1->FixedCols; j < StringGrid1->ColCount; j++)
{
StringGrid1->Cells[i][j] = i * + j;
}
}
} // ---------------------------------------------------------------------------
// 在StrinGrid的OnDrawCell事件中在指定的单元格绘制按钮
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender); // 填充背景,准备重绘
sg->Canvas->FillRect(Rect); // 如果当前正在绘制第三行第四列的格子(准备内嵌按钮的格子)
if (ARow == && ACol == )
{
// 63 63 72 75 6E 2E 63 6F 6D
// 用StringGrid的Tag作按钮弹起或按下的标志, 1为弹起, 0为按下
if (sg->Tag == )
DrawFrameControl(sg->Canvas->Handle, &Rect,
DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
else
DrawFrameControl(sg->Canvas->Handle, &Rect,
DFC_BUTTON, DFCS_BUTTONPUSH);
} // 以背景透明方式绘制出单元格的字符串
sg->Canvas->Brush->Style = bsClear; sg->Canvas->TextOut(Rect.Left + ,
(Rect.Height() - sg->Canvas->TextHeight("A") ) / + Rect.Top,
sg->Cells[ARow][ACol]);
} // ---------------------------------------------------------------------------
// 在StringGrid的OnMouseDown事件中判断如果当前鼠标下的格子是指定的格子
// 就改变StringGrid->Tag并使其重绘,以显示出按钮被按下的样子
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender);
if (!sg) return; // 获取StringGrid中当前鼠标下的行和列
int nCol, nRow;
TPoint ptMouse = sg->ScreenToClient(Mouse->CursorPos);
sg->MouseToCell(ptMouse.x, ptMouse.y, nCol, nRow); sg->Tag = nRow == && nCol == ? : ;
sg->Invalidate();
} // ---------------------------------------------------------------------------
// 在StringGrid的OnMouseUp事件中判断如果当前鼠标下的格子是指定的格子
// 就改变StringGrid->Tag并使其重绘,以显示出按钮被弹起的样子
void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender);
if (!sg) return; // 获取StringGrid中当前鼠标下的行和列
int nCol, nRow;
TPoint ptMouse = StringGrid1->ScreenToClient(Mouse->CursorPos);
sg->MouseToCell(ptMouse.x, ptMouse.y, nCol, nRow); sg->Tag = ; // 注意这里和上面OnMouseDown的不同
sg->Invalidate(); // 在OnMouseUp事件中处理点击事件
if (nRow == && nCol == )
{
// 这里加入自己的代码即可 ShowMessage(String().sprintf(
TEXT("按钮 %s 被点击"), sg->Cells[nRow][nCol]));
}
}

c++ builder ListView实现可编辑任意列(转)的更多相关文章

  1. Visio编辑数据库模型列

    Visio编辑数据库模型列:邮件group->Open实体,进入实体属性编辑界面,按回车可以添加.

  2. 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值

    如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1.  输入 单价,数量,计算金额 ...

  3. [No000018E]Vim快速跳转任意行、任意列以及高亮显示当前行、当前列方法-Vim使用技巧(3)

    vim提供了丰富的快速跳转任意行.任意列的方法,方便高效地移动光标,定位文件位置. 一.Vim行跳转 使用vim查看文件时,使用以下命令可以快速跳转文件首.尾行,方便对整个文件有个全局把握. 1.1 ...

  4. 用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头

    分析: 1.由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参 ...

  5. ionic listview对象的编辑、排序和删除

    1)ionic的listview对象即<ion-list></ion-list> 2)添加并显示编辑按钮(添加其他自定义按钮也一样) can-swipe属性设置为true(默认 ...

  6. ListView、DataGrid 不显示列标题

    <!--ListView不显示列标题--> <Style TargetType="{x:Type GridViewColumnHeader}"> <S ...

  7. WPFDataGrid可以编辑某列Bug,困惑已久

    这个问题困扰了好几天,最近在做DataGrid编辑列,有一个添加按钮,当我点击添加按钮的时候自动生成一行,并别生成序列号,然后按回车键完成添加,但是有一个问题就是:当我点击完添加按钮以后,然后继续添加 ...

  8. jqgrid 实现行编辑,表单编辑的列联动

    这个问题的场景相信大家都遇到过,比方有A,B,C三列,B,C列均为下拉框.可是C列的值是由B列的值来决定的.即C列中的值是动态变化的,变化的根据就是B列中你选择的值. 本文给出的是一个有用,简易快捷的 ...

  9. [Excel] Excel固定任意行或者任意列

    固定第一行第一列:点击B2单元格[以B2为中介点,找你冻结部分的中介点!行列的交叉点!] 例如只想固定第一行,那么请选择A2的单元格 为中介点,A3.A4…… 例如只想固定第一列,那么请选择B1的单元 ...

随机推荐

  1. 【初识】KMP算法入门(转)

    感觉写的很好,尤其是底下的公式,易懂,链接:http://www.cnblogs.com/mypride/p/4950245.html 举个例子 模式串S:a s d a s d a s d f a  ...

  2. curl命令使用小结[转]

    curl命令有不少小技巧,linux下测试确实很方便.转http://blog.csdn.net/zhangliang_571/article/details/26379777 1.开启gzip请求c ...

  3. 转--Invalidate和postInvalidate的更新view区别

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...

  4. windows上传文件到linux

    1.在putty的网站上下载putty跟pscp 2.安装ssh跟putty sudo apt-get install openssh-server sudo apt-get install putt ...

  5. 华为ICDcomm接口js测试

    1)获取坐席状态接口调用方法: “方法”------“坐席与班组” 中的 Phone.QueryAgentStatusEx(工号)如果该方法调用成功,那么坐席状态将会存入到属性: Phone.Agen ...

  6. Wex5案例使用JSON传输Thinkphp后端对接,以达成数据正常输出

    初步接触Wex5,操作起来还是觉得比较复杂!而且教程不多,让我着实比较烦躁! 因此自己动手丰衣足食!还是比较实在的! 采用版本:WeX5应用快速开发框架V3.5正式版 我们使用Wex5的仿淘宝APP案 ...

  7. Oracle中增加,修改,删除表中的列

    有些时候,当一个表已经建好,并且已经使用后,发现需要对表结构进行修改,这个时候就要对表中的列进行增删查改操作. 为表增加新列: ALTER TABLE table_name ADD ( column_ ...

  8. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

  9. Inno Setup执行SQL脚本的方法

    作为和NSIS并立的.两个最流行的免费Windows应用程序安装包制作工具之一,Inno在学习难度上相对要低一些,非常适合对一些简单的桌面程序打包.但对于较复杂的安装过程,或者Web应用程序来说,我个 ...

  10. Delphi ServerSocket,ClientSocket示例

    Delphi ServerSocket,ClientSocket示例 2008-05-09 16:20 Delphi TServerSocket,TClientSocket实现传送文件代码 1.建立两 ...