窗体继承问题。200分至多只给一人。

kuki84 2006-06-12 01:47:49
求以下模型的解决方式:

TBaseTestForm的定义代码在a.dll中,
在exe中,TTestForm 继承a.dll中的tbasetestform。

其实就是对窗体类定义的公用。
200分只给趋于解决方案的一人或两人。

谢谢
...全文
1058 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuki84 2006-07-04
  • 打赏
  • 举报
回复
没有结果,分还是平均散了吧。。。
  • 打赏
  • 举报
回复
对。
被继承的只能是类型,而不是实例。
如果连父类定义都不知道,怎么继承呢?
所以楼主的要求是空中楼阁,只有解释型语言才有可能实现。
minjunw 2006-06-15
  • 打赏
  • 举报
回复
这么多年以来,我也在试图找到一种方法来解决这个问题,可是。。。

呵呵,好象真的没办法
深宇 2006-06-15
  • 打赏
  • 举报
回复
to DelphiGuy()
虽然可以得到DLL里的实例指针,但是楼主要可以继承,你那个方法是不可行的。

我还是那句话,此路不通!
JasonHeung 2006-06-15
  • 打赏
  • 举报
回复
C#支持运行时编译,如果你的Delphi也支持,这就不成为问题了!
cjianwen 2006-06-14
  • 打赏
  • 举报
回复
倒 ̄ ̄ ̄ ̄怎么没见Delphi把 TObject 封装到 Dll 中呢!!!

如果按楼主的想法,这些东西不是做成DLL不是更快吗?!!!

还是做成单元吧!!!不要浪费时间了!反正也只有Delphi能用,干嘛搞得那么麻烦呢!
kuki84 2006-06-14
  • 打赏
  • 举报
回复
你是怎么样cast,
我的强制转换是失败的。
  • 打赏
  • 举报
回复
不uses的话,只能从DLL中引出一个实例指针,在exe中把这个指针cast为某种类,比如TWinControl,然后就可以使用MethodAddress取得方法地址,就可以使用了。
但是我认为这样做没有多少价值。
kuki84 2006-06-14
  • 打赏
  • 举报
回复
比较同意fengfeiwuwq(寒烟翠)的看法。
其实一楼和其他朋友所提的建议,即通过纯虚类或接口的方式实现,是可以达到的,但是我希望实现对窗口类的继承,也就是说,它无法实现创建时(create)和设计时的一致,采用这种发方法,将不得不用纯代码来实现界面,这在开发中是不现实的。
其他的朋友提的另外一些建议,还是希望不要只停留在想想而已的角度,我在没做到最后一步实验时,也一直以为问题很简单,到了最后才发现应该会非常麻烦。
依旧建议use进来的就不必了,问题本身就提出的是如果不“use”。
有兴趣的话,希望付诸于代码,似乎可以能更好的理解我在问什么。这个问题用帖子来表达实在困难。
其实,这两天的研究,我已经放弃用这种相对较直接的方法实现这个目的了。大家也可以考虑有什么其他曲线的方法。
依旧没有找到适合揭贴的答案,谢谢大家参与,依旧等着楼下有好送分的帖子。
micrexp 2006-06-14
  • 打赏
  • 举报
回复
本人所在的项目 就是以这种模式开发的,使用DELPHI自带的BPL格式开发,不用引用单元文件,只需要在引用BPL就行了,但是项目的开发模试也必须使用BPL方式开发,如果仍按照DLL或者EXE方式开法,那就跟引用单元文件没有什么两样了
micrexp 2006-06-14
  • 打赏
  • 举报
回复
继承是可以实现的,不过那只是表面现像

由于DLL和EXE两者在不同的内存区域,所以编译器在编译的时候会在DLL中编译一份,在EXE中编译一份。这样就得不到你想要的效果,如果楼主一定要这样实现可以用BPL包的方式来开发,BPL包和EXE应用程序在同一个内存区域中,可实现在程序运行时更改TBASEFORM的属性来更改所有继承了TBASEFORM的属性,比如样式。不过BPL包开发会有很多问题
netcha 2006-06-13
  • 打赏
  • 举报
回复
干嘛非得写进DLL里呢。即然是你写的。


先将DLL内的代码封装成一个类。


同意以下的回答。另外,一类基类上面个派生类,不合理。

--------------------------------------------------------------
回复人:zzlingaaa(小舟) ( 一星(中级)) 信誉:100 2006-6-12 20:08:41 得分:0
?

在自己的Delphi程序中调用自己用Delphi写的Dll,没有太大的必要吧...
CACACACACA 2006-06-13
  • 打赏
  • 举报
回复
考虑一下类引用.
假设在一个包中,可以通过FindClass得到一个类引用.
这样一来,即使包中定义的类改变了.但类名不会改变.
而函数function FindClass(const ClassName: string): TPersistentClass;
的参数只是一个字符串.
这样一来,在EXE文件中.可以直接在创建DLL中的类实例了.最终效果感觉是满足楼主的要求了.
仅供楼主参考.
  • 打赏
  • 举报
回复
1. 引用unit不会浪费空间,unit中的变量、类实例不会被复制。uses xxx只是让你可以使用xxx(准确地讲是xxx interface部分中引出的)中定义的常量、变量、函数等。
2. 就是有数百单元,Delphi编译的速度也足够快了,能超过1分钟吗?
3. 不管是源码复用还是二进制复用,连复用的对象类型定义都不知道的情况下,怎么可能做到?没有任何语言可以实现这种“功能”。
wizardqi 2006-06-13
  • 打赏
  • 举报
回复
呵呵,楼主所说的“当这个窗体基类被上百个窗体继承时,静态的use,会浪费过多的空间,”
我不这样认为,USE怎么会浪费空间呢??
不过楼主所说的"且修改基类会导致上百个重新编译。这是我试图找到解决方案的原因"
我还是可以接受的.我想楼主的意思是将来在将来升级或调试过程中只需修改基类并编译出动态连接库发布即可是吧.要做到这种二进制级的继承并且实现你的功能要求这好像是COM应用的一部分.
然而楼主偏偏继承的是可视化组件TForm,这点就有些麻烦了.
wls12342004 2006-06-13
  • 打赏
  • 举报
回复
设计好类,做成程序集,再在别的应用程序中引用就可以了呀!
fengfeiwuwq 2006-06-13
  • 打赏
  • 举报
回复
我认为wizardqi(男巫)的分析是正确的。
其实楼主这样做的最主要目的就是减少预编译的时间,而希望主应用程序中的窗体应该从DLL封装的基类窗口继承而来。我曾经也试图通过楼主希望的方式来解决一些高度模块化的项目问题上,但是如果没有事先的代码声明单元,这种试图通过二进制的继承方式来解决问题的方法Delphi是无能为力的,包括在BCB中也一样。我认为这是Borland编译器无法做到的(我从未使用过.NET框架,不知道在这种环境下面能否实现楼主所说的设计),事实上我也认为编译器不需要做到这一点,因为DLL本身就是为了兼容Windows平台下各种不同语言的功能模块之间的能够互相调用才出现的,同时也要实现具体代码的隐藏,换句话说,其实DLL本身就是一个EXE,它有自己独立的内存和进程资源,所以要从一个隐藏了代码的二进制文件中继承代码是不可能的,不然为什么第三方的VCL控件包都带了源代码呢?
楼主可以再多花点时间去研究一下编译原理,或许可以找到问题原因。
至于问题的实现方法,1楼swayi21(微斯人)同志的方法是最常用的,把所有EXE和DLL代码通过BPG项目包文件来管理。
飞天揽月 2006-06-13
  • 打赏
  • 举报
回复
kk who get
wudi_1982 2006-06-13
  • 打赏
  • 举报
回复
我来看看谁拿走200分。
pcfans007 2006-06-13
  • 打赏
  • 举报
回复
楼猪晕鼻
加载更多回复(26)

5,388

社区成员

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

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