(300分没人拿?)能否做到在TButton控件基础上增加新属性方法而不用新注册控件或动态创建?(比如在设计时摆放的是父类TButton控件,在运行时全部被子类

  • 主题发起人 主题发起人 guqs
  • 开始时间 开始时间
看看<设计模式>这本书,
机工出版社出版。
 
to VRGL:
我反复看了几遍这本书这几章,我能明白书上的意思,但我仍不知如何用Delphi实现上述
我的想法。
请教能否给个简单的例子(哪怕是伪代码),实现上述目的,请指点迷津。
 
我觉得zhukewen说的比较符合我的思路。就是自己从TButton继承一个Button控件,然后自己就可以根据需要来增加他的属性。
关于自己写一个控件么。我建议你去下面的那个地址看看,知道《delphi从入门到精通》这本书吗?
那么你一定也知道Marco Cantu了,一个非常好的站点。
http://www.marcocantu.com/funside/funside1p.htm
里面有很详细的说明和代码,不过要耐着性子看英文。
 
我也很想知道如何实现。
我想了一个歪招,不知好不好使,:)
写一个代码维护的程序,以TButton为例,此程序将TButton的设计时属性取出,例如大小、
位置、字体等等放到一个INI文件里,然后将.pas里的TButton对象删掉,再在CREATE事件里加入些代码

procedure TForm1.FormCreate(Sender: TObject);
begin
myButton := TMyButton.Create(self);
//myButton.Left := ini.left;
//mybutton.right := ini.right;
...
end;

如果有直接了当的办法实现就好了。
 
http://www.castle-cadenza.demon.co.uk/decorate.htm
 
用这种办法可行:
首先创建一个TMyBotton类;
然后再创建一个包;
用RegisterClass函数注册(注意不要用RegisterComponents)
然后安装这个组件。
再在你的工程窗体上放几个TBotton;
然后回到代码编辑器上把TBotton都改成TMyBotton;
然后回到窗体设计器上右击鼠标,在弹出的菜单上点击View as text;
把TBotton都改成TMyBotton。
右击鼠标,在弹出的菜单上点击View as form;
然后运行程序,OK.
 
to lvjjx:
请看清我的问题和真正的目的。
to VRGL:
好象不能实际解决我的问题。
to 鲁小班:
既然仍然要注册Tmybutton类并安装此组件,与直接注册Mybutton控件有何两样?何必要绕
这个弯子。
 
to guqs:
那我就没有办法了,
我说的方法只是控件
不用显示在面板上而已。
 
直接修改StdCtrls.pas文件的TBotton类,如何。
 
不清楚delphi行不行,非常关注
 
既然你不想重做一个组件,就不要用组件的方法来实现。自己在程序里写代码来实现你
需要的特殊效果。例如,你可以在FORM上画图来实现按钮的阴影效果。
 
我想使不是用Button作为占位符:
procedure TForm1.Create(Sender:TObject);
var
list:TObjectList;
i:integer;
oldbtn : TButton;
newbtn : TBitBtn;
begin
list := TObjectList.Create;
list.OwnsObject := False;
try
for i:=0 to ComponentCount-1 do
if Components is TButton then
list.Add(Components);

for i:=0 to list.Count-1 do begin
oldbtn := TButton(list);
newbtn := TBitBtn.Create(Self);
with newbtn do begin
Parent := oldbtn.Parent;
Caption := oldbtn.Caption;
BoundsRect := oldbtn.BoundsRect;
Visible := oldbtn.Visible;
Glygh.loadfromfile('1.bmp');
end;
oldbtn.Free;
end;
finally
list.free;
end;
end;
 
type TMyButton = class(TButton)
public
procedure dosomething;
published
property myproperty;
end;


....

tMyButton(button1).dosomething
 
我记得在java中,控件的控制很值得借鉴的。另外,可以学习VC啊,对于消息进行一些处
理,如果还有你不能解决的问题,那就是你的能力的问题,而不是自己的思索的方向的事情
的了。
 
对界面的美化,现在一般是使用皮肤化控件实现的,可以参考http://www.ksdev.com

如果一定要按照你的思路,那就只能这样,先将界面设计好,自己编写一个工具(在GExperts
中有)将相关类转换为pascal语言,其他一切就好办啦!

function FormClassConvert(aDFMFileName: string; aClasses: array of string; aReplacedClasses :array of string): string;
FormClassConvert('NewForum.dfm', [TButton, TLable], [TMyButton, TMyLable]);

返回结果:
Button := TMyButton.Create(Application)
.....
 
我发现我的问题似乎很难表述清楚,一些人明白了,但一些人还是不明白。
不如用程序来表示:
比如我在程序Form中多处用到Button,
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

此时我想为Button扩展为我特有的属性,于是改为
TMyButton=Class(TButton)
public
Newproperty:String;
end;

TForm1 = class(TForm)
Button1: TMyButton;
private
{ Private declarations }
public
{ Public declarations }
end;

Delphi会提示“Form1.button1 shoud be of type TButton but is decleared as
TMyButton .correct the declaration”

于是我继续改Form1.dfm,view as text,
改其中 object Button1: TButton 为 object Button1: TmyButton
但编译时提示 没有发现类。(Delphi为什么就不能看看我的程序中有没有这个类呢?:< )

我也知道用动态创建,但我有50个form,我总不能全用代码布局吧,头都大了。

于是为了加上这样一个小小的属性或小改变,我将不得不将TMyButton注册为新控件,
悲哀呀!难怪Delphi控件如此泛滥。
可在Java和VC中好象可以很容易做到。

谁有好的解决办法!




 
嘿嘿,不是告诉你,可以自己写个工具,让程序帮你转换啥!

不过,你的方法似乎不是的很好的解决方法!你可以看看interface类的用法!不过,仍然需要
你用代码布局!建议你最好使用皮肤化的控件方式。
 
同意guqs的观点!
本人实在没招,用这种笨方法:
procedure CreateURLSpeedButton(aAsbtnRefer: array of TSpeedButton);
var
i: Integer;
begin
for i := Low(aAsbtnRefer) to High(aAsbtnRefer) do
begin
with TURLSpeedButton.Create(Self) do
begin
EnterFontColor := clWhite;
Parent := aAsbtnRefer.Parent;
SetBounds(aAsbtnRefer.Left, aAsbtnRefer.Top, aAsbtnRefer.Width, aAsbtnRefer.Height);
Tag := aAsbtnRefer.Tag;
Font.Color := aAsbtnRefer.Font.Color;
Font.Size := aAsbtnRefer.Font.Size;
Caption := aAsbtnRefer.Caption;
Cursor := aAsbtnRefer.Cursor;
Flat := aAsbtnRefer.Flat;
Layout := aAsbtnRefer.Layout;
Glyph := aAsbtnRefer.Glyph;
GroupIndex := aAsbtnRefer.GroupIndex;
Down := aAsbtnRefer.Down;
OnClick := aAsbtnRefer.OnClick;
end;
aAsbtnRefer.Visible := False;
end;
end;
.....................
CreateURLSpeedButton([sbkInfoCommit, sbkInfoDisconnect, sbtnNetUsers])
 
设计界面时使用标准控件,在窗口的Create事件中调用一次CreateURLSpeedButton函数,
把标准控件"替换"掉。:)
 
guqs:
  同样为你的问题困扰过,我知道你有更深一层的意思,但delphi没有提供这种机制,
我自己在使用中一般是这样的:把所有的button尽量放在一个groupbox中然后用一个循
环把所有的TButton全free掉,但保留它们的left,top,width,height,再替换成TMyButton.
稍微有点麻烦,不过用惯了倒还顺利,不过事情摆明了是要用TMyButton替换TButton
似乎从字面上没用更好的办法。
 
后退
顶部