写过控件编辑器的看一下 ( 积分: 100 )

  • 主题发起人 主题发起人 OverlordBlind
  • 开始时间 开始时间
O

OverlordBlind

Unregistered / Unconfirmed
GUEST, unregistred user!
为一个控件编了个控件编辑器,希望能在设计期为其动态增加子控件,就像TMainMenu
和TMenuItem一样,但怎样才能让新产生的子控件出现在Delphi的属性编辑器中呢?
delphi中菜单编辑器是怎么做的?有源码吗?
//容器控件
TobContainer = class(TComponent)
...
end;

//子项控件
TobItem = class(TComponent)
...
end;

//TobContainer的编辑器
TobContainerEditor = class(TComponentEditor)
...
procedure ExecuteVerb(Index: Integer); override;
end;

procedure TobContainerEditor.ExcuteVerb(Index: Integer);
begin
case Index of
0: TobItem.Create(TobContainer(Component));
end;
end;
这样Item是建立了,但IDE没反应,请赐教
 
为一个控件编了个控件编辑器,希望能在设计期为其动态增加子控件,就像TMainMenu
和TMenuItem一样,但怎样才能让新产生的子控件出现在Delphi的属性编辑器中呢?
delphi中菜单编辑器是怎么做的?有源码吗?
//容器控件
TobContainer = class(TComponent)
...
end;

//子项控件
TobItem = class(TComponent)
...
end;

//TobContainer的编辑器
TobContainerEditor = class(TComponentEditor)
...
procedure ExecuteVerb(Index: Integer); override;
end;

procedure TobContainerEditor.ExcuteVerb(Index: Integer);
begin
case Index of
0: TobItem.Create(TobContainer(Component));
end;
end;
这样Item是建立了,但IDE没反应,请赐教
 
关键是要掌握动态创建组件的技术
以前日本人写了一个组件不错
DSNSYSLIGHT
 
查查旧贴可能有
 
to tkggai:
刚载了DSNSYSLIGHT,正在看源码
大富翁的全文搜索怎么打不开了?
 
大概看了一下,dsnsyslight是用来实现运行期设计的,大体上仿照delphi写了个
设计环境,我想问的怎样向真正的delphi环境注入自己动态生成的控件
 
DSNSYSLIGHT上面有例子,你可学习一下
不过要想商用,部分代码还得改一下
 
不是商用,学习中
接着看代码
 
TypInfo.pas中有获得对象/类属性及值的函数
 
看了一下用菜单编辑器制作菜单的过程,发现每增加一个菜单项,pas文件中会增加一个
TMenuItem的变量,同时,Object TreeView中出现相应的菜单项图标,由此可见,
菜单编辑器使delphi产生了菜单项的组件,就像平时我们用鼠标在组件面板上点下
一个控件一样,只不过新产生的菜单项组件的Owner不是平时的Form,而是菜单,
所以,本问题转变为:怎样用控件编辑器为Delphi生成代码(可能不准确,是加入了
一个控件,单边面看来就是pas文件中增加了一个变量声明
写过专家包的高手应该遇到过吧?
 
procedure TobContainerEditor.ExcuteVerb(Index: Integer);
begin
case Index of
0: Designer.SelectComponent(TobItem.Create(TobContainer(Component)));
end;
end;
 
to zjjzl:
试了,没用,不能在pas里自动增加组件变量的话都没用。刚才看了一下TTable的原码,非常奇怪,在Form上放了Table,DataSource,
DBGrid,并设置互相关联后,Delphi的察看器里一下子出了个复杂的树状结构:
Default{Session}
|-DBDEMOS{Alias}
|-clients.dbf{Table1}
|-Constraints
|-DataSource1
|-FieldDefs
|-Fields
|-IndexDefs
其中,点Default,DBDEMOS,Fields时Object Inspector中显示的是nothing selected,
就是说那只是维持树状结构用的空架子,而Constraints,FieldDefs,IndexDefs是
TTable的属性,竟出现在Object Inspector中,最可怕的是DataSource1是放在Form里的
组件,竟跑到Table1里面去了,看了TTable和TDataSource的原码,也没找到操作IDE的代码
到底是怎么回事呢?
 
"一个控件一样,只不过新产生的菜单项组件的Owner不是平时的Form,而是菜单"
新控件的Owner肯定是TForm或DataModule,不然肯定不会产生在Form的pas文件中,只有为Tform所拥有的才能在设计时有效,运行时自动载入,TMenuItem的GetParent函数返回的才是上级TMenuItem或TMenu,Owner肯定为Form;
procedure TobContainerEditor.ExcuteVerb(Index: Integer);
begin
case Index of
0: Designer.SelectComponent(TobItem.Create(Component.Owner));
end;
end;
 
呵呵,是Parent,控件出来了,但Item和Container处在同一层次,怎么才能让Item成为
Container的子控件呢?TTable里的Fields是怎么出来的呢?请指教
 
具体的我也没做过,应该从重载GetParent入手,可以参考TMenu与TMenuitem或TAction与TActionList的关系处理,其他的我也不知道了。
 
动态创建的控件用Application创建就可以了,你可以保存你写的控件创建时的AOwner,用他创建新的控件。
 
非常感谢zjjzl
控件现在已经能建了,但Menu里的菜单项可以用鼠标拖来拖去,点中一项
Object TreeView会出现上下箭头来移动菜单项,这是怎么做的?我看了TMenu,
TMenuItem的原码,好像没有这方面的东东,难道在菜单编辑器里?
 
procedure TobContainerEditor.ExcuteVerb(Index: Integer);
begin
case Index of
0: Designer.SelectComponent(TobItem.Create(TobContainer(Component)));
end;
end;
点Default,DBDEMOS,Fields时Object Inspector中显示的是nothing selected,
就是说那只是维持树状结构用的空架子,而Constraints,FieldDefs,IndexDefs是
TTable的属性,竟出现在Object Inspector中,最可怕的是DataSource1是放在Form里的
组件,竟跑到Table1里面去了,看了TTable和TDataSource的原码,也没找到操作IDE的代码
到底是怎么回事呢?
 
把我的话又复制了一遍,寒~
 
后退
顶部