Drag a file(path) from an Access Form into another app?

R

roger

I’ve read all about dragging files INTO Access forms, and dragging and
dropping data between controls on Access forms. I need to do something
different:

MyApp has a subform with a list of files in a folder on the local HD.
Currently I have buttons that opens the file using a Shell() command.

The Users want to be able to drag files out of the list (on the subform in
Access) and into other programs (like Notepad or Word), and have them open
just like you dragged a file there out of windows explorer.

I downloaded modules that “expose that Windows API†before, I’m assuming
this will be of those, but I sure don’t know how to write one.

AHA TIA
roger
 
D

Douglas J. Steele

I'm not sure it's possible.

You may have to settle for copying to the clipboard and pasting into the
other program.
 
R

roger

Well thanks, I guess. But I'm not willing to except "not possible." Not
yet anyway.

While I realize I cant do it simple Access controls, Drag and Drop is a core
Windows technoloy. Access recieves drag and drop, it got to be in there
someplace.

And if not the Windows API, then how about OLE? Will an OLE control support
drag and drop? and can I control it in VBA?

Or how about a Custom control? (do we still call them ActiveX controls?) VB
applets support drag and drop. Can I make a custom OCX control in VB and
embed that on an Access form?

There's got to be a way...
 
S

Stuart McCall

roger said:
Well thanks, I guess. But I'm not willing to except "not possible." Not
yet anyway.
<snip>

Doug's response gave me an idea. Although I don't have time to hack this out
completely, I can hopefully inspire you to attempt a solution. First you'll
need some way of copying and pasting text:

http://www.smccall.demon.co.uk/MiscApi.htm#Clipboard

Then use a control's MouseDown event to set a module level variable (say
Dragging As Boolean)

In the control's MouseMove event, if Dragging is True, detect when the mouse
cursor is inside the coordinates of the target app. On MouseUp, "drop" the
file (paste it from the clipboard), and reset the Dragging flag.

I can't remember all of the api you'll need offhand, but either you can find
it or maybe someone else on here might be able to jump in with that...
 
R

roger

Hi Stuart, At least you're involved in "possiblity thinking."

I've simulated drag and drop in Access before, but that isn't my goal. The
goal here is to actually use Windows drag and drop, and not have to write
custom procedures for every app the user could drop on. (just let windows do
it)

If it helps I'm using MSA 2007 which totally supports drag and drop, you can
drag tables and queries out to excel or word, and drop excel ranges in as
tables, so it IS in there.

If there is really NO way to do it in a form, then I am thinking that a
custom control is the answer. (I can't write one, but I would pay to have it
written) just a transparent button with three events, click, double click and
drag, and programmable value. With no other to drag data out of an Access
app, maybe I could sell the control.

Damn this is fustrating, from what I read, in .Net, this is as simple as
setting .DragBehavoir = enabled.
 
J

Jon Lewis

What are you using to display the list? If it's the ListView control (as
opposed to the Access ListBox) then I would think you should be able to use
OLE Drag events to do this.

Have a look at this article:
http://www.devx.com/vb/Article/7864/1954
or try asking on the "microsoft.public.vb.general.discussion" group how you
drag from a VB ListView control to achieve this.

HTH
 
J

Jon Lewis

Thought I'd have a bash at this myself, will this work for you?
(ListView0 is the ListView control from Windows Common Controls 6)

Option Compare Database
Option Explicit
Const vbCFFIles = 15
Const vbCFText = 1

Dim lCurX, lCurY As Single

Private Sub Form_Load()
Dim lstitem As ListItem
Set lstitem = ListView0.Object.ListItems.Add()
lstitem.Text = "Sample.txt"
lstitem.Key = "Fullpath\Sample.txt"
End Sub

Private Sub ListView0_MouseDown(ByVal Button As Integer, ByVal Shift As
Integer, ByVal x As Long, ByVal y As Long)
lCurX = x
lCurY = y
End Sub

Private Sub ListView0_MouseMove(ByVal Button As Integer, ByVal Shift As
Integer, ByVal x As Long, ByVal y As Long)
If Button = 1 Then
ListView0.OLEDrag
End If
End Sub


Private Sub ListView0_OLEStartDrag(Data As Object, AllowedEffects As Long)
On Error GoTo ListView0_OLEStartDrag_Err
Dim oDrag As ListItem
Set oDrag = ListView0.HitTest(lCurX, lCurY)

If oDrag Is Nothing Then
AllowedEffects = ccOLEDropEffectNone
Else
AllowedEffects = ccOLEDropEffectCopy
Call Data.SetData(oDrag.Text, vbCFText)
Call Data.SetData(, vbCFFIles)
Call Data.Files.Add(oDrag.Key)
End If
Exit Sub
ListView0_OLEStartDrag_Exit:
Exit Sub
ListView0_OLEStartDrag_Err:
MsgBox Err.Number & ": " & Err.Description
Resume ListView0_OLEStartDrag_Exit
End Sub

HTH
 
R

roger

Thanks Jon.
I'll look at this code.
I'm not useling a listbox, currently its a subform with text fields and
image controls. But there might be a Common Control I could put in there.

I'll let you know
roger
 
D

Douglas J. Steele

Jon's suggestion of using the ListView control is a good one. Unfortunately,
you can't bind ListView controls, so depending on how your form currently is
used, you may find it more work than it's worth.

I think you'll find that's going to be your issue: the native Access
controls don't allow drag-and-drop, and using anything other than the native
Access controls means you won't be able to bind.
 
R

roger

This WORKS!
Thanks.

Only thing is I'm not using a .Listview control. The article said that other
VB6 controls; picturebox, image, and textbox, all support OLE drag and drop.
But I don't have any of them in Access.

Am I missing something? Can I add those controls?

roger
 
J

Jon Lewis

VB6 controls are native to VB6. The ListView control is part of the Windows
Common Controls so that's why you can use it in Access.

As Douglas says, a ListView control can't be bound to data but it's pretty
easy to populate and refresh with a list of files say in a directory or from
a recordset. (My example just loads one sample 'item' to the list view - you
would loop through a recordset adding all the relevent items.)

Additionally, you can choose the view for the ListView (like a Windows
folder). You can display an icon for each item in the list (use the
ImageList Common Control to store them) which may be able to take the place
of the image control and more than one column for each item.

Unless I've misunderstood your requirements, you would look to replace your
subform with the ListView, a ListView item replacing each record of the
subform . Quite a lot of coding required but very doable.

HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top