Как создать файл с помощью OLEDrag&Drop?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как создать файл с помощью OLEDrag&Drop?

Сообщение arthur2 » 21.05.2008 (Ср) 21:56

Простой пример: если перетащить мышкой ссылку на рабочий стол, то в том месте, где отпустим, создастся файл .url

Другой пример: если в ворде выделить фрагмент и перетащить его мышкой на рабочий стол, то в том месте, где отпустим, создастся файл .shs

Как осуществить подобное? Как зарядить в OLE данные, чтобы при перетаскивании на рабочий стол там создался файл с нужным именем и нужным содержанием?
Артур
 
   

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.05.2008 (Ср) 22:54

Нужно загнать данные в объект Data.

Он доступен в событиях, связанных с перетаскиванем.

Код: Выделить всё

Private Sub ListView1_OLEStartDrag(    Data As MSComctlLib.DataObject, AllowedEffects As Long)

....

AllowedEffects = vbDropEffectCopy Or vbDropEffectMove

....

Data.Files.add Путь_к_файлу
....

end sub


arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.05.2008 (Ср) 23:17

Ага, я как раз до этого дорылся. Вот что есть:
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
   text1.OLEDragMode = 1
End Sub

Private Sub text1_OLESetData(Data As DataObject, DataFormat As Integer)
     Data.SetData '??? Что здесь писать, совершенно не понятно
End Sub

Private Sub text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
    AllowedEffects = 1
    Data.Clear
    Data.SetData , vbCFFiles
   
End Sub


При перетаскивании на рабочий стол горит плюсик. При отпускании вызвается событие OLESetData. Но как туда зарядить файлы? Пробывал вписывать реальные пути - не принимает. Данные в datа вроде бы загнать можно (взять любой из форматов Clipbord), но как задать, чтобы это стало файлом?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.05.2008 (Ср) 23:42

Прости, туплю. Да, Data.file.add работает. В общем, этот вариант, кажется, вполне подходит, спасибо!

Но нужно же реальный путь - а значит нужно сначала создать где-то временный файл. А потом его ещё и удалять. Неужели нельзя сразу загнать файл в data данными?

А ещё - возможно ли узнать, куда именно перетащили?
Артур
 
   

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.05.2008 (Чт) 18:08

arthur2 писал(а):Прости, туплю. Да, Data.file.add работает. В общем, этот вариант, кажется, вполне подходит, спасибо!

Но нужно же реальный путь - а значит нужно сначала создать где-то временный файл. А потом его ещё и удалять. Неужели нельзя сразу загнать файл в data данными?

А ещё - возможно ли узнать, куда именно перетащили?


Все можно. Можно, скажем, создать временный файл, но не удалять, а перемещать его.

Или послать в Data массив байтов, но тогда придётся регистрировать собственный формат данных, и его, естественно, должно понимать другое приложение, т.е. это уже не будет формат vbcffiles.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 22.05.2008 (Чт) 19:14

Все можно. Можно, скажем, создать временный файл, но не удалять, а перемещать его.
Ага, понял.

Создать-то свой формат просто. Но та программа, которая его будет читать, тоже должна понимать этот формат. А если я хочу создавать своим форматом файлы, то значит принимать и понимать должнен проводник.

То есть, нужно писать СОМ-расширение? Но чёй-то не представляю, как подступиться. Может всё же можно как то подвязаться к чужому формату?

Проделал такой эксперемент: затащил файл .dat в окно WordPad-а, а затем натаскал этих датов на рабочий стол сколько захотел (даже подтверждение на перезапись не спрашивали - просто добавлялась копия и всё). Как бы вычислить, через какой формат это делается? Ведь это, скорее всего, как раз то, что надо.
Артур
 
   

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.05.2008 (Чт) 21:44

Можно попробовать тоже самое сделать через буфер обмена.

Для буфера обмена можно поискать утилитку для просмотра содержимого буфера

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 22.05.2008 (Чт) 22:47

Да содержимое я и так посмотрел. Сделал такую ловушку:

Код: Выделить всё
Private Sub dataCb_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
  Dim s As String, sW As String, b As Byte, i As Integer
  On Error Resume Next
For i = MININTEGER To MAXINTEGER
    If Data.GetFormat(i) Then
       b = Data.GetData(i)
       s = Data.GetData(i)
       sW = StrConv(s, vbUnicode)
       Debug.Print FormatName(Val("&h000000" & Hex(i))); "  &h" & Hex(i)
       Stop
       s = vbNullString
       sW = vbNullString
       b = s
    End If
Next

End Sub
'_________________________________________________________

Private Function FormatName(ByVal lFormatId As Long) As String
Dim lSize As Long
Dim sBuf As String
Dim lR As Long
If (lFormatId >= 1 And lFormatId <= 17) Then
' For pre-defined formats, we have to make the text up ourselves:
'стандартные форматы
Else
    ' For custom formats, we can ask the Clipboard for the registered name:
    lSize = 255
    sBuf = String$(lSize, 0)
    lR = GetClipboardFormatName(lFormatId, sBuf, lSize)
    If (lR <> 0) Then
    FormatName = """" & Left$(sBuf, lR) & """"
End If
End Function


Наловил ей вот чего:
При перетаскивании файла .dat из проводника

"FileName" &hC006
"FileNameW" &hC007
"Shell IDList Array" &hC074
"Shell Object Offsets" &hC0C0
"InShellDragLoop" &hC0CE
"DragImageBits" &hC1B5


При перетаскивании вложенного файла .dat из WordPad:
"Native" &hC004
"Object Descriptor" &hC00E
"Rich Text Format" &hC0F7
"Rich Text Format Without Objects" &hC138


Но в самих форматах фиг разберёшься. Буферы я сохранял в файлы и рассматривал. Содержимое исходного файла было "aaaaaa" - ни в одном из буферов оно легко не вычисляется. Описаний этих форматов (ну, кроме рич-текста) нигде не найти...

В общем, кажется, пора успокоиться на временных файлах 8)
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

    TopList