Тема: Событие Drag & Drop
$matches[1]
Всё нашел :) Вот сколько раз уже было. Как проблему запишешь, так другой раз быстрее е и решишь...
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы TDMS → Технический раздел → Программирование → Событие Drag & Drop
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
$matches[1]
Всё нашел :) Вот сколько раз уже было. Как проблему запишешь, так другой раз быстрее е и решишь...
Так и не получилось сделать что хотел. А хотел сделать чтобы при перетаскивании на форму файла, при редактировании объекта, файл добавлялся в объект.
Сделал в скрипте профиля событие FilesDragAndDropped. Сделал системный атрибут с сылкой на объект. При создании нового объекта он добавляет ссылку на этот объект в атрибут. А при перетаскивании объекта на форму (да впринципе вообще в окно TDMS) срабатывает событие FilesDragAndDropped где я могу получить ссылку через этот атрибут на создаваемый объект. Наверно идея неправильная... но в любом случае что дальше делать не пойму.
Как мне добавть в качестве главного файла в объект перетягиваемый файл?
Так и не получилось сделать что хотел. А хотел сделать чтобы при перетаскивании на форму файла, при редактировании объекта, файл добавлялся в объект.
Сделал в скрипте профиля событие FilesDragAndDropped. Сделал системный атрибут с сылкой на объект. При создании нового объекта он добавляет ссылку на этот объект в атрибут. А при перетаскивании объекта на форму (да впринципе вообще в окно TDMS) срабатывает событие FilesDragAndDropped где я могу получить ссылку через этот атрибут на создаваемый объект. Наверно идея неправильная... но в любом случае что дальше делать не пойму.Как мне добавть в качестве главного файла в объект перетягиваемый файл?
С формой и вкладкой системные происходят странные вещи. Событие приходит, но файлы не падают. Видимо так задумано, чтобы дальше мы с вами сами принимали решение, что делать с файлами, брошенными в не совсем понятное место.
Тут два варианта.
Либо все автоматизировать, если заранее понятно, что происходит. Тогда метод Files.Create, я думаю.
Либо отдать все на откуп пользователю, и поднимать диалог TDMSAddFileDlg, открыв его в папке, откуда перетащен файл.
Либо все автоматизировать, если заранее понятно, что происходит.
Не понял:)
Либо отдать все на откуп пользователю
Так собственно пользователю и хочется упростить жизнь.
Он добавляет новый объект. Появляется форма (карточка) этого объекта, где он заполняет данные, но перед этим хорошо бы сразу поместить файл для этого объекта (на главной форме есть просмоторщик, где можно часть информации сразу переписать если есть файл). Вот я и подумал, чего он (пользователь) каждый раз будет тыкать вкладку файлы, потом возвращаться. Хорошо бы чтоб он прям на форму перетянул файл и он добавился в объект.
В дальнейшем по такому же принципу можно подумать над перетягиванием на родительский объект, тогда нужно будет создать объект и добавить в него файл. Быстро и красиво. Только вот с реализацией не получилось...
Попробовал сделать реализаций. Проблемы конечно есть, но все не так уж и критично.
В контексте экранной формы событие 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
Я не стал усложнять код определяя по расширению тип добавляемого файла, а использовал тип файла "Все файлы". В принципе код определяющий тип написать несложно.
Решение возможно имеет определённые недостатки, готов выслушать если кто назовет.
А вообще конечно, неплохо бы что бы событие Files_DragAndDropped получало ссылку на объект не только когда активна вкладка файлов
Спасибо Edhunter! Вроде получилось, кроме обновления формы - в моем случае это важно, т.к. на ту форму что добавляю данные для заполнения карточки... Щас еще потестирую на важные моменты, но думаю на первое время сойдет.
а что не так с обновлением формы? у меня проблем вроде бы нет
А вообще конечно, неплохо бы что бы событие Files_DragAndDropped получало ссылку на объект не только когда активна вкладка файлов
Мне кажется это ошибка. Занес в базу.
Я не уверен, но мне казалось что метод 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 можно всё! А если не получается или не знаешь как, то всегда помогут и на форуме и "товарищи по цеху"!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы TDMS → Технический раздел → Программирование → Событие Drag & Drop
Форум работает на PunBB, при поддержке Informer Technologies, Inc