一个折腾了一天的问题:Delphi的继承。(100分)

  • 主题发起人 主题发起人 xiaoer
  • 开始时间 开始时间
X

xiaoer

Unregistered / Unconfirmed
GUEST, unregistred user!
建一个空的Form,里面有一GroupBox,作为父类,在菜单新建中选择此
Form作为父类继承。
在父Form中建一方法SetReadOnly(bReadOnly:Boolean),想实现对于所
有的子类,调用SetReadOnly(True)可使子类的GroupBox中所有的控件
设置为ReadOnly。
但在执行时,GroupBox的ComponentCount始终为0,而不是子类GroupBox
的控件数。
请问我想实现这个功能,应如何解决?
 
这样引用呢?
self.groupbox
 
你这个问题没有必要使用窗体继承吧? 一个小小的函数就能搞定了,我来贡献一个自己的函数
好了。

procedure ADEnableChildControls(AControl: TWinControl
AEnable: boolean);
var
I: integer;
begin
Assert(Assigned(AControl));
with AControl do
for I := 0 to ControlCount - 1 do
begin
Controls.Enabled := AEnable;
if Controls is TWinControl then
ADEnableChildControls(TWinControl(Controls), AEnable);
end;
end;

还有你这边有一个问题,应该使用ControlCount,而不是ComponentCount,TControl
才有Enable属性。
 
thinknet: 不行,我试过了.仍是0;
Adnil:非常感谢你的函数!不过我是想利用继承的好处.在这个SetReadONly方法中
还可以加入别的操作,比如将控件的Color设为clBtnFace.至于是不是ControlCount
的问题,我现在电脑上没有Delphi,明天试一下.TComponent没有ReadOnly属性,我是
自己继承了一个TCustomEdit,然后将其Protected中的ReadOnly提到Public中的.
 
不知道你是怎么调用的,在我这里一点问题都没有
在祖先Form中有一个Public方法:
procedure TForm2.GetControlList;
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
ListBox1.Items.Add(Controls.ClassName);
end;
然后在后代调用:
procedure TForm3.Button3Click(Sender: TObject);
begin
GetControlList;
end;
得到的结果是Form3上的Control的类列表
 
如果你的GroupBox里的控件没有ReadOnly属性,岂不是会出错
 
procedure TForm1.GetControlList;
var
i:integer;
begin
for i := 0 to GroupBox1.ControlCount - 1 do
begin
tedit(GroupBox1.Controls).ReadOnly := True;
end;
end;


procedure TForm2.Button2Click(Sender: TObject);
begin
self.GetControlList
end;
没问题
 
多谢大家关心,问题已解决。
以前我用Components集合,它总为空。在大家提醒下改用Controls,达到要求。
至于ReadOnly属性的问题,我是先判断控件是否为我已定义的类型,比如
[TEdit, TComboBox],然后新建一TMyCustomEdit类,如下:
//继承编辑控件
TMyCustomEdit = class(TCustomEdit)
public
property Color;
property ReadOnly;
end;
 
后退
顶部