Color屬性是靈活的
function TColorProperty
begin
Result := [PaMultiselect
end;
⑸ 注冊屬性編輯器
一旦創建屬性編輯器
調用RegisterPropertyEditor過程來注冊屬性編輯器
● 要編輯的屬性的類型信息的指針
● 編輯器應用的部件類型
● 屬性名
● 使用該屬性編輯器的屬性的類型
下面引用了注冊標准部件的過程
procedure Register;
begin
RegisterPropertyEditor (TypeInfo(TComponent)
RegisterPropertyEditor(TypeInfo(TComponentName)
RegisterPropertyEditor (TypeInfo(TMenuItem)
end;
這三句表達式使用RegisterPropertyEditor三種不同的用法
● 第一種最典型
它注冊了用於所有TComponent類型屬性的屬性編輯器TComponentProperty
● 第二個表達式注冊特定類型的屬性編輯器
它為特定部件的特定屬性注冊屬性編輯器
● 第三個表達式介於第一個和第二個表達式之間
它為部件TMenu的TMenuItem類型的所有屬性注冊了屬性編輯器
事件是部件的很重要的部分
● 什麼是事件
● 怎樣實現標准事件
● 怎樣定義自己的事件
事件是聯接發生的事情與某些代碼的機制
部件用戶將事件看作是由用戶編寫的代碼
從部件編寫者角度事件有更多的含義
要編寫一個事件
● 事件和方法指針
● 事件是屬性
● 事件處理過程類型
● 事件處理過程是可選的
⑴ 事件是方法指針
Delphi使用方法指針實現事件
方法指針的工作方式就象其它的過程類型
procedure TControl
begin
if Assigned(OnClick ) then OnClick( Self )
end;
如果用戶給Control的OnClick事件賦了處理過程(Handle)
⑵ 事件是屬性
部件采用屬性的形式實現事件
type
TControl=class ( TComponent )
private
FOnClick: TNofiFyEvent; { 聲明保存方法指針的域 }
protected
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;
象其它類型的屬性一樣
⑶ 事件處理過程類型
因為一個事件是指向事件處理過程的指針
所有的事件方法都是過程
在事件處理過程中傳遞var參數的典型例子是TKeyPressEvent類型的KeyPressed事件
type
TKeyPressEvent=procedure( Sender: TObject; var key: char) of Object;
通常key參數包含用戶按下鍵的字符
procedure TForml
begin
key := Upcase( key )
end;
也可使用var參數讓用戶覆蓋缺省的處理
⑷ 事件處理過程是可選的
在為部件創建事件時要記住部件用戶可能並不編寫該事件的處理過程
① 部件用戶並非不得不處理事件
事件總是不斷地發生在Windows應用程序中
② 部件用戶能在事件處理過程寫任意的代碼
一般說來
Delphi帶的所有控制繼承了大多數Windows事件
● 什麼是標准事件
● 怎樣使事件可見
● 怎樣修改標准事件處理過程
⑴ 什麼是標准事件
有兩種標准事件
最基本的事件都定義在對象TControl中
OnClick OnDragDrop OnEndDrag OnMouseMove
OnDblClick OnDragOver OnMouseDown OnMouseUp
所有標准事件在TControl中都定義了相應的protected動態方法
標准控制(從TWinControl繼承)具有下列事件
OnEnter OnKeyDown OnkeyPress OnKeyUp OnExit
正如TControl中的標准事件
⑵ 怎樣使事件可見
標准事件的聲明是protected
type
TMyControl=class(TCustomControl)
published
property OnClick; { 使OnClick在objectinspector中可見 }
end;
⑶ 怎樣修改標准事件處理過程
如果想修改自定義部件響應某種事件的方法
調用繼承的方法的順序是很重要的
下面是一個覆蓋Click事件的例子
procedure TMyControl
begin
inherited Click; { 執行標准處理
end;
定義全新的事件的情況是很少見的
● 觸發事件
● 定義處理過程類型
● 聲明事件
● 調用事件
⑴ 觸發事件
定義自己的事件要遇到的第一個關鍵是
這裡有TControl處理WM_LBUTTONDOWN消息的方法
type
TControl = class(TComponent)
private
FOnMouseDown: TMouseEvent;
procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState)
procedure WMLButtonDown(var Message: TWMLButtonDown)
message M_LBUTTONDOWN;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X
end;
procedure TControl
begin
if Assigned(FOnMouseDown) then
FOnMouseDown(Self
end;
procedure TControl
Shift: ShiftState)
begin
with Message do
MouseDown(Button
end;
procedure TControl
begin
inherited; { perform default handling }
if csCaptureMouse in ControlStyle then
MouseCapture := True;
if csClickEvents in ControlStyle then
Include(FControlState
DoMouseDown(Message
end;
當兩種事情
[
From:http://tw.wingwit.com/Article/program/Delphi/201311/25119.html