(изменено: Shoorup, 23 октября 2014г. 11:40:05)

Тема: Событие Drag & Drop

$matches[1]

Всё нашел  :) Вот сколько раз уже было. Как проблему запишешь, так другой раз быстрее е и решишь...

Re: Событие Drag & Drop

Так и не получилось сделать что хотел. А хотел сделать чтобы при перетаскивании на форму файла, при редактировании объекта, файл добавлялся в объект.
Сделал в скрипте профиля событие  FilesDragAndDropped. Сделал системный атрибут с сылкой на объект. При создании нового объекта он добавляет ссылку на этот объект в атрибут. А при перетаскивании объекта на форму (да впринципе вообще в окно TDMS) срабатывает событие FilesDragAndDropped где я могу получить ссылку через этот атрибут на создаваемый объект. Наверно идея неправильная... но в любом случае что дальше делать не пойму.

Как мне добавть в качестве главного файла в объект перетягиваемый файл?

(изменено: McZag, 27 октября 2014г. 11:18:05)

Re: Событие Drag & Drop

Shoorup пишет:

Так и не получилось сделать что хотел. А хотел сделать чтобы при перетаскивании на форму файла, при редактировании объекта, файл добавлялся в объект.
Сделал в скрипте профиля событие  FilesDragAndDropped. Сделал системный атрибут с сылкой на объект. При создании нового объекта он добавляет ссылку на этот объект в атрибут. А при перетаскивании объекта на форму (да впринципе вообще в окно TDMS) срабатывает событие FilesDragAndDropped где я могу получить ссылку через этот атрибут на создаваемый объект. Наверно идея неправильная... но в любом случае что дальше делать не пойму.

Как мне добавть в качестве главного файла в объект перетягиваемый файл?

С формой и вкладкой системные происходят странные вещи. Событие приходит, но файлы не падают. Видимо так задумано, чтобы дальше мы с вами сами принимали решение, что делать с файлами, брошенными в не совсем понятное место.

Тут два варианта.
Либо все автоматизировать, если заранее понятно, что происходит. Тогда метод Files.Create, я думаю.
Либо отдать все на откуп пользователю, и поднимать диалог TDMSAddFileDlg, открыв его в папке, откуда перетащен файл.

Re: Событие Drag & Drop

Либо все автоматизировать, если заранее понятно, что происходит.

Не понял:)

Либо отдать все на откуп пользователю

Так собственно пользователю и хочется упростить жизнь.
Он добавляет новый объект. Появляется форма (карточка) этого объекта, где он заполняет данные, но перед этим хорошо бы сразу поместить файл для этого объекта (на главной форме есть просмоторщик, где можно часть информации сразу переписать если есть файл). Вот я и подумал, чего он (пользователь) каждый раз будет тыкать вкладку файлы, потом возвращаться. Хорошо бы чтоб он прям на форму перетянул файл и он добавился в объект.
В дальнейшем по такому же принципу можно подумать над перетягиванием на родительский объект, тогда нужно будет создать объект и добавить в него файл. Быстро и красиво. Только вот с реализацией не получилось...

(изменено: Edhunter, 28 октября 2014г. 09:33:57)

Re: Событие Drag & Drop

Попробовал сделать реализаций. Проблемы конечно есть, но все не так уж и критично.
В контексте экранной формы событие Files_DragAndDropped  не имеет ссылки на объект, т.е. Object is nothing
Единственное решение которое я пока что нашел - сохранение ссылки на создаваемый объект в словаре. Данный подход в одной из веток форума сильно ругают, но если честно - я так и не понял почему.
Проблема номер 2 - необходимо обновить экранную форму после добавления файла. Форму зацепить можно также только через словарь.
Соответственно первая часть кода - сохранение ссылки на объект и форму. Я выбрал событие Form_BeforeShow так как у него есть ссылки на оба элемента

Sub Form_BeforeShow(Form, Obj)
  ' Определяем что для текущей формы есть объект
  If Not Obj Is Nothing Then
    ' Сохраняем ссылку на объект
    If Not ThisApplication.Dictionary.Exists ("ActiveObject") Then _
       ThisApplication.Dictionary.Add "ActiveObject", Obj
    Set ThisApplication.Dictionary.Item("ActiveObject") = Obj
    ' Сохраняем ссылку на форму
    If Not ThisApplication.Dictionary.Exists ("ActiveForm") Then _
       ThisApplication.Dictionary.Add "ActiveForm", Form
    Set ThisApplication.Dictionary.Item("ActiveForm") = Form
  End If
End Sub

Осталось только переписать событие для создания перетаскиваемых файлов.

Sub Files_DragAndDropped(FilesPathArray, Object, Cancel)
  If Object Is Nothing Then
    Cancel = True
    If ThisApplication.Dictionary.Exists ("ActiveObject") Then
      Set o = ThisApplication.Dictionary.Item("ActiveObject")
      ' Добавляем файлы к объекту
      For Each sPath In FilesPathArray
        o.Files.Create "FILE_ANY", sPath
      Next
      ' Обновляем форму
      If ThisApplication.Dictionary.Exists ("ActiveForm") Then
        Set f = ThisApplication.Dictionary.Item("ActiveForm")
        f.Refresh
      End If
    End If
  End If
End Sub

Я не стал усложнять код определяя по расширению тип добавляемого файла, а использовал тип файла "Все файлы". В принципе код определяющий тип написать несложно.
Решение возможно имеет определённые недостатки, готов выслушать если кто назовет.

Re: Событие Drag & Drop

А вообще конечно, неплохо бы что бы событие Files_DragAndDropped получало ссылку на объект не только когда активна вкладка файлов

Re: Событие Drag & Drop

Спасибо Edhunter! Вроде получилось, кроме обновления формы - в моем случае это важно, т.к. на ту форму что добавляю данные для заполнения карточки... Щас еще потестирую на важные моменты, но думаю на первое время сойдет.

Re: Событие Drag & Drop

а что не так с обновлением формы? у меня проблем вроде бы нет

Re: Событие Drag & Drop

Edhunter пишет:

А вообще конечно, неплохо бы что бы событие Files_DragAndDropped получало ссылку на объект не только когда активна вкладка файлов

Мне кажется это ошибка. Занес в базу.

Re: Событие Drag & Drop

Я не уверен, но мне казалось что метод Refresh запускает событие Form_BeforeShow, но судя повсему это не так... А у меня на форме в этом событии есть код типа:

If ThisObject.Files.Count=0 Then
        ThisForm.Controls("PREVIEW_UKAZANIA").Visible=False 'Просмоторщик скрыть
//....
End If

Ну вобщем я излечил так:

Sub File_Added(File, Object)
  Set f = ThisApplication.Dictionary.Item("ActiveForm")
  f.Controls("PREVIEW_UKAZANIA").Visible = True
End Sub

И все стало как надо! Edhunter еще раз спасибо!
В очередной раз убеждаюсь что в TDMS можно всё! А если не получается или не знаешь как, то всегда помогут и на форуме и "товарищи по цеху"!