控件設計方面的兩個問題,請教高手


問題一:如果我在自定義控件上加入一個屬性FocusControl,類似於TLabel控件的那個屬性的,通過這個屬性可以關聯到另一個控件,現在我想做到當被關聯的控件的位置發生移動的時候,我自定義的控件的位置也跟着移動,只是不知道應該怎樣接收那個消息.
    另外,如果不只是位置的移動,廣義的說,只要是被關聯的控件的某個屬性發生了改變,要求我自定義的控件都能接收到這個消息,應該怎么做?

問題二:如果我寫一個Edit的子類MyEdit控件,那么它自動繼承了父類的MaxLength屬性(當然還有其他),現在我希望當MyEdit控件的MaxLength屬性發生改變時控件能夠執行一些自定義的操作(比如說彈出一個對話框等等)但因為MaxLength的Set和Get過程都是封裝在祖先中的,我無法在其中插入代碼,請教應該怎么做?
    這里只是舉MaxLength作為例子,如果任何一個這種繼承來的控件的屬性發生改變時,我應該怎么添加代碼?

以上兩個問題在我公司內部使用的專用控件中都得到了應用,但是不知道是如何實現的,為此想請教各位有控件開發經驗的高手,謝謝!

16 个解决方案

#1


我也不能確定,不過可以試試用reintroduce來重載SetMaxLength方法。不過要記得inherited

#2


設置一個外部的WndProc取代目標控件原來的。攔截WM_SIZE消息,做完你自己的操作后記得調用事先保存好的老的WndProc。

#3


重栽父類的方法

#4


study

#5


第一個問題不清楚
第二個問題,只要重載父類的方法即可

#6


好像不知道耶!

#7


以上各位的支持我表示感謝!
  但是對屬性的Set和Get過程都是放在祖先類的private當中,對子類是不可見的,如果我在子類中采用override方法進行重載則編譯器會告訴我不存在相應的祖先過程,(這是肯定的,因為對於子類來說,本來就應該不知道的),而如果不使用override,很顯然,我新加入的這個過程不會被調用,等於沒用.
  以上是我測試的結果,希望有興趣的高手們多多指教,或者提一些思路建議,再次表示感謝!

#8


對了,剛剛忘記了,那就是reintroduce不能起作用,我查閱了Delphi自帶幫助(選中reintroduce單擊F1),里面有一句明確的說明關於控件的Set和Get方法是不能使用reintroduce指示符的.諸位有興趣可以看一看.

#9


那就試試重載WndProc的方法。對於很多的屬性變化都會有CM_...或者WM_...消息的。
此外,截獲每一個控件的每一個屬性變化用一般的方法應該是不可能的(先假設你不打算掃描內存……就像愛護皮椅那樣:P)。如果只是像你說的那樣取得位置的變化則好辦得多,截獲WM_SIZE就可以了。

#10


用d6,有一構件把edit和label給綁在一起。

#11


1。是設計期的事情還是運行后才發生?如果是前者,算了,難搞,后者就很好搞定的了

2。最好不要直接繼承TEdit,而是繼承TCoustomEdit

#12


gz

#13


xue xi

#14


重新定義MaxLength

  TMyEdit = class(TEdit)
  private
    function GetMaxLength: integer;
    procedure SetMaxLength(const Value: integer);
  published
    property MaxLength:integer read GetMaxLength write SetMaxLength;
  end;


function TMyEdit.GetMaxLength: integer;
begin
  result:=inherited MaxLength;
end;

procedure TMyEdit.SetMaxLength(const Value: integer);
begin
  inherited MaxLength:=Value;
  showmessage('');
//你的代碼

end;



#15


第一個問題:
  例如 TCustomClass2 要隨TCustomClass1而動
那么在TCustomClass1中聲明一個公開變量 FOwner :TCustomClass2;
type
 TCustomClass2 =class;
 TCustomClass1 =class(TCustomParentClass1)
 public
   OwnerClass :TCustomClass2;
 ...
end;
 
TCustomClass2=class(TCustomParentClass2)
private
  CustomClass1 :TCustomClass1;
public
  constructor Create(AOwner:TComponnet);override;
  destructor  Destroy; override;
end;

constructor TCustomClass2.Create(AOwner:TComponnet);
begin
  Inherited Create(AOwner);
  CustomClass1 :=TCustomClass1.Create(Self);
  CustomClass1.OwnerClass :=Self;
  //OK,接下來就可以在CustomClass1中操作CustomClass2了,
end;
  
destructor  Destroy;
begin
  CustomClass1.Free;
  Inherited Destroy;
end;

end;

第二個問題:
直接從TCustomEdit 的父類TWinControl繼承重寫就是了,然后把TCustomEdit的大部分代碼COPY過來,加入自己的,就OK了

#16


不過絕大多數的Owner屬性是用Delphi IDE自動設定為Form的。自己好象沒什么辦法修改。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com