在OAMIAN窗口中有一个TREEVIEW组件,直接VCL拖过来的,什么属性和事件都没有设置过
我再建立了一个UNIT,希望通过他来对这个TREEVIEW进行控制,如初始化属性,响应事件。在写代码时,对属性的操作一点问题也没有,不过到EVENTS时,问题出来了。
下面是问题 我如何指定TREEVIEW的ONCHANGE 事件 ,有人告诉俺到类里面定义,我不会写,现在贴出整个单元的源代码,请达人指教,最好能在原有的基础上改好测试通过后给我!另外两个出100分找资料的帖子连接如下:解决问题的一起送分
http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771///////////////////////
TV_MAIN为外部组件TREEVIEW的NAME
/////////////////////
unit M_TV_INITIALIZE;interface
USES Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids_ts, TSGrid, ComCtrls;PROCEDURE TV_MAIN_INITIALIZE(VAR TV: TTREEVIEW); //初始化TV_MAIN(TREEVIEW)
PROCEDURE TV_PROPERTIES(TREE: TTREEVIEW); //基本属性设置
PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW); //初始化节点事件
PROCEDURE TV_MAIN_DRAWTREE(TREE: TTREEVIEW); //画节点
PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);implementation
USES GLOBAL_CONST, //全局常量
M_SYSTEM_BOX; //模块->>用户功能箱PROCEDURE TV_MAIN_INITIALIZE(VAR TV: TTREEVIEW);
BEGIN
TV_PROPERTIES(TV);
TV_MAIN_EVENTS(TV);
TV_MAIN_DRAWTREE(TV);
END;PROCEDURE TV_PROPERTIES(TREE: TTREEVIEW);
BEGIN
WITH TREE DO BEGIN
ALIGN := ALCLIENT;
BEVELINNER := BVNONE;
BORDERSTYLE := BSNONE;
COLOR := CLWHITE;
CTL3D := FALSE;
MULTISELECT := FALSE;
SHOWBUTTONS := FALSE;
SHOWROOT := FALSE;
PARENTCTL3D := FALSE;
HOTTRACK := FALSE;
READONLY := TRUE;
ROWSELECT := TRUE;
SORTTYPE := STNONE;
TABORDER := 1;
Indent := 28; //确定展开子节点时相对于其展开的父节点的象素缩进量
RIGHTCLICKSELECT := TRUE;
END;
// Images = ImageList3
// PopupMenu = PopupMenu2
// OnChange = TreeView1Change
END;PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);
BEGIN
WITH TV DO BEGIN
// ONCHANGE := TV_MAIN_ONCHANGE;//就是这里报错 调用失败
END;
END;PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);
BEGIN
SHOWMESSAGE('调用成功');
END;PROCEDURE TV_MAIN_DRAWTREE(TREE: TTREEVIEW);
VAR NODE: TTREENODE;
BOX: STRING;
STRS: TSTRINGLIST;
I: INTEGER;
BEGIN
WITH TREE DO BEGIN
ITEMS.Clear;
NODE := ITEMS.AddChild(NIL,'我的公文箱');
BOX := SYSTEM_BOX(GC_CUR_USER_DUTY_GRADE,GC_CUR_USER_PROXY_DUTY_GRADE);
STRS := TSTRINGLIST.Create;
EXTRACTSTRINGS(['#'], [], PCHAR(BOX), STRS);
FOR I := 0 TO STRS.COUNT - 1 DO BEGIN
//插入节点的IMAGE
ITEMS.AddChild(NODE,STRS.Strings[I]);
END;
ITEMS.AddChild(NODE,'新建业务');
STRS.FREE;
FULLEXPAND;
END;
END;end.
我再建立了一个UNIT,希望通过他来对这个TREEVIEW进行控制,如初始化属性,响应事件。在写代码时,对属性的操作一点问题也没有,不过到EVENTS时,问题出来了。
下面是问题 我如何指定TREEVIEW的ONCHANGE 事件 ,有人告诉俺到类里面定义,我不会写,现在贴出整个单元的源代码,请达人指教,最好能在原有的基础上改好测试通过后给我!另外两个出100分找资料的帖子连接如下:解决问题的一起送分
http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771///////////////////////
TV_MAIN为外部组件TREEVIEW的NAME
/////////////////////
unit M_TV_INITIALIZE;interface
USES Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids_ts, TSGrid, ComCtrls;PROCEDURE TV_MAIN_INITIALIZE(VAR TV: TTREEVIEW); //初始化TV_MAIN(TREEVIEW)
PROCEDURE TV_PROPERTIES(TREE: TTREEVIEW); //基本属性设置
PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW); //初始化节点事件
PROCEDURE TV_MAIN_DRAWTREE(TREE: TTREEVIEW); //画节点
PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);implementation
USES GLOBAL_CONST, //全局常量
M_SYSTEM_BOX; //模块->>用户功能箱PROCEDURE TV_MAIN_INITIALIZE(VAR TV: TTREEVIEW);
BEGIN
TV_PROPERTIES(TV);
TV_MAIN_EVENTS(TV);
TV_MAIN_DRAWTREE(TV);
END;PROCEDURE TV_PROPERTIES(TREE: TTREEVIEW);
BEGIN
WITH TREE DO BEGIN
ALIGN := ALCLIENT;
BEVELINNER := BVNONE;
BORDERSTYLE := BSNONE;
COLOR := CLWHITE;
CTL3D := FALSE;
MULTISELECT := FALSE;
SHOWBUTTONS := FALSE;
SHOWROOT := FALSE;
PARENTCTL3D := FALSE;
HOTTRACK := FALSE;
READONLY := TRUE;
ROWSELECT := TRUE;
SORTTYPE := STNONE;
TABORDER := 1;
Indent := 28; //确定展开子节点时相对于其展开的父节点的象素缩进量
RIGHTCLICKSELECT := TRUE;
END;
// Images = ImageList3
// PopupMenu = PopupMenu2
// OnChange = TreeView1Change
END;PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);
BEGIN
WITH TV DO BEGIN
// ONCHANGE := TV_MAIN_ONCHANGE;//就是这里报错 调用失败
END;
END;PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);
BEGIN
SHOWMESSAGE('调用成功');
END;PROCEDURE TV_MAIN_DRAWTREE(TREE: TTREEVIEW);
VAR NODE: TTREENODE;
BOX: STRING;
STRS: TSTRINGLIST;
I: INTEGER;
BEGIN
WITH TREE DO BEGIN
ITEMS.Clear;
NODE := ITEMS.AddChild(NIL,'我的公文箱');
BOX := SYSTEM_BOX(GC_CUR_USER_DUTY_GRADE,GC_CUR_USER_PROXY_DUTY_GRADE);
STRS := TSTRINGLIST.Create;
EXTRACTSTRINGS(['#'], [], PCHAR(BOX), STRS);
FOR I := 0 TO STRS.COUNT - 1 DO BEGIN
//插入节点的IMAGE
ITEMS.AddChild(NODE,STRS.Strings[I]);
END;
ITEMS.AddChild(NODE,'新建业务');
STRS.FREE;
FULLEXPAND;
END;
END;end.
解决方案 »
- delphi 接收心跳包怎么写
- 帮mm问个保存网页的问题,朋友还得多支持哦:)
- 我在网上找的一个代码,可是有个问题,帮帮我吧看一下
- 用SQL对ACSEES日期时间字段进行查询
- 有谁能在QQ上和我语音聊一下关于分布式开发方面的内容!!QQ:53782893
- 如何做出边角为圆形的按钮,现在delphi里的按钮边角都是直角的,有什么控件可以用吗,
- 用ADSL上网后,如何用代码取得因特网IP是多少?
- 急救!!!!关于MTS/COM+问题,在线等等
- 快来帮我啊
- 使用adoconnection时,在程序中如何设定其connectstring
- 急阿! 快帮帮忙阿!我做了好久,想不出所以然来
- 老问题: 关于权限的比较简单的问题?
1,我写的指定事件过程
PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);
BEGIN
WITH TV DO BEGIN
ONCHANGE := TV_MAIN_ONCHANGE; //这里报错,错误代码在最后
END;
END;
2,被指定的事件
PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);
BEGIN
SHOWMESSAGE('调用成功');
END;错误代码: [Error] M_TV_INITIALIZE.pas(54): Incompatible types: 'method pointer and regular procedure'
http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771我的意思是解决这个问题的另外两帖子的分一并送上!!
PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);
BEGIN
WITH TV DO BEGIN
ONCHANGE := TV_MAIN_ONCHANGE;//(SENDER: TOBJECT;NODE: TTREENODE)你定义的参数没加上去
END;
END;
ONCHANGE := TV_MAIN_ONCHANGE(Tv,Tv.selected);
加上了更报错
PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);
这个变成了普通的过程了,而不是类的方法了,怎么能赋给事件呢?它缺少了Self指针。
我该怎么写啊 不会啊
procedure onchage(Sender: TObject; Node: TTreeNode) of Object;
那么可以定义类型一样的函数如(在你的那个单元里),注意必须是一个类的方法
type
TMyClass=class
procedure myonchage(Sender: TObject; Node: TTreeNode);
............
procedure TmyClass.myonchage(Sender: TObject; Node: TTreeNode);
begin
//实现
end;在初始化的地方,TreeView1.OnChange := TmyClass.myonchage;写完,收工
如果另有高手,我也坐下来等吧。
我照你的方法试试
各位帮忙的兄弟 小弟感激不尽
不能超过45行....
unit Unit2;interface uses dialogs, ComCtrls; type
TTest = class
procedure Memo1Change(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
end;
var
Test: TTest;
implementation
{ TTest }
procedure TTest.Memo1Change(Sender: TObject);
begin
ShowMessage('here');
end;
procedure TTest.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
ShowMessage('here');
end;在另外一個unit中這樣處理
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.OnChange := Test.Memo1Change;
TreeView1.OnChange := Test.TreeView1Change;
end;當然, 注意要先實例化 Test
Test := Test.Create;
但我在測試中, 沒實例法, 也可執行!
只要定义了类一切就好办了,Unit中仅仅是过程的集合是无法实现楼主的功能的。
斑竹的解决方法应该就可以了吧。
不能超过45行....
---------------------
你门公司的头肯定不是程序员出身
是不是說, 將一個Form中的控件, 對應到另外一個unit 中處理??
還有其它要求限制嗎?
我提出的是一種比較簡單直接的解決方法!!當然, 還有其它方法, 不過要試下
這樣就是一個函數了! 不要考慮sender的問題了
http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771这两个帖子我早想结了要不又影响信誉了 哈哈