全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1018
推到 Plurk!
推到 Facebook!

如何寫一元件在執行期的屬性不會在設計期出現

答題得分者是:ha0009
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-06 08:57:32 IP:211.21.xxx.xxx 未訂閱
我設計了一個元件 目的很簡單,繼承一個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-06 09:09:20 IP:147.8.xxx.xxx 未訂閱
Look for TComponent.ComponentState.
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-06 09:12:00 IP:61.30.xxx.xxx 未訂閱
你好:
procedure TMyStringGrid.MyWindowProc(var Message: TMessage);
begin
  if (Message.Msg=WM_NCHITTEST) and not (csDesigning in ComponentState) then    //阻止所有滑鼠按鍵動作
      exit;      // 呼叫-原訊息處理程序
  StringGrid_WindowProc(Message);
end;
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-06 09:22:19 IP:211.21.xxx.xxx 未訂閱
感謝兩位長官 但由於 ha0009 長官有清楚的範例 所以分數給 ha0009 長官了
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-06 11:42:36 IP:211.21.xxx.xxx 未訂閱
引言: ....我看有的 3'rd party 將元件寫成兩個 source (一個 runtime用,一個compiler用)就是因為避開這個原因嗎 ?? ....
對了,既然可以判斷 runtime 及執行環境 那為何有些 3'rd party 將元件寫成兩個 source , 還有別的目的嗎 ?
系統時間:2024-09-28 9:58:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!