屬性的繼承,可否這樣實現(高手請進,解決問題100分 講原理100分) (100分)

  • 主题发起人 主题发起人 rogue_xu
  • 开始时间 开始时间
R

rogue_xu

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道,我們建立一個form,其實都是先從tform繼承了一個類如tform1,TForm1繼承了所有父類的屬性.如left,現在我想在TForm1中,重新繼承這個屬性,增加其功能,如在left改變時,當前值寫入ini文件中,讓下次調用時,從ini文件中調出;
下面是我的代碼:
代码:
    property Left read GetLeft write SetLeft;

function TFormShow.GetLeft: Integer;
begin
  inherited Left := Confile.ReadInteger(SettingSec, 'FormLeft', Screen.Width - Self.Width - 20);
  result := inherited left;
end;

procedure TFormShow.SetLeft(Value: Integer);
begin
  Confile.WriteInteger(SettingSec, 'FormLeft', Value);
  inherited left := value;
end;

==========
剛剛忘了說出我的問題
這樣的代碼編譯都是沒有問題的,但是如果你移動form的位置,按道理說form是會讀寫left的,
但是我的代碼根本就沒有被執行,而且好象還是沒有被編譯成代碼,因為編譯后,編輯器里沒有
小綠點,也不能被設置成斷點!

我用相同的方法做了hight和width兩個屬性的繼承,但是發現它們的讀的事件可以被執行,寫
的事件就是沒有被譯成代碼,除非有在程序中有明確的代碼 width:=xx;,寫的代碼才會被編
譯!肯請高人指點啊!

順便指出以前一位大俠所說的一個錯誤,他說你要你有用到類,那麼類中的所有東西都會被編
譯包含進可執行文件中,從這里看是錯誤的,如果真得沒有用到,delphi還是不會包含進去的.


 
SetLeft不是动态或虚拟,应该不可重写或覆盖
 
是啊,属性应该是不能重载的。
如果想实现自动保存和设置位置 可以在消息中处理
procedure WMMove(var Message: TWMMove); message WM_MOVE;
 
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function GetMyWidth: Integer;
procedure SetMyWidth(const Value: Integer);
{ Private declarations }
public
{ Public declarations }
published
property Width: Integer read GetMyWidth write SetMyWidth;
end;

function TForm1.GetMyWidth: Integer;
begin
Result:=inherited Width;
Label1.Caption:='读 '+InttoStr(inherited Width);
end;

procedure TForm1.SetMyWidth(const Value: Integer);
begin
inherited Width:=Value;
Label2.Caption:='写 '+InttoStr(inherited Width);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Width:=Width+1;
Height:=Height+1;
end;

为什么我们在用鼠标拉动时不会触发,很简单,处理这个消息的是其父类的父类。。。(向上找其父类直到找到处理事件为止),是它设置Width:=。。。设置了大小,这个时候不会触发子类的方法的。
解决这个问题就是自己处理消息(如WM_SIZE),显示设置Width:=。。。
 
有道理,但是顯示設置的代碼如何寫?能不能給個提示:
與其自已這樣處理,還不始,別個加一個屬性
formWidth
然后用它做保存還好些
 
JobsLee 的办法是正解:
procedure WMMove(var Msg: TWMMove); message WM_MOVE;

......
procedure TForm1.WMMove(var Msg: TWMMove);
begin
caption:=inttostr(msg.xpos);
end;
 
来晚了,pihome讲的不错,属性是不能继承的,要解决此问题唯一的方法就是编程响应wm_size消息,或者把其父类的setleft函数的访问权限降至protected,并声名成动态或虚函数,然后在子类中覆盖。
 
多人接受答案了。
 
后退
顶部