做Delphi我现在很少遇到问题,今天的这个问题实在是没有办法了,谁能帮我,我把所有的分赠送

aristn 2008-07-23 04:57:07
问题关键字 动态编译;静态编译

问题时这样产生的:
主程序调用了一个动态库,在动态库中创建了一些控件(一个TPanel,一个TSplitter),控件的Parent被指向了主程序的MainForm,当主程序和动态库都是动态编译的时候一切都很正常Splitter可以正常拖动,一切都很好; 然而,主程序和动态库都静态编译的时候,问题出现了,Splitter的拖动图标可以显示,但是拖动的时候出现“Control '' has no parent window ”(说Splitter没有ParentWindow)而弹出Bug,郁闷好久了,谁能解释这是什么原因?
...全文
204 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lake_cx 2008-07-30
  • 打赏
  • 举报
回复
那是因为你在模块之间传递了对象,而在设置Parent属性后显示窗体时,会有is的类型检测,而该窗体对象是另外一个模块传递过来的(地址),is类型检测自然无法通过,所以报异常了。
yong8717464 2008-07-30
  • 打赏
  • 举报
回复
更改:
var
frm :TPanel;
frm1 : TSplitter;
yong8717464 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aristn 的回复:]
Dll中

Procedure PrjMng(const AppMain : TApplication); stdcall;
Begin
With TPanel.Create(AppMain.MainForm) do
Begin
parentFont := False;
Parent := Application.MainForm;
Width := 300;
Align := alLeft;
End;
With TSplitter.Create(AppMain.MainForm) Do
Begin
Parent := AppMain.MainForm;
Align := alLeft;
Left := 300;
End;
End;
[/Quote]
Procedure PrjMng(const AppMain : TApplication); stdcall;
var
frm,frm1 : TForm;
Begin
frm := TPanel.Create(AppMain.MainForm);
frm.parentFont := False;
frm.Parent := Application.MainForm;
frm.Width := 300;
frm.Align := alLeft;

frm1 := TSplitter.Create(AppMain.MainForm);

frm1.Parent := AppMain.MainForm;
frm1.Align := alLeft;
frm1.Left := 300;

End;
试试
aristn 2008-07-25
  • 打赏
  • 举报
回复
谢谢你的关注,问题是 Build with runtime packages 时程序运行正常,而不是这种编译方式的时候程序就出错了。
wjbwjb 2008-07-25
  • 打赏
  • 举报
回复
构造函数中
Width = 200;
Height = 225;
ParentColor = false;
等属性的设置都会引起控件的重绘,在构造的时候,其Parent是不存在的,或者说是这种窗体包含关系还没有形成的,尽管你给Parent赋值了。
wjbwjb 2008-07-25
  • 打赏
  • 举报
回复
不能调用指定以外的bpl包
Build with runtime packages 可以自主搜索所需的bpl包
lance 2008-07-25
  • 打赏
  • 举报
回复

Parent为空也就说明 执行Parent := Application.MainForm; 时,MainForm还没有创建
aristn 2008-07-25
  • 打赏
  • 举报
回复
没有,不是这段代码的问题,当主程序和Dll都是 [Build with runtime packages] 时程序运行非常好
coffeemay 2008-07-25
  • 打赏
  • 举报
回复
Procedure PrjMng(const AppMain : TApplication); stdcall;
Begin
With TPanel.Create(AppMain.MainForm) do
Begin
parentFont := False;
Parent := Application.MainForm;
Width := 300;
Align := alLeft;
End;
With TSplitter.Create(AppMain.MainForm) Do
Begin
Parent := AppMain.MainForm;
Align := alLeft;
Left := 300;
End;
End;

Name都等于空 没有报错?Control '' already exists
aristn 2008-07-25
  • 打赏
  • 举报
回复
期待专家出现
aristn 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wmm1977 的回复:]
不知道啥叫动态编译,静态编译,没听说过,只听说过动态调用,静态调用,exe和dll是2个独立的编译程序,他们的froms单元的Application是不同的,一般来说,为了保证窗体控件的正常使用,在进入dll之后,会替换dll的Application.handle,在dll卸载时,回恢复原Application的handle,不然的话,会存在一些使用上的错误和异常,你目前这种使用方法就是解决了当前的问题,也有可能会有关闭程序时出现地址错误的,一个简单的办法,使用…
[/Quote]

Application.Handle 我在 进入Dll之后(DLL_PROCESS_ATTACH)已经作了设置,退出的时候(DLL_PROCESS_DETACH)复原,另外你所说的windows.SetParent(h
WndChild, hWndNewParent)在这里是不能使用的,因为此时的hWndChild没法得到
aristn 2008-07-25
  • 打赏
  • 举报
回复
我所说的动态编译是指在 Options...->Packages->Runtime packages 的 Build with runtime packages 打勾,表示运行时动态的加载那些bpl
wmm1977 2008-07-25
  • 打赏
  • 举报
回复
不知道啥叫动态编译,静态编译,没听说过,只听说过动态调用,静态调用,exe和dll是2个独立的编译程序,他们的froms单元的Application是不同的,一般来说,为了保证窗体控件的正常使用,在进入dll之后,会替换dll的Application.handle,在dll卸载时,回恢复原Application的handle,不然的话,会存在一些使用上的错误和异常,你目前这种使用方法就是解决了当前的问题,也有可能会有关闭程序时出现地址错误的,一个简单的办法,使用windwos.setParent ,这样就不会出现你现在的错误了
aristn 2008-07-25
  • 打赏
  • 举报
回复
很想向专家提问,可惜我的积分不够,真希望专家可以看到这个帖子
aristn 2008-07-23
  • 打赏
  • 举报
回复
Dll中

Procedure PrjMng(const AppMain : TApplication); stdcall;
Begin
With TPanel.Create(AppMain.MainForm) do
Begin
parentFont := False;
Parent := Application.MainForm;
Width := 300;
Align := alLeft;
End;
With TSplitter.Create(AppMain.MainForm) Do
Begin
Parent := AppMain.MainForm;
Align := alLeft;
Left := 300;
End;
End;
阿三 2008-07-23
  • 打赏
  • 举报
回复
把代码贴出来看一下
五哥 2008-07-23
  • 打赏
  • 举报
回复
动态创建一定要把他的Parent属性给它赋值的,要不然它放在那个地方,系统不知道啊
aristn 2008-07-23
  • 打赏
  • 举报
回复
问题不在于这里,在于静态编译的时候程序就出问题了,你可能还没有看明白问题
wjbwjb 2008-07-23
  • 打赏
  • 举报
回复
x.Parent:=Self;
自己创建的对象都必须加这句。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧