如何寫一元件在執行期的屬性不會在設計期出現 |
答題得分者是:ha0009
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
我設計了一個元件
目的很簡單,繼承一個 TStringGrid ,
將其滑鼠觸發屬性拿掉(檔掉 StringGrid 上 所有WM_NCHITTEST 這個 Message)
然後變成一個新的 STringGrid (叫 TMyStringGrid)
果然成功,user 無法在 StringGrid 輸入資料中按滑鼠
亂跳到其他的 cell 中,輸完一個欄位後該跳到哪個 cell,完全由程式掌控 但是發現,在設計時期(Delphi中未按 run 之前),
我在Delphi Form 上無法用滑鼠移動這個 TMyStringGrid
也就是說,它在未 run 之前就已經呈現了檔掉 WM_NCHITTEST 這個 Message 的功能,請問類似元件應如何設計?我看有的 3'rd party 將元件寫成兩個 source
(一個 runtime用,一個compiler用)就是因為避開這個原因嗎 ??
unit MyStringGrid; //james 第一個元件 - 2003/11/05 interface uses SysUtils, Classes, Controls, Grids, Messages; type TMyStringGrid = class(TStringGrid) private procedure MyWindowProc(var Message: TMessage); function _StrSeg(Str ,SegSymbol: String ; SegIndex: integer): String; { Private declarations } protected { Protected declarations } public { Public declarations } constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure SetCaption(ACaption: String); published { Published declarations } end; procedure Register; implementation var StringGrid_WindowProc : TWndMethod; constructor TMyStringGrid.Create(AOwner : TComponent); begin inherited Create(AOwner); StringGrid_WindowProc:=WindowProc; WindowProc:=MyWindowProc; end; procedure TMyStringGrid.MyWindowProc(var Message: TMessage); begin if (Message.Msg=WM_NCHITTEST) then //阻止所有滑鼠按鍵動作 exit; // 呼叫-原訊息處理程序 StringGrid_WindowProc(Message); end; procedure TMyStringGrid.SetCaption(ACaption: String); var i:integer; begin for i :=0 to ColCount-1 do begin Cells[i,0]:=_StrSeg(ACaption,',',i 1); end; end; function TMyStringGrid._StrSeg(Str ,SegSymbol: String ; SegIndex: integer): String; var r,c,s,sTmp : String; i:integer; begin r:=''; if ((Str='') or (SegIndex<1)) then begin result:=r; exit; end; c:=SegSymbol; if (c='') then c:=','; i:=0; s:=Str; sTmp:=''; while Pos(c,s)>0 do begin i:=i 1; sTmp := Copy(s,1,Pos(c,s)-1); if (SegIndex=i) then begin r:=sTmp; break; end; s:=Copy(s , Pos(c,s) Length(c) , Length(s)-(Pos(c,s) Length(c)) 1); end; if SegIndex=(i 1) then begin r:=s; end; result:=r; end; destructor TMyStringGrid.Destroy; begin inherited Destroy; end; procedure Register; begin RegisterComponents('Test', [TMyStringGrid]); end; end. |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |