{以下是介面定義部分代碼}
unit CustomTListView;
interface
uses
Winapi.Windows, System.Classes, Vcl.ComCtrls, Vcl.StdCtrls, Winapi.Messages, System.UITypes;
type
TLVEditedEvent= procedure (Sender: TObject; Item:TListItem; Row, Clm:Integer; Str: string)of object; {自定義訊息處理方法,也沒有什么問題}
TTEdit = class(TEdit) // 嵌入TListView一個編輯框
public
// constructor Create(AOwner: TComponent); override;
protected
procedure WndProc(var message: TMessage); override;
end;
TTListView = class(TListView)
private
FEdit: TTEdit;
RowClm: array of array of TRect;
EditRow, EditClm: Integer;
FOnEditChange: TLVEditedEvent;
function CalRowClm(X, Y: Integer): Boolean; // 計算行列
procedure EditRowClm(R, C: Integer);
procedure WMSetfocus(var message: TMessage); message WM_KILLFOCUS;{//每次切換一個輸入框,都會觸發一次焦點切換,因此覆寫焦點事件,從測驗看,這是沒有問題的}
protected
procedure WndProc(var message: TMessage); override;{劫持訊息控制流程,對TTlistView的訊息操作是沒有問題的}
procedure DoEditChange(Sender: TObject; Item: TListItem; R, C: Integer; Change: TItemChange); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
//property EditDblClick:TNotifyEvent;//(Sender: TObject);dynamic;
procedure EditDblClick(Sender: TObject);virtual;
property OnEditChange: TLVEditedEvent read FOnEditChange write FOnEditChange;
end;
{現在的問題是,我如何,在TTlistView里,撰寫訊息以回應FEdit的事件。不知道我說清楚了嗎?就是在TTListView里,定義訊息事件發布property,覆寫FEdit繼承來的事件,比方說雙擊等,這又可能實作嗎?還是我太菜了?}
uj5u.com熱心網友回復:
我知道,嵌入Edit,給listview實作編輯,是很容易實作的,問題是我要重復使用很多次,這種編輯,在多個程式里,于是想寫個組件,不知道怎么在兩個組件間傳遞訊息。uj5u.com熱心網友回復:
listview本身不是有readonly屬性,可以編輯啊,你想要的設計與這不同嗎uj5u.com熱心網友回復:
listview顯示的資料多數不是本身的資料,都是data指定的,所以你要改變的是data的資料,而不是listview的item的資料,因此編輯本身的item是無效的。uj5u.com熱心網友回復:
delphi 太冷了。我只好把FEdit,移動到public下,讓他可見就解決了。實在沒有更好的辦法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/134435.html
標籤:VCL組件開發及應用
