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

請問使用Mouse執行Drag&Drop時,各Event的先後順序?

尚未結案
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-09 18:24:04 IP:210.64.xxx.xxx 未訂閱
弟在StringGrid(SG)上使用OnDrawCell繪製表格內容,如下: 有關"Drag&Drop"的Mouse控制如下:
   procedure TFORM1.SGMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   begin
      SG.MouseToCell(X,Y,TMP_C,TMP_R);
      IF TMP_C = 3
      THEN
         SG.BeginDrag(TRUE)
      ELSE
         SG.EndDrag(TRUE);
   end;       procedure TFORM1.SGMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   begin
      SG.MouseToCell(X,Y,TMP_C,TMP_R);
   end;       procedure TFORM1.SGMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   begin
      SG.OnMouseDown := SGMouseDown;
   end;
可正常啟動"Drag&Drop"作業. 但是當OnMouseUp Event內容修改如下:
   procedure TFORM1.SGMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   begin
      SG.MouseToCell(X,Y,TMP_C,TMP_R);
      IF TMP_C = 3
      THEN
         SG.BeginDrag(TRUE)
      ELSE
         SG.EndDrag(TRUE);
   end;
當按下Mouse左鍵,手指尚未停止施力時,卻發生如下的錯誤訊息: 請教各位先進,兩種方式應該都是執行一樣的動作,為何產生不同的結果? 另請教各位先進,OnMouseDown,OnMouseMove,OnMouseUp,OnClick,OnDblClick,OnDragOver,OnDragDrop等Event之間的關係,和被執行的先後順序.
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-09 20:38:59 IP:221.226.xxx.xxx 未訂閱
Access violation(非法访问) 的错误多是使用或释放了不存在的对象引发的,所以从你的代码看,错误应该在 SG.BeginDrag(TRUE) 或 SG.EndDrag(TRUE); 内,你可以检查是否在事件内引用了不存在的对象,或者释放一个不存在或已被释放的对象. 对于先后顺序: OnMouseMove OnMouseDown OnMouseUp OnClick //= OnMouseDown & OnMouseUp OnDblClick //= 2 X OnClick OnDragOver:拖动经过时激发 OnDragDrop:拖动放下时激发 OnEndDrop :拖动结束时激发 發表人 - vicen 於 2005/09/09 20:43:27
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-12 11:50:57 IP:210.64.xxx.xxx 未訂閱
感謝解答在下的問題,但還是有些延伸的問題請幫忙:    Ans1: 1.SG.BeginDrag(TRUE)是"啟動"Drag動作,但SG.EndDrag(TRUE)不是"結束"Drag動作,而是"不啟動"Drag動作嗎? 2.OnMouseUp Event的內容若為"SG.OnMouseDown := SGMouseDown;",不寫這一段有何差別呢?(執行編譯後的程式,在下"看"不出來.) Ans2: 1.執行先後順序如下方式排列嗎? OnMouseMoveOnMouseDown[BeginDrag(TRUE)] → OnDragOver[Accept := TRUE] → OnMouseUpOnDragDropOnEndDrop; OnMouseMoveOnMouseDown[EndDrag(TRUE)] → OnMouseUpOnClick x2→ OnDblClick. 2.若OnClick EventOnDblClick Event的內容與OnMouseDown Event的內容無關,是另外的功能,請問如何避免OnMouseDown Event啟動呢? 3.元件同時擁有OnClick EventOnDblClick Event,請問需要加入程式碼以使系統不會誤認Double Click為兩次Click事件嗎? 謝謝.
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-12 20:46:05 IP:221.226.xxx.xxx 未訂閱
Q1: 1.EndDrag是强行结束一个拖放动作,而不是不启动拖放,在手动拖动模式下也就是DragMode设定为dmManual时而不是dmAutomatic时,没有收到BeginDrag时,拖放功能可以看成不存在的,所以没有必要用EngDrag来终止。 2.SG.OnMouseDown := SGMouseDown 在这里没有任何意义,这行的原意是将StringGrid的MOUSEDOWN事件动态指向SGMOUSEDOWN这个过程,但在这里没有任何意义,也不会产生运行效果,就像把变量 X := X 一样。 Q2 1.顺序是对的。 2.其实这也是比较难处理的问题,不管如何MouseDown都会先于Click和DblClick,Click也同样优先于DblClick触发,所以在没有更好的方法前使用一个标志变量应该是较好的方法。或者和Shift、Ctrl、Alt综合起来用也可以。 例如,初始化一个名为 bDisMouseDown : Boolean;的变量,并初始化为 False.在MouseDown中检查该标志,如果是 TRUE就执行,反之。这样可以避免需要Click或DblClick时触发MouseDown。但需要注意的是 MouseDown 中不能有例如SHOWMESSAGE,MESSAGEBOX之类的对话框事件,因为一旦有这些对话框窗口弹出,就不会再触发到Click和DblClick。 3.这个问题和处理MouseDown的方法是一样的,也同样需要设定一个标志进行判断,因为想触发DblClick时必然是先触发Click,顺序是: 双击鼠标: Click DblClick //双击时这两个事件都会被触发 所以必须有相应标志在Click中,让其只在特定情况下触发。关于标志使用方面,应该注意从 DblClick -> Click -> MouseDown的顺序进行逆向处理,以避免相互干扰。
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-13 15:02:32 IP:210.64.xxx.xxx 未訂閱
再次謝謝您的回答,根據Q1的解答實作之後,發生有趣的現象:
procedure TFORM1.SGMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
   SG.MouseToCell(X,Y,TMP_C,TMP_R);
   IF TMP_C = 3
   THEN
      SG.BeginDrag(TRUE)
   ELSE
      SG.EndDrag(TRUE);
end;    procedure TFORM1.SGMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
   SG.EndDrag(TRUE);
end;
綠色部分未加入時,游標在目標上按下Mouse左鍵尚未放開時,出現Drag圖示;綠色部分加入時,游標在相同目標上按下Mouse左鍵尚未放開時,並不會出現Drag圖示. 換句話說,按下Mouse左鍵尚未放開時,執行OnMouseDown Event,緊接著執行OnMouseUp Event,而不是等到Mouse左鍵放開時才執行.
系統時間:2024-04-25 22:33:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!