提供一个在Grid中嵌入CommandButton的自定义控件
程序代码:
CLEAR ALL CLOSE DATABASES ALL SET DEFAULT TO (Application.ActiveProject.HomeDir) Form1 = NEWOBJECT("C_Form") && 从类定义中C_Form中生成窗体 Form1.Show && 显示刚才生成的窗体 READ EVENTS && 激活交互事件 CLOSE DATABASES ALL CLEAR ALL RETURN && 程序结束 *----------------------------- * 程序运行窗体的类定义 *----------------------------- DEFINE CLASS C_Form AS Form Caption = "自定义按钮测试" && 窗体标题 WindowState = 2 && 启动时最大化 ADD OBJECT Grid1 AS Grid && 在窗体中放置一个Grid *------------------------- * 窗体载入内存时打开相关的数据表 *------------------------- PROCEDURE Load USE Table1 IN 0 ENDPROC *------------------------- * 窗体从内存中卸载时关闭已打开的数据表 *------------------------- PROCEDURE Unload USE IN Table1 ENDPROC *------------------------- * 自定义对窗体的控件进行布局的方法 *------------------------- PROCEDURE Arrange WITH This.Grid1 .Top = 5 .Left = 5 .Width = ThisForm.Width - .Left - 5 .Height = ThisForm.Height - .Top - 5 ENDWITH ENDPROC *------------------------- * 窗体激活或获得焦点时 *------------------------- PROCEDURE Activate ThisForm.Arrange ENDPROC *------------------------- * 窗体改变大小时 *------------------------- PROCEDURE Resize ThisForm.Arrange ENDPROC *------------------------- * 关闭窗体时释放交互事务 *------------------------- PROCEDURE Destroy CLEAR EVENTS ENDPROC *------------------------- * 表格的初始化 *------------------------- PROCEDURE Grid1.Init WITH This .RecordSourceType = 1 && 数据源为表别名 .RecordSource = "Table1" && 绑定数据源 WITH .Columns(3) && 对具体数据表中的某列细化 .RemoveObject("Text1") && 移除该栏中内置的TextBox控件 .AddObject("Button1", "GridCommandButton") && 新增自定义控件 WITH .Button1 .ControlSource = "Table1.F03" && 绑定本栏的数据源 .TrueCaption = "Yes" && 修改预定义的文字 .FalseCaption = "No" && 修改预定义的文字 .Width = 60 && 设置控件宽度 .Height = 20 && 设置控件高度 .Visible = .T. && 让控件可见 ENDWITH .CurrentControl = "Button1" && 设定本栏的控制控件 .Sparse = .F. && 每次Refresh时Grid所有行中本栏的数据均刷新 .Width = 60 && 本栏的宽度与新控件匹配 ENDWITH .RowHeight = 22 && 表格行的高度与新控件匹配 ENDWITH ENDPROC ENDDEFINE *----------------------------- * 功能:嵌入Grid中的CommandButton,可与逻辑型数据绑定 * 机制:从Container中继承,构造一个包含隐藏TextBox和呈现CommandButton的 * 自定义控件。TextBox与平常Grid Cell的一样绑定数据,把需要提供的 * 数据转交给CommandButton,以便呈现。 * 注意:数据绑定源须为逻辑型,否则失效或出错。 *----------------------------- DEFINE CLASS GridCommandButton AS Container BorderWidth = 0 && 取消容器的边框线 *------------------------- * 自定义属性 ControlSource = "" && 数据绑定源 TrueCaption = "是" && 当数据值为.T.时CommandButton的文字 FalseCaption = "否" && 当数据值为.F.时CommandButton的文字 *------------------------- *------------------------- * 内部受保护控件 *------------------------- ADD OBJECT PROTECTED Text1 AS TextBox WITH Visible = .F. ADD OBJECT PROTECTED Button1 AS CommandButton PROCEDURE Width_Assign(tAssign) This.Button1.Width = tAssign ENDPROC PROCEDURE Height_Assign(tAssign) This.Button1.Height = tAssign ENDPROC PROCEDURE ControlSource_Assign(tAssign) WITH This.Text1 .ControlSource = tAssign .Value = EVALUATE(tAssign) ENDWITH ENDPROC PROCEDURE Text1.Value_Assign(tAssign) This.Value = tAssign WITH This.Parent.Button1 .VisualEffect = IIF(tAssign, 2, 1) .Caption = IIF(This.Parent.Text1.Value, This.Parent.TrueCaption, This.Parent.FalseCaption) ENDWITH ENDPROC *------------------------- * 点击按钮时翻转值的真假 *------------------------- PROCEDURE Button1.Click WITH This.Parent.Text1 .Value = !.Value ENDWITH ENDPROC ENDDEFINE
运行效果图:
留意图中Grid的当前行在第一行,而第二行的按钮已变换外观,不受记录指针移动的影响。点击按钮除了即时改变外观,数据源也已改变,与平常是一样的。
[ 本帖最后由 TonyDeng 于 2012-7-2 04:22 编辑 ]