DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: eyang11
今日帖子: 1
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/7 15:16:52
标题:
动态创建出的TFrame的问题 浏览:1724
加入我的收藏
楼主: 我在一个程序里面在设计期加入了一个TFrame,上面有一个TMemo充满这个TFrame,但是没有让他自动创建,在主窗口TForm1里面有一个按钮,一个OpenDialog,一个Panel想让程序在按按钮后打开OpenDialog,调入文本在TFrame的TMemo里面:
if OpenDialog2.Execute then
           begin
             if (Form1.Frame <> nil) then
               Form1.Frame.Free;
             Form1.Frame := TFrame1.Create(Form1.Panel);
             Form1.Frame.Align := alClient;
             Form1.Frame.Parent := Form1.Panel;
             Form1.Frame.Memo1.Lines.LoadFromFile(OpenDialog2.FileName);
           end;
并且已经在uses相互引用了,为什莫编译器说Frame.Memo1是无定义的变量?难道不自动创建TFrame,就不能引用使用上面的控件???  
忘了说了:if (Form1.Frame <> nil) then
               Form1.Frame.Free;
是在TForm1里面的一个公有域:Frame: TFrame,用来监测是否有其他相同实例存在,有的话先Free,再创建。
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/7 15:34:29
1楼: Frame: TFrame1;就可以了
或者用的时候强制转换一下
TFrame1(Frame).Memo1.Lines.LoadFromFile...

因为你声明的Frame是TFrame类,虽然实例是TFrame1类
但是Memo1只是TFrame1的成员,并非是TFrame的

----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/7 15:45:47
2楼: 本来是想在主窗口的Panel里面根据不同的按钮产生不同Frame充满到Panel里面,并在充满前先Free掉已存在的实例,您的意思是说强制转换,还有其他办法吗?
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/7 16:07:01
3楼: 只有上面的2个办法
1.显式声明
2.使用时强制转换
用哪个当然由你自己来决定 :)
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/7 16:13:55
4楼: 能再问一两个问题吗,谢谢:
Form1.Frame := TFrame1.Create(Form1.Panel);
TFrame1(Frame).Memo1.Lines.LoadFromFile...

在vc里面,派生类可以比较自由的转换成基类,但是基类转换成派生类是要非常小心的,因为派生类可能有不是基类的成员存在;(1)那末像我上面的第一句,将TFrame的声明名称Frame去实例化一个派生类TFrame1不会有问题吗?(2)上面您给我的第2句,应该是将Frame转换成派生类TFrame,也不会有问题吗??
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/7 16:23:14
5楼: Form1.Frame := TFrame1.Create(Form1.Panel);
TFram1本来就是继承自TFrame,因此这句当然不会有问题

TFrame1(Frame).Memo1.Lines.LoadFromFile...
将Frame强制转换成TFrame1类当然是要小心的
我这里的代码没有考虑那么多
如果你的Frame可能是其他的派生类,应该先判断一下

if Frame is TFrame1 then TFrame1(Frame).Memo1.Lines.LoadFromFile...

----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/7 16:38:44
6楼: 如果说Frame直接继承TFrame,而TFrame1是TFrame的派生类的派生类的话,还能不能TFrame1(Frame)呢?
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/7 16:56:32
7楼: 这么说吧,强制转换不是一定成功的

TFrame1(Frame)
如果实例Frame是TFrame1或者TFrame1的子类,则转换成功
否则结果将返回nil
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/7 17:13:42
8楼: 我有些糊涂了。。。。。。。。。
Form1.Frame := TFrame1.Create(Form1.Panel);以后,Frame已经算是TFrame1的实例了?
是不是说基类要强制转换成派生类的话,只要这个派生类是继承于这个基类的(可能这个派生类是一个派生类的派生类)就能转换成功?
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/7 17:48:09
9楼: Form1.Frame := TFrame1.Create(Form1.Panel);以后,Frame已经算是TFrame1的实例了?
是的

其实你自己想复杂了
和VC等其他语言一样的
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 snakewu (ss) ★☆☆☆☆ -
普通会员
2004/5/9 0:33:38
10楼: 谢谢拉。按此在新窗口浏览图片
----------------------------------------------
ignore,Ctrl+Alt+Del,then begin;is die,but just not die。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.35938毫秒 RSS