vfp:ole拖動

請按照下列建立示例窗體容許拖出一個文本框控件,並將它們放在一個網格單元格中的文本的步驟。

  1. 建立用於表格網格線。 能夠使用下面的代碼:
          ** Make table
          CREATE TABLE gridtest (color c(10), fruit c(15), quantity i)
          INSERT INTO gridtest VALUES ("Red","Apple",5)
          INSERT INTO gridtest VALUES ("Blue","Pear",10)
          INSERT INTO gridtest (fruit) VALUES ("Peach")
          INSERT INTO gridtest (COLOR) VALUES ("Green")
          INSERT INTO gridtest (quantity) VALUES (7)
          INSERT INTO gridtest (COLOR,fruit) VALUES ("Black","Blackberry")
          INSERT INTO gridtest (COLOR,quantity) VALUES("Orange",3)
          INSERT INTO gridtest (fruit,quantity) VALUES ("Orange",8)
          INSERT INTO gridtest (fruit,COLOR) VALUES ("Banana","Indigo")
    							
  2. 建立新的窗體。 將窗體保存爲 Gridodd.scx。
  3. 添加到窗體的數據環境的步驟 1 中建立 gridtest 表。
  4. 將從數據環境中的表拖動到窗體。 它應該建立網格放置到窗體上時。 調整窗體併爲所需的網格的大小。
  5. 將文本框控件添加到窗體。 將 OLEDragMode 屬性設置爲 1-自動。
  6. 將下列代碼放在文本框中 OLEGiveFeedback 事件。 請注意 LPARAMETERS 行應該已存在默認狀況下。
          LPARAMETERS nEffect, eMouseCursor
          IF nEffect=0
             eMouseCursor=12     && the no drop circle with line
          ELSE
             eMouseCursor="bullseye.cur"
          ENDIF
    							
  7. 從 Visual Studio\Common\Graphics\Cursors 複製 Bullseye.cur 文件到窗體和表的保存位置文件夾的文件夾。 在 HOME(4) 函數可用於查找到 Visual Studio\Common\Graphics 文件夾路徑。 浠 ヤ 笅鍛戒護 Visual FoxPro 命令窗口中用來將文件複製到當前的默認文件夾:
          COPY FILE HOME(4)+"Cursors\bullseye.cur" TO SYS(5)+SYS(2003)
    							
  8. 將網格的 OLEDropMode 屬性設置爲 1-已啓用。
  9. 將如下代碼添加到網格的 OLEDragOver 事件。 請注意 LPARAMETERS 行應該已存在默認狀況下。
          LPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, ;
             nYCoord, nState
          LOCAL nWhere
          nWhere=0
          IF This.GridHitTest(nXCoord,nYCoord,@nWhere)
             IF nWhere=3    && over a grid cell
                nEffect=3
             ELSE
                nEffect=0  && if not over a grid cell, can't drop
             ENDIF
          ENDIF
    							
  10. 將如下代碼添加到網格的 OLEDragDrop 事件。 請注意 LPARAMETERS 行應該已存在默認狀況下。
          LPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord
          LOCAL nOperation, cText, nWhere, nRelRow, nRelCol
          IF nShift=2   && Control key is down
             nOperation=1   && DropEffect_Copy
          ELSE
             nOperation=2   && DropEffect_Move
          ENDIF
          IF This.GridHitTest(nXCoord,nYCoord,@nWhere,@nRelRow,@nRelCol)
             IF nWhere=3    && over a grid cell
                This.ActivateCell(nRelRow,nRelCol)
             ENDIF
          ENDIF
          IF oDataObject.GetFormat(1)   && CF_TEXT
             cText=oDataObject.GetData(1)
             This.Columns(nRelCol).Text1.Value=cText
             NODEFAULT
          ENDIF
          nEffect=nOperation  && nEffect gets passed to OLECompletDrag
    							
  11. 保存並運行該窗體。
  12. 文本框中輸入一些文本,選擇它而後將文本拖到一個網格單元格。 此外,請在拖動時按住 CTRL 鍵。 無需按住 CTRL 鍵,文本與 ctrl 文本副本角移動,而且是在文本框中,除了在網格中。
簡要,文本拖出文本框的和網格上時,會發生什麼狀況是這樣:

  1. 窗體的 OLEDropMode 屬性設置爲 0-已禁用使鼠標指針停留在默認"放下"指針。 然而,在網格 OLEDropMode 屬性設置爲 1-已啓用。
  2. 當鼠標與數據移到網格的 OLEDragOver 事件激發網格上。 OLEDragOver 事件,在 GridHitTest 中函數激發。 返回一個三 (3),這意味着鼠標是在網格單元格上時文本框中 OLEGiveFeedback 告訴 FoxPro bullseye 光標來更改鼠標指針。 這使用戶能夠知道該文本能夠那裏除去。
  3. 當用戶在網格的 OLEDragDrop 事件激發一個網格單元格的頂部放置文字。 此事件中該 GridHitTest 再次激發與傳遞給事件鼠標的座標。 GridHitTest 返回,經過引用,鼠標位於柵格單元格中,以及爲網格相對行和列的值。 而後在網格 ActivateCell 方法中選擇鼠標位於的網格單元格使用。
  4. 如今該 FoxPro 知道哪些網格單元格鼠標上並已激活,它檢查數據對象是否存在文本數據。 oDataObject.GetFormat(1) 行網格的 OLEDragDrop 事件中的代碼完成此操做。 若是文本數據它是得到和使用數據對象 GetData() 方法變量保存。 當前的網格單元格中的文本框控件的值屬性而後設置爲包含剛從數據對象中獲取數據的變量。
  5. 中網格的 OLEDragDrop 事件,nShift 參數檢查以查看是否任一修飾符鍵被按下。 在此示例中,CTRL 鍵的複選。 若是按下 CTRL 鍵,nEffect 輸出參數設置爲這意味着副本 1。 若是不按住是 CTRl 鍵,nEffect 是設置爲 2,這意味着移動。
  6. 在網格 OLEDragDrop 事件的 nEffect 輸出參數傳遞到文本框中 OLECompleteDrag 事件。 在本例中沒有代碼中文字框 OLECompleteDrag 以便發生默認行爲。 移動將從文本框中刪除數據,在文本框中的副本保留它。
相關文章
相關標籤/搜索