关于动态加载Frame的问题,期待高手解答!

显刚 2004-01-02 01:07:42
我希望实现这样一个需求;
在一个应用程序中建立一个Form;
在Form中加载若干个Frame,而这些Frame是定义在DLL中的.
实验过程碰到了问题
DLL接口中new出来的Frame没有显示出来.
而且对象的Parent属性无法付值.
期待高手解答,解决给分!
...全文
193 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
显刚 2004-01-06
  • 打赏
  • 举报
回复
问题已经解决了,在此谢谢大家的帮助!
结帖了!
quady 2004-01-06
  • 打赏
  • 举报
回复
没有试过Frame,不过在DLL中做过Form,并设置其父为调用Dll的主窗体。

HWND gParent; // The handle of the form that will be attached to.
TMainWin *gMainWin = NULL;

//调用此方法创建一个新的窗体,并设置其父窗体句柄为hwnd
bool __stdcall StartAttach(HWND hwnd)
{
gParent = hwnd; // Save the handle of parent window.
if(gParent)
{
gMainWin = new TMainWin( gParent );
gMainWin->Width = 400;
gMainWin->Height = 300;
gMainWin->Top = 0;
gMainWin->Left = 0;
gMainWin->Show();
return true;
}
return false;
}

下面是Form的构造函数,把owner改为ParentWindow,具体看帮助。

__fastcall TMainWin::TMainWin(HWND ParentWindow)
: TForm(ParentWindow)
显刚 2004-01-06
  • 打赏
  • 举报
回复
因为显示Frame时用的是API函数
::ShowWindow(frame->Handle,SW_SHOW)
看看还有什么其他方法让它显示出来
大家踊跃讨论,解决另外开贴给分决不食言!
显刚 2004-01-06
  • 打赏
  • 举报
回复
到刚才为止,报错的问题已经解决了
Frame本身也能正常显示了
但是Frame中的控件,除了Label以外其他的都不显示
可能jishiping(JSP 季世平)说的原因是有影响
显刚 2004-01-05
  • 打赏
  • 举报
回复
非常感谢 ljlln(阿明) 的指导.
只是我还想听听其他人的意见
这个问题这样结帖有些草率了.
等到这个周末吧!
ljlln 2004-01-05
  • 打赏
  • 举报
回复
BCB5我没有试过/我建议你使用6!好多功能BCB5都没有!
如:向dll中传递打开的数据库的指针!
jishiping 2004-01-05
  • 打赏
  • 举报
回复
我从没有在程序里用过Frame。刚才测试了一下,发现在DLL中使用TFrame的话会有很多问题。如果在DLL的Project里建一个Frame,保存。在EXE的Project中添加这个Frame的话,就会出现错误提示。我对比了一下,在DLL的Project中创建的Frame,和EXE的Project中创建的Frame,然后比较2个*.dfm文件,竟然发现他们不同。在DLL中创建的Frame多了一些属性,比如PixelsPerInch、OldCreateOrder之类的。反正我现在认为,BCB5在对Frame的处理中,有一些BUG。如果只是在EXE的POroject创建Frame,并且在EXE中使用Frame,那么好像还没有什么问题。但是一旦在DLL中使用Frame,那么就会有很多问题。就好像MDIChild类型的Form一样,如果在EXE中使用没有问题,但是一旦将MDIChild放在DLL中使用,那么就会出现很多问题。我的结论(针对BCB5),不要将Frame、MDIChild放在DLL中,否则有很多BUG。
显刚 2004-01-05
  • 打赏
  • 举报
回复
QQ 228805300
lazygod 2004-01-05
  • 打赏
  • 举报
回复
我程序顺利通过……但是代码不在手旁。你有qq没?108931931.这里好慢


显刚 2004-01-05
  • 打赏
  • 举报
回复
还是有问题呀,lazygod(Use any item) 你自己试过了吗?
要不,麻烦你把代码贴上来.
这个问题很典型哦.
显刚 2004-01-05
  • 打赏
  • 举报
回复
好,我现在就试试看
lazygod 2004-01-05
  • 打赏
  • 举报
回复
晕死了
MyFrame->Parent = NULL;
DestroyFrame(MyFrame);
犯一堆低级错误
lazygod 2004-01-05
  • 打赏
  • 举报
回复
MyFrame->Parent = NULL;
DestroyFrame(frmMain->MyFrame);
//次序倒了
lazygod 2004-01-05
  • 打赏
  • 举报
回复
没仔细看,和ljlln(阿明)的原理一样。不过我用的倒是BCB5.
你需要在OnClose先释放Frame
DestroyFrame(frmMain->MyFrame);
MyFrame->Parent = NULL;
否则关闭时frmMain自做主张去释放MyFrame。

Can't assign a TFont to a TFont
大概这个问题出现在MyFrame->Parent = Parent上。
TFrame3 * pNewFrame =new TFrame3(pParent)里构造函数TFrame3(pParent)中的pParent可以用其他TComponent代替,我是用TPanel.你试一下用TApplication这么写:
BOOL SetParent(TApplication* App, TForm* Parent)
{
TFrame3 * pNewFrame =new TFrame3(App) ;
pNewFrame->Parent= Parent;
}
这样还不行,我也不知该如何是好了:)
显刚 2004-01-05
  • 打赏
  • 举报
回复
lazygod(Use any item)
也是用的BCB6吧
我的工具必须用正版,买了BCB5只能用它
没办法
就没有别的方法可以实现了吗???
lazygod 2004-01-05
  • 打赏
  • 举报
回复
我是把Form的指针传入
写一个函数输出
BOOL SetParent(TForm* Parent)
在里面new, SetParent
在Dll里再写一个释放函数
DestroyFrame()
释放时调用
ljlln 2004-01-05
  • 打赏
  • 举报
回复
你还可以使用导出类的方式调用!
在dll声明导出的TFrame类,然后再你需要的地方new一个Frame就行了!

定义Frame
class __declspec(dllexport) __stdcall TFrame3 : public TFrame
{
__published: // IDE-managed Components
TMemo *Memo1;
private: // User declarations
public: // User declarations
__fastcall TFrame3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFrame3 *Frame3;

定义dll的接口函数
class __declspec(dllexport) __stdcall TFrame3 ;

调用:
TFrame3 * pNewFrame =new TFrame3(this) ; //new的时候访问地址错误????
有点问题!
望各位大虾帮忙解答!谢谢
显刚 2004-01-05
  • 打赏
  • 举报
回复
再顶一下!!!
almser 2004-01-05
  • 打赏
  • 举报
回复
顶!
显刚 2004-01-03
  • 打赏
  • 举报
回复
是否要考虑打补丁才行啊?
BoweirrKing(忽然变傻) :
关闭时出现致命错误是因为在堆上new的对象没有删除掉,这只是个例子,细节还有很多内容呢。不过这个功能显然在BCB5中存在障碍。很伤心。。。。。
加载更多回复(11)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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