设计期的右键菜单在哪,
如pagecontrol的 new page
menu的 menu designer
在设计期时我们右键就能出这些菜单,它们都存在哪了呢,好象注册表中没有。
自定义控件想加设计期的右键菜单,写在哪呀。

解决方案 »

  1.   

    需要从TComponentEditor继承.
    然后:
        function GetVerb(Index: Integer): string; override;
        function GetVerbCount: Integer; override;
        procedure ExecuteVerb(Index: Integer); override;override上面三个函数.GerVerbCount里面就加一句:
    Result := 2;  //返回自己增加的菜单的个数GetVerb:  //根据index参数返回菜单项的caption
      case index of
        0: Result := 'New Page';
        1: Result := 'Next Page';
        //...........
      end;ExecuteVerb: //根据index参数,填写点击菜单的响应过程.--------------------------------------------------------
    这个TComponentEditor类里面,有个属性:Component,它表示你右键菜单点的控件.当前你的例子里面是TPageControl.还有个Designer属性,是个接口.
    你可以调用里面的方法:
    Designer.Modified;  
    这个方法很重要,当你完成了下面的代码后:
    ATabSheet := CreateYourTabSheet;
    TPageControl(Component).Pages.Add(ATabSheet); //不知道是不是叫这个Pages名字,我随便写的.
    也就是说,动态创建一个tabsheet,然后加到pagecontrol的列表里面后.你还得调用:Designer.Modified;调用Designer.Modified;的过程,就是:
    1.在设计时,pagecontrol所在的form的dfm文件里面,加上你这个刚加进去的tabsheet.
    2.在pas文件里面,form的定义TYourForm = class(TForm)后面,private 前面,增加新的tabsheet的定义行.
      

  2.   

    哦,忘了说了,还有:
    注册的时候,register过程:
    procedure Register;
    begin
      RegisterComponentEditor(TYourPageControl, TYourPageControlEditor);
      RegisterComponents('ActiveX', [TYourPageControl]);
    end;TYourPageControlEditor 就是你从TComponentEditor所派生出来的类的名字.
      

  3.   

    suton,好久不见呀,照片是你家小乖吗
      

  4.   

    给出一个实例:
     
    type
    TControlEditor = class(TComponentEditor) 
      public
       function GetVerb(Index: Integer): string; override;
       function GetVerbCount: Integer; override;
       procedure ExecuteVerb(Index: Integer); override;
      end;
     
    function TControlEditor.GetVerb(Index: Integer): string;
    Begin
      Result := '&Edit Items...';
    End;
     
    function TControlEditor.GetVerbCount: Integer;
    Begin
      Result := 1;
    End;
     
    procedure TControlEditor.ExecuteVerb(Index: Integer);
    var
      Dlg: TEditorForm;  //跟一般的form一样,用来点设计时右键时,弹出的窗口,编辑属性.
    Begin
      Dlg:= TEditorForm.Create(Application);
      Try
        Dlg.ShowModal;
        if Dlg.ModalResult = mrOK then
        begin
          if Dlg.Modified then
          begin
            CopyProperty(Dlg, Component);          // 将修改过的属性赋值到控件中
            Designer.Modified;
          end;
        end;
      finally
        Dlg.Free;
      End;
    End;
      

  5.   

    to : megyrr是啊,偶儿子,现在快1岁了.
      

  6.   

    [Warning] MyComCtrls.pas(5334): Return value of function 'TMyPageControlEditor.GetVerbCount' might be undefined
    [Error] MyComCtrls.pas(22836): Undeclared identifier: 'RegisterComponentEditor'
      

  7.   

    [Error] MyComCtrls.pas(22836): Undeclared identifier: 'RegisterComponentEditor'
      

  8.   

    uses
      DesignIntf;你的register过程,和你的TMyPageControlEditor这个类的定义及实现,最好单独的放在一个unit里面.
    不要和TMyPageControl放在一个单元.因为register过程和TComponentEditor 需要uses DesignEditors, DesignIntf
    如果你将他们放在TMyPageControl的那个单元,到时候,会出现什么pixos.dcu(大概是这个名字,记不清了)之类的单元,找不到的问题.
      

  9.   

     File not found: 'DsgnIntf.dcu'
    我把 DsgnIntf.dcu    copy到lib了的。
      

  10.   

    能写个add page的ExecuteVerb吗
      

  11.   

          FNewDockSheet := TMyTabSheet.Create(TMyPageControl(Component));
          FNewDockSheet.caption   :=   IntToStr(TMyPageControl(Component).PageCount);
          FNewDockSheet.PageControl:=TMyPageControl(Component);
      

  12.   

    Designer.Modified; 未起效
    没达到这个目的,
    调用Designer.Modified;的过程,就是: 
    1.在设计时,pagecontrol所在的form的dfm文件里面,加上你这个刚加进去的tabsheet. 
    2.在pas文件里面,form的定义TYourForm = class(TForm)后面,private 前面,增加新的tabsheet的定义行.