在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.

解决方案 »

  1.   

    这个问题其实简单: 就是怎么指定TreeView的onchange事件 treeview.onchange 方法可以指定一个treeview的ONCHANGE事件可是我无论怎么指定都实现不了具体如下:
    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'
     
      

  2.   

    另外两个出100分找资料的帖子连接如下:解决问题的一起送分
    http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
    http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771我的意思是解决这个问题的另外两帖子的分一并送上!!
      

  3.   

    1,我写的指定事件过程
    PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);
    BEGIN
      WITH TV DO BEGIN
        ONCHANGE := TV_MAIN_ONCHANGE;//(SENDER: TOBJECT;NODE: TTREENODE)你定义的参数没加上去
      END;
    END;
      

  4.   

    你是说
        ONCHANGE := TV_MAIN_ONCHANGE(Tv,Tv.selected);
    加上了更报错
      

  5.   

    回复人: cduck(cduck) ( ) 信誉:97 我知道 可我分很多
      

  6.   

    这样做当然不行啊:
    PROCEDURE TV_MAIN_ONCHANGE(SENDER: TOBJECT;NODE: TTREENODE);
    这个变成了普通的过程了,而不是类的方法了,怎么能赋给事件呢?它缺少了Self指针。
      

  7.   

    yleiou(生活真痛苦) ( ) 信誉:100 我知道 可我分很多................ 我分不多 很少, yleiou(生活真痛苦) 告诉我,分数多少有什么用??
      

  8.   

    juliens(星星球) ( ) 
    我该怎么写啊 不会啊
      

  9.   

    看一下类的继承吧,要不发个信息给 aiirii(爱的眼睛)叫他帮你修改一下
      

  10.   

    首先看看OnChage事件的原型是
    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;写完,收工
      

  11.   

    我建议你把OnChange事件还是放在OAMIAN窗口的代码里吧,要实现你的想法我也不会,你把事件处理程序放在另外一个Unit里,而又没有定义类,失去了RTTI,怎么搞?
    如果另有高手,我也坐下来等吧。
      

  12.   

    JavaD(一竿残照) ( ) 
    我照你的方法试试   
    各位帮忙的兄弟 小弟感激不尽
      

  13.   

    如果使用这个 PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW);控制几个 TV 的事件 你的这个思想应该用类来实现 如果只控制一个 TV 的话 你的这个方法不可取 直接对这个 TV 操作即可PROCEDURE TV_MAIN_EVENTS(VAR TV: TTREEVIEW); 如果能把它改为TTVChangedEvent类型的过程就可以实现你的问题
      

  14.   

    DelphiBoy2003(梦想的妻子是赵灵儿) ( 我们公司的DELPHI代码规范是大写 我也没办法 而且还规定一个函数过程不涉及输出
    不能超过45行....
      

  15.   

    簡單點是這樣吧
    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;
      

  16.   

    注意要先實例化 Test
    但我在測試中, 沒實例法, 也可執行!
      

  17.   

    一会没来这么多人了啊?
    只要定义了类一切就好办了,Unit中仅仅是过程的集合是无法实现楼主的功能的。
    斑竹的解决方法应该就可以了吧。
      

  18.   

    我们公司的DELPHI代码规范是大写 我也没办法 而且还规定一个函数过程不涉及输出
    不能超过45行....
    ---------------------
    你门公司的头肯定不是程序员出身
      

  19.   

    aiirii(ari-爱的眼睛)方法可行,但不符楼主要求。
      

  20.   

    >>aiirii(ari-爱的眼睛)方法可行,但不符楼主要求。
    是不是說, 將一個Form中的控件, 對應到另外一個unit 中處理??
    還有其它要求限制嗎?
    我提出的是一種比較簡單直接的解決方法!!當然, 還有其它方法, 不過要試下
      

  21.   

    應該也可用 SetWindowLong, 定義一個 WNDPROC, 在裹面處理相應要處理的消息!
    這樣就是一個函數了! 不要考慮sender的問題了
      

  22.   

    aiirii(ari-爱的眼睛) 老大,以后跟你混了我重新写了个类 参考了你的实现方法 很轻松实现了功能各位帮忙的兄弟 每个人都有分的 你们进我下面两个帖子聊会啊 
    http://community.csdn.net/Expert/topic/3117/3117995.xml?temp=.2194635
    http://community.csdn.net/Expert/topic/3118/3118028.xml?temp=.6058771这两个帖子我早想结了要不又影响信誉了 哈哈