今天看到豆三版主的博客上转了一篇鬼佬的使用 api 来实现从 windows 拖放文件到 vfp 列表框的文章,也不知道是为什么,vfp 本身就支持拖放操作,ole 拖放也同样支持,回复了一贴,后来碰到 yrt888 说不行,想想应该是他还没有看出我只简单的写了列表框接收拖入的代码,表单上的事件中没有写代码。一两句说不清,最好用段代码来说明。下面代码就可以简单实现那个鬼佬要完成的事情。
当然我不是想说用 api 不好,恰恰相反,我非常喜欢用 api !看看我以前的博客内容就知道了。很多 vfp 本身不支持的功能,用 api 可以轻易的实现,但有一个原则,就是 vfp 本身可以实现的东西,就完全没必要再用 api 来取而代之了,杀鸡焉用牛刀尔。其实如果用 vfp 表单来设计的话,只需要 OLEDragOver 和 OLEDragDrop 事件中那总共 8 行的代码,只是因为这里不能发表单,才啰啰嗦嗦的写了下面这么多。
先用好 vfp 本身,再来增强它的功能。
- oform = newobject('myform')
- _screen.windowstate = 1
- oform.show()
- read events
- define class myForm as form
- height = 250
- width = 375
- showwindow = 2
- oledropmode = 1 && 这里设为 1 - enabled,让表单接收拖放事件
- autocenter = .t.
- caption = '从 Windows 拖些文件过来看看'
- add object lst as listbox with ;
- oledropmode = 2, ; && 这里设为 2 - pass to container,将拖放事件传给表单来处理
- height = 216, ;
- left = 12, ;
- top = 12, ;
- width = 348, ;
- anchor = 15, ;
- name = "lst"
- procedure unload
- clear events
- endproc
- procedure oledragover
- lparameters od, p2, p3, p4, p5, p6, st
- if 0 == st and od.getformat(15)
- this.oledrophasdata = 1
- endif
- endproc
- procedure oledragdrop
- lparameters od, p2, p3, p4, p5, p6
- local lafiles[1]
- od.getdata(15, @ lafiles)
- for m.ii = 1 to alen(lafiles)
- this.lst.additem(lafiles[m.ii])
- endfor
- endproc
- enddefine