c++ builder ListView实现可编辑任意列(转)
// ---------------------------------------------------------------------------
// 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实现可编辑任意列(转)的更多相关文章
- Visio编辑数据库模型列
Visio编辑数据库模型列:邮件group->Open实体,进入实体属性编辑界面,按回车可以添加.
- 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值
如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1. 输入 单价,数量,计算金额 ...
- [No000018E]Vim快速跳转任意行、任意列以及高亮显示当前行、当前列方法-Vim使用技巧(3)
vim提供了丰富的快速跳转任意行.任意列的方法,方便高效地移动光标,定位文件位置. 一.Vim行跳转 使用vim查看文件时,使用以下命令可以快速跳转文件首.尾行,方便对整个文件有个全局把握. 1.1 ...
- 用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头
分析: 1.由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参 ...
- ionic listview对象的编辑、排序和删除
1)ionic的listview对象即<ion-list></ion-list> 2)添加并显示编辑按钮(添加其他自定义按钮也一样) can-swipe属性设置为true(默认 ...
- ListView、DataGrid 不显示列标题
<!--ListView不显示列标题--> <Style TargetType="{x:Type GridViewColumnHeader}"> <S ...
- WPFDataGrid可以编辑某列Bug,困惑已久
这个问题困扰了好几天,最近在做DataGrid编辑列,有一个添加按钮,当我点击添加按钮的时候自动生成一行,并别生成序列号,然后按回车键完成添加,但是有一个问题就是:当我点击完添加按钮以后,然后继续添加 ...
- jqgrid 实现行编辑,表单编辑的列联动
这个问题的场景相信大家都遇到过,比方有A,B,C三列,B,C列均为下拉框.可是C列的值是由B列的值来决定的.即C列中的值是动态变化的,变化的根据就是B列中你选择的值. 本文给出的是一个有用,简易快捷的 ...
- [Excel] Excel固定任意行或者任意列
固定第一行第一列:点击B2单元格[以B2为中介点,找你冻结部分的中介点!行列的交叉点!] 例如只想固定第一行,那么请选择A2的单元格 为中介点,A3.A4…… 例如只想固定第一列,那么请选择B1的单元 ...
随机推荐
- 张恭庆编《泛函分析讲义》第二章第4节 $Hahn$-$Banach$ 定理习题解答
1.次线性泛函的性质 设 $p$ 是实线性空间 $\scrX$ 上的次线性泛函, 求证: (1)$p(0)=0$; (2)$p(-x)\geq -p(x)$; (3)任意给定 $x_0\in \scr ...
- [物理学与PDEs]书中的错误指出
记号意义: P--Page, 第几页; L--Line, 顺数第几行; LL--Last Line, 倒数第几行. P 64 L 1 ``15)'' should be ``14)''. P 70 L ...
- DataGridView操作
C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如 ...
- Hadoop Bloom filter应用示例
Hadoop0.20.2 Bloom filter应用示例 2014-06-04 11:55 451人阅读 评论(0) 收藏 举报 1. 简介 参见<Hadoop in Action>P1 ...
- Spring的AOP与代理
spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...
- 在UEFI下安装windows和Ubuntu双系统目前不可行
UEFI是BIOS的升级,未来将取代BIOS,说白了,就是跟BISO差不多的作用.但是目前比较新的主板兼容两种设置就比较坑了,默认是UEFI,UEFI下只能安装win8以上的版本,和linux64位系 ...
- NAND FLASH均衡算法笔记(转)
转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的.有意思的是,帖子提起这个算法并不是因为嵌入式开发 ...
- JDK环境变量中dt.jar、tools.jar等变量值的作用
变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; tools.jar: 工具类 库,它跟我们程序中用到的 基础 ...
- C# BackgroundWorker的使用【转-http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html】
BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork——当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoW ...
- Html5中的跨页面消息传输
1.如果要接受从其他的窗口那里发过来的消息,就必须对窗口对象的message事件进行监控. window.addEventListener("message",function() ...