Тема: Запрос даты у пользователя

Подскажите, каким образом можно запросить у пользователя выбор даты, наподобие использования диалога выбора объекта.

Может, у кого-то есть рабочие примеры использования CreateObject("MSComCtl2.DTPicker.2") или CreateObject("MSCAL.Calendar")?

Re: Запрос даты у пользователя

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

Потом можете из скрипта вызывать эту форму -

ThisApplication.InputForms("SysId").Show

Причём у этой формы ввода можно отписать события. Наложить любые условия и т.д. (см. события форм ввода).

(изменено: Alex.spb, 21 мая 2007г. 12:35:13)

Re: Запрос даты у пользователя

В таком случае возникают вопросы:
1. Как передать полученные данные в используемый нами объект, при условии, что одновременно несколько человек будут с ним работать?
2. Как передать в вызваемую форму и вернуть значения для создаваемого, еще не сохраненного, объекта?

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

Update.
Собственно, опишу контекст. У объекта есть табличный атрибут с 5 полями разных типов, некоторые взаимосвязаны (например, подразделение - его сотрудники). Пользователи не должны иметь возможности правки существующих записей. Поэтому по очереди в дружелюбной манере (типа, "шаг 2 из 5: Пожалуйста,...") запрашиваю требуемые значения и проверяю корректность заполнения. Форма на весь экран (ведь менять ее размер мы не можем) с одним контролом типа даты будет смотреться не очень "дружелюбно". ИМХО.

Re: Запрос даты у пользователя

Alex.spb пишет:

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

Update.
Собственно, опишу контекст. У объекта есть табличный атрибут с 5 полями разных типов, некоторые взаимосвязаны (например, подразделение - его сотрудники). Пользователи не должны иметь возможности правки существующих записей. Поэтому по очереди в дружелюбной манере (типа, "шаг 2 из 5: Пожалуйста,...") запрашиваю требуемые значения и проверяю корректность заполнения. Форма на весь экран (ведь менять ее размер мы не можем) с одним контролом типа даты будет смотреться не очень "дружелюбно". ИМХО.

На форуме есть ветка, где обсуждается возможность использования ActiveX. Есть проблемы, которые не позволят использовать произвольные компоненты на формах TDMS "как есть". Самая большая сложность - в скриптовой обвязке компоненты. В некоторых случаях (точнее для некоторых компонент) ситуация вообще неразрешима (а еще точнее, решается через такую Ж, что поддержка этого решения в многопользовательской среде становится грустной).

В вашем случае

* либо пишите собственную dll и вставляйте в нее какие хотите элементы управления. Проблемы с передачей аргументов
   в рамках одного приложения/пользователя НАПРИМЕР решаются через
   а) реестр Windows, б) словарь TDMS, в) атрибуты пользователя TDMS;
   в рамках всей системы НАПРИМЕР через
   а) атрибуты объекта б) атрибуты приложения TDMS в) почту или передачу сообщений (транспорт и стандарты передачи выберите по вкусу).

* либо используйте то что есть TDMS. Контроль ввода на события по изменению значений атрибутов

Re: Запрос даты у пользователя

Спасибо за развернутый ответ.

* либо пишите собственную dll и вставляйте в нее какие хотите элементы управления.
Возникает проблема регистрации библиотеки у клиента. Вроде, без админских прав не сработает WshShell.Run("regsvr32 mine.dll").
Я по этому же пути пошел, но с другой стороны: в определенный объект вложил Exe-файл, в котором показывается календарь. Т.е. выгружаю его у пользователя, запускаю - возникла проблема невозможности узнать возвращаемого значения =( Почему-то в VBS работает, а TDMS ошибку выдает. В итоге, не стал разбираться.

Проблемы с передачей аргументов
в рамках одного приложения/пользователя НАПРИМЕР решаются через
а) реестр Windows, б) словарь TDMS, в) атрибуты пользователя TDMS;
в рамках всей системы НАПРИМЕР через
а) атрибуты объекта б) атрибуты приложения TDMS в) почту или передачу сообщений (транспорт и стандарты передачи выберите по вкусу).

При одновременной многопользовательской работе остается, видимо, только словарь и атрибуты пользователя (кстати, менять атрибуты пользователя может только сисадмин, так что, этот способ отпадает).

* либо используйте то что есть TDMS. Контроль ввода на события по изменению значений атрибутов
Да, как вариант - использовать классификатор со сроками (сутки, 3 дня, неделя, месяц и т.д.). Решение, но не очень элегантное.

Понятно, что решения есть всегда. В конце этой эпопеи я в итоге вернулся к идее Анатолия, а результат считываю так:  frmDateForm.Attributes("A_GETDATE").Value.

(изменено: Anatoly, 24 мая 2007г. 14:35:33)

Re: Запрос даты у пользователя

Понятно, что решения есть всегда. В конце этой эпопеи я в итоге вернулся к идее Анатолия, а результат считываю так: frmDateForm.Attributes("A_GETDATE").Value.

Ну так в итоге то получилось или нет?

P.S. В 3.0.87 пока еще нельзя передавать на кастомную форму объект.

Необходимо использовать TDMSDictionary для подстановки obj в события.

(изменено: Alex.spb, 24 мая 2007г. 12:26:27)

Re: Запрос даты у пользователя

Ну так в итоге то получилось или нет? Научились Object передавать на форму ввода?

Нет, стандартными средствами не получилось.

Нашел такую штуку:

AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI.  It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys).

AutoIt was initially designed for PC "roll out" situations to configure thousands of PCs, but with the arrival of v3 it is also well suited to performing home automation and the scripting of repetitive tasks.

AutoIt can:

Execute Windows and DOS executables
Simulate key strokes (supports most keyboards layouts)
Simulate mouse movements and clicks
Move, resize and manipulate windows
Interact directly with "controls" on a window (set/get text, move, disable, etc.)
Work with the clipboard to cut/paste text items
Work with the registry

Наверно, можно с нею попытаться повозиться. По крайней мере, смог многострадальный Календарь показать.

Но для ее работы нужно как минимум регистрировать одну dll-ку. Вернулись на круги своя.

Upd.

В итоге все свойства в событиях будут проинициализированны


Дык, сейчас это решается перебиранием атрибутов объекта и контролов формы =) Правда, на таблицах работает ну очень медленно - приходилось пробовать.

P.S. Надеюсь, в этом случае по-прежнему не будет справа от формы полосы с кнопаками свойств, просомтра, файлов и т.д.?

(изменено: Anatoly, 24 мая 2007г. 14:36:34)

Re: Запрос даты у пользователя

Честно говоря, я бы не стал работать с сторонними dll  ;) Дело всё в том, что 100% найдётся 1 компьютер (или 10), на котором эта "левая" dll не заработает - а мороки будет куча  :(
P.S. сейчас можно и нужно использовать TDMSdictionary для храниния объекта, чтобы потом в событии формы его присвоить.

UPD.был неправ.

Re: Запрос даты у пользователя

Если вопрос вызова ActiveX календаря ещё стоит, то сейчас эта возможность появилась:
https://tdmsforum.ru/post959.html#p959