эмулирование счётной таблицы на userform

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Есть пользовательская форма. На ней эмулируется таблица 5x5 текстбоксами.
Текстбоксы субклассирую общим обработчиком. Примерно как в http://forum.developing.ru/showthread.php?t=6620&page=2
В некоторые текстбоксы (далее просто ячейки) я должен помещать рассчитываемое значение при изменении определённых ячеек.
Проблема состоит в том на ккакое событие повесить процедуру пересчёта. На сhange не хотелось бы так как до окончания ввода
в ячейку в ней может оказаться некорректное значение. А события Exit у класса для текстбокса нет :(
Только для отдельных текстбоксов. Cобственно я сейчас и пишу 25 обработчиков для Exit для
каждого текстбокса, вызывающих пересчёт ячеек. Но как то это некрасиво.
Использовать ActivX для грида то же не вариант. Мне нужно что бы макрос работал на чужих
машинах без регистрации дополнительных ActiveX.
Cейчас продумываю идею перехватывать Tab и Enter через KeyDown. Но остаётся проболема
с уходом из текстбокса мышью. Перехватывать ещё MouseDown ...
Ваши идеи ?
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

А вариант с дополнительной кнопкой - "Расчитать" не рассматривается?
Или клик по фрейму в котором, допустим, поместить Ваши текстбоксы
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Нет. Никаких явных дополнительных элементов управления.
Клик по фреймуто же не пройдёт. Интересно решение именно в моей постановке:
Ушли из ячейки - пересчёт.
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Aent,
Cейчас продумываю идею перехватывать Tab и Enter через KeyDown
ну тогда , наверное, Tab или Enter. Другого вроде ничего нет (Exit уже в работе, а сhange не подходит по условиям задания).
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

предложения -
1)
во-первых, необходимо выделить каким-либо образом те ячейки, в которых значения расчитываются, чтобы они визуально отличались от тех, в которые вводим данные.

2)
по щелчку на рассчитываемые ячейки - должен обязательно происходить расчет, пусть и дублирующий основную реализацию

3) желательно показать (сформировать) состояние двух признаков
- произведен изменение данных после последнего расчета
- произведен расчет после изменения данных
в общем - RS-триггер ;)

Пользователь в процессе работы программы должен понять заложенную логику выполнения расчетов:
- автоматически, после изменения данных
- вручную - необходимо явно что-то нажать.

Поэтому вышеуказанные признаки ему желательно (/необходимо) как-то показать -
комментариями - текстом, цветом значений в Textbox-ах и т.д.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Нет, господа. Заазчик пожелал что бы пересчёт происходил именно при покидании ячейки ввода любым способом. Автоматически а вовсе не после нажатия на дополнительную кнопку (или клавишу) или клик мышкой. Вопрос мой сводился именно к эмулированию в случаее группы текстбоксов события Exit. Цвет ячеек и так разный. Cвойство .Tag использую для указания влияющих ячеек.
Андрей Энтелис,
aentelis.livejournal.com
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Но остается проблема с уходом из текстбокса мышью.
а у меня уход мышью - не происходит пока не щелкните по другому объекту,
и тогда все равно срабатывает _Exit,
Tab и Enter
также вызвают_Exit

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

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Label1.Caption = "true1"
End Sub
25 _Exit - чем не вариант? не смотреть же на них каждый день :)
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Aent писал(а): Но остаётся проболема
с уходом из текстбокса мышью. Перехватывать ещё MouseDown ...


Не проще ли, в дополнение к имеющейся обработке события Exit, обработать событие UserForm_MouseMove? Поставить флаг IsCalculated, срабатывающий на событие Change определённых текстбоксов, и при наступлении события MouseMove, в зависимости от значения флага IsCalculated, пересчитывать значения (и снимать этот флаг), или ничего не делать.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Avsha, так так я и поступил. 25 Exit ...
EducatedFool, пользователь может вообще не трогать мышь.
Андрей Энтелис,
aentelis.livejournal.com
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте Aent.
А как Ваш заказчик относится к самостоятельным приложениям VB.
Один массив контролов(TextBox(25)), одно событие(..._LostFocus(Index As Integer)) и процедура обработки тоже может быть одна.
Чем не вариант ? ;)
Евгений.
Ответить