请按照下列创建示例窗体允许拖出一个文本框控件,并将它们放在一个网格单元格中的文本的步骤。

  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 以便发生默认行为。 移动将从文本框中删除数据,在文本框中的副本保留它。