关于元件方法的可视性(100分)

  • 主题发起人 主题发起人 Tigerchamp
  • 开始时间 开始时间
T

Tigerchamp

Unregistered / Unconfirmed
GUEST, unregistred user!
对元件之间方法和过程的继承关系很疑惑,具体问题提出如下:动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却不可识别.不知是怎么回事.请问哪位大侠能详细告知祖先和子孙之间的继承关系.(protected的作用范围究竟是什么)?
 
建议你找本DELPHI的书看看!肯定比我们说好!
我有一本冲网上下载的DELPHI2的书,很不错!
你要的话通知我<A HREF="MAITTO:XFTANG@SHTDU.EDU.CN">xftang@shtdu.edu.cn</A>
 
动态和静态生成的控件应该是一样的,不知
你说的不能执行有无sample
proteted的函数和数据,只能由当前类和子类使用。
可以看《Delphi 2程序大全》或《Delphi 3从入门到精通》
<Delphi 2 Unleashed>和 <Mastering Delphi 3>
 
jiangtao 说的一点没错, 动态生成的控件能够调用的方法静态肯定也可以
protected 方法可以被一个类自身以及它的子孙们调用;
private 声明的方法变量
等只能在同一个 unit 中被其他类或者函数识别;
一个子类, 可以继承它的父类的
除了 private 以外全部的方法, 事件, 属性...
例如你自定义一个类, 如果在 create 的时候没有任何需要初始化的东西, 你就不
需要再次声明它的 create 方法;
如果在销毁该类是不需要释放任何东西, 你也同
样不需要声明它的 destroy 方法;
至于属性, 一定要放在 published 部才能静态地看到;
你的问题应该从程序中找原
 
书我都看过,但确实有如下问题,还希望大家继续帮忙。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids;
type
TMystring=class(Tstringgrid);
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
mystring:Tmystring;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Mystring:=Tmystring.create(self);
Mystring.parent:=self;
Mystring.HideEditor;
Stringgrid1.HideEditor;
/./Undeclared identifier
end;

end.

上面的这个例子,当编译时最后一行出错,请指教。
是不是stringgrid1是form1的成员,所以....?
 
哈哈!太神奇了,
Tigerchamp的这个问题使我得到了意想不到的"重大发现":
请将TMystring=class(Tstringgrid);这句话移动另一个
Unit中(如:Unit2),然后在本模块中use Unit2,
你将发现 Mystring.HideEditor;这句话也通不过编译了,
也是Undeclared identifier。
这说明Delphi通过在一个Unit中定义类的方法实现了C++中的friend语义,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
即:友类,从而可以访问protect属性/方法!这我怎么从没听说过呢?
我建议给Tigerchamp老兄一定的奖励,
(我记得有人提出过给提高水平问题的人奖励的说法)
另外那位大虾早就知道这个问题,也请通报一声,免得
我坐井观天,自己以为发现什么新大陆了呢! ^_^
 
hehe,同一个Unit内,连另一个class的私有成员都可以访问呢,更别说protect
属性了。VCL库的源代码中就有这种取巧的例子。
 
如果大家经常看delphi Bugs Lists的话就会发现从1.0开始就这样了.
可能是为了自己写的方便. vcl理的确有很多这样的例子.
 
既然如此,看来是我孤陋寡闻了 :(((
不过总算运气好,又抢了个先 :)))
其实,想来这样做也是很人性化的,"符合"OO的原理--
既然编程人员"看得见",干吗让被编的类"看不见"呢?^_^
 
看了 Tigercham 的例子才知道它的问题是怎么回事, 问题是:
>动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却
>不可识别.
而它的例子与问题不是一回事, 例子中是: 继承的时候能够调用的方法与动或静态生
成的控件所能调用的方法不是一回事.
这一点也不奇怪, 设置 protected 段的宗旨就是要解决控件使用时不可见而继承中
可见的问题. 实质上 protected 如同 private 只是它的范围比较宽, 能够让它的
子孙见到, 而其他 object 不可见. 用 dwwang 的话来说确实 "神奇".
 
procedure TForm1.FormCreate(Sender: TObject);
var MyString: TCustomGrid;
begin
MyString:=TCustomGrid.create(self);
MyString.parent:=self;
MyString.HideEditor;
MyString.free;
end;

试试这一段程序, 会得出同样的结论 -- protected 如果不是继承时同 private
 
DELPHI的书邮过去了!
 
多谢大家的积极参与,可惜小弟的分不多,请包涵!
 
多谢大家的积极参与,可惜小弟的分不多,请包涵!
 
后退
顶部