|
|
|
| В форме при обновлении поля, одного из однотипных полей, необходимо выполнить процедуру. Как это сделать? | |
|
| |
|
|
|
|
Private Sub MyField_AfterUpdate()
...
End Sub
|
| |
|
| |
|
|
|
| Несколько однотипных полей, нужно определить что обновление произошло в каком-то из этих полей и выполнить процедуру. Так придется писать процедуры на обновление во всех полях нужного типа. | |
|
| |
|
|
|
| Тогда придёится писать для каждого поля | |
|
| |
|
|
|
| Надеюсь сущесвует програмный способ! | |
|
| |
|
|
|
| Как вариант можно еще написть одну процедуру MySub
и для каждого поля афтер апдейт писать
Call MySub | |
|
| |
|
|
|
|
| Да имеются еще группы, на обновление которых нужно выполнять другую процедуру.
Поля названы так, что можно определить к какой группе они относятся. Поэтому достаточно выяснить имя обновляемого поля. | |
|
| |
|
|
|
| Сама процедура не такая большая, а вот полей около 20.
Нарерное как-то можно сделать с перехватом клавиш. | |
|
| |
|
|
|
| Второй вариант
http://hiprog.com/index.php?option=com_content&task=view&id=251661594&Itemid=35
Одна процедурка - много полей..... | |
|
| |
|
|
|
| Не все понятно, для моего случая много лишнего.
Вот если-бы увидеть как работает изменение поля0 изменяя значения поля2!
Спасибо! | |
|
| |
|
|
|
| Если назвать элементы управления, участвующие в расчетах типа "fld1", "fld2", "fld..", "fld20", то на загрузке формы им можно прописать:
For i=1 To 20
Me.Controls("fld" & i).OnChange="=Calc()" 'Здесь имя процедуры расчета
Next i
|
или лучше на .OnLostFocus ? | |
|
| |
|
|
|
| Где-то ошибка:
Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"
Процедура heightUp присваивает некое среднее полю lh1при изменении одного из полей (в данном случае lh11, :
Forms!Test.Controls("lh1") = (h1 + h2 + 0.49) / 2
Что не правильно? | |
|
| |
|
|
|
| >Что неправильно?
По крайней мере то, как вы используете кавычки. Если вы хотите добавить символ кавычек в строку, то его надо удваивать. | |
|
| |
|
|
|
| 1 Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"
подчеркивает то, в ковычках Controls("lh11"), ...
Пришлось для параметров ввести переменные, 1 прошло, но всетаки не понию ошибки
Про ковычки не понял, в Me.Controls("lh11").OnChange не ругается, а heightUp(Me.Controls("lh11"), ... в выделяет?
2 На событие обновление не находит функцию (не пишет какую) | |
|
| |
|
13 Кб. |
|
| Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"
1. Ругается на те кавычки, которые в жирном.
2. Зачем передавать аргументы функции heightUp, она у Вас что, во внешнем модуле?
Если в модуле формы, то их можно получить в самой функции.
Пример в прицепе. | |
|
| |
|
|
|
| Да на те которые жирным.
М.б. проблеме в том, что нужно не вычислить функцию, а присвоить 3 полю значение по изменению значений в одном из двух. Поэтому процедуре нужно передать значения полей и имя поля которому нужно присвоить значение. | |
|
| |
|
|
|
| проблеме в том, что нужно не вычислить функцию, а присвоить 3 полю значение по изменению значений в одном из двух. Поэтому процедуре нужно передать значения полей и имя поля которому нужно присвоить значение.
Все это можно делать в самой функции, смотри прицеп предыдущего поста. | |
|
| |
|
|
|
| Уточнение.
В функции необходимо передавать параметры для определения какое поле нужно изменить и какие поля в этом учавствуют. Попробовал изменить ваш пример, появилась ошибка.
Изменения:
Public Function funCalc(i,j m As Integer)
Me.Controls("lh" & i) = (Me.Controls("lh" & i &"1") + Me.Controls("lh" & i & "2") + m) / 2
End Function
Private Sub Form_Load()
Dim i, j As Integer
For j = 1 To 3
For i = 1 To 2
Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)"
Next i
Next j
End Sub | |
|
| |
|
|
|
| Из того, что я предлагал выше взята суть обращения к одной функции - всеми полями.
Минимум кода.
Может посмотрите это-
http://hiprog.com/index.php?option=com_content&task=view&id=251661600&Itemid=35
У Вас получиться в форме:
Private Sub Form_Current()
Call Effect(Me)
End Sub
| Вот и весь код.
и модуль, вынесеный с одной процедуркой.
Public Function Effect(frm As Form)
Dim ctl As Control
On Error Resume Next ' Если вдруг ошибка - идём дальше
For Each ctl In frm.Controls ' бегаем по всем элементам управления формы
If ctl.ControlType = acTextBox Then ' Если находим поле
ctl.OnEnter = "=SetName(" & ctl.NAME & ")" '
End If
Next
End Function
|
| |
|
| |
|
|
|
| Но в Вашем случае , как и говорил выше Lukas
проблеме в том, что нужно не вычислить функцию, а присвоить 3 полю значение по изменению значений в одном из двух. Поэтому процедуре нужно передать значения полей и имя поля которому нужно присвоить значение. | |
|
| |
|
|
|
| Так может запускать процедуру, а не вычислять функцию.
Только процедере нужно передать несколько параметров и проблема решится.
Пример Lukas для функции нужно дополнить передачей параметров. | |
|
| |
|
|
|
| Зачем передавать аргументы функции. Все ссылки на значения контролов можно поиметь в самой функции. Например:
Поле3=Поле1+Поле2
Поле5=Поле3/Поле4
Поле7=(Поле1+Поле6)*Поле6
Только циклических ссылок не надо допустить.
Пусть функция считает полный расчет, при изменении любого поля. Меньше будет ошибок.
если есть нелинейность расчетов, используем Select Case, If Then и др. | |
|
| |
|
|
|
| Продолжение. Вопрос для Lukasd!
.onExit = true вызывает ошибку, так пытался определить имя поля которое теряет фокус.
Как правильно это сделать | |
|
| |
|
|
|
| А это что за ...:
.onExit = true
Зачем определять поле, которое потеряло фокус? Спрашиваю не в первый раз.
Если расчет в функции полный, на...ь какое поле теряет фокус. Тупо пересчитываем все подряд.
Единственно, можно добавить условие проверки, что бы функция не считала при перемещении по контролам без изменений данных в них:
If Me.Dirty Then
считаем
Me.Dirty=False
End If | |
|
| |
|
|
|
| Я уже несколько раз в обсуждении пытался обьяснить (м.б. не очень правильно).
В зависимости от того какое поле обновляется:
1. разные вычисления (в вычислении принимают участие разные поля)
2. результат вычисления присваивается разным полям
Осталось в функции определить имя обновляемого поля или передать его в фкнкцию.
На основе ваших примеров пытаюсь это сделать, пока безрезультатно.
В примере LBLastBTM понимаю, что где-то имя поля получающего фокус есть, но не понимаю как его вытащить. | |
|
| |
|
|
|
| 1. разные вычисления (в вычислении принимают участие разные поля)
2. результат вычисления присваивается разным полям
В моем посте (14:05) тоже производятся разные вычисления, и результаты присваиваются разным полям. В чем загвоздка?
Screen.ActiveControl.Name - имя контрола, имеющего фокус. | |
|
| |
|
|
|
| Все зависит от того какое поле обновляется, а вашем примере обновляемое поле принимает пассивное участие и не определяет как считать и какому полю присвоить! | |
|
| |
|
|
|
| ...поле принимает пассивное участие и не определяет как считать и какому полю присвоить...
Так поле и не должно по определению этим заниматься.
Как считать и какому полю присваивать значение определяет программист в коде в соответствии с методологией расчета. | |
|
| |
|
|
|
| Вот мне и надо запрограмировать в зависимости от имени поля которое обновляется.
Такова задача и алгоритм.
Вот поэтому при выполнении функции нужно знать какое поле обновляется. | |
|
| |
|
|
|
|
For i=1 To 20
Me.Controls("fld" & i).OnLostFocus="=Calc(" & i & ")"
Next i
|
Вот Вам параметр в функцию калькуляции. | |
|
| |
|
|
|
| Lukas спасибо за терпение!
Me.Controls("fld" & i).OnLostFocus="=Calc(" & i & ")"
Оказывается справа просто конконтенация, только сейчас на это обратил внимание, из-за этого большинство ошибок которые я наделал.
Параметром передаю Index обновляемого поля. Надеюсь дальше проблем не будет. | |
|
| |
|
|
|
| Знает ли функция какое обновляемое поле ее запустило.
Если в функции это можно определить, параметры передавать не надо.
Для моей задачи этого будет достаточно. Имя обновляемого поля все определяет! | |
|
| |
|
|
|
| Кстати называйте как хотите функция или прцедура и та и другая может вернуть результат вычисления. Давайте назовём её функция, тогда в функцию передаём через запятую - все необходимые данные(параметры)
Имя обновляемого поля можно передать двумя способами
В функцию вот так:
Public Function Моя_Функция (Имя_поля, Имя_формы, Чё_Делать)
где Имя_поля - Имя обновляемого поля
end Function
или короче
Public Function Моя_Функция (Имя_поля,)
где Имя_поля - Имя обновляемого поля
Msgbox "Так вот ты какое поле " & Имя_поля
end Function
А в процедуру
Public Имя_Передаваемого_поля AS string
Имя_Передаваемого_поля = Имя_поля
Public sub Чё_делать ()
получили переменную
Имя_Передаваемого_поля
end sub | |
|
| |
|
|
|
| Я же выше приводил код Lukas (пример) в который пытался добавить параметры, появляется ошибка. Ответ от 09:47. Так, что там я сделал не так? | |
|
| |
|
70 Кб. |
|
| Сообщение об ошибке в файле. | |
|
| |
|
|
|
| Эт надо точку останова на Load поставить и пройтись в обработчике ошибок смотря где там Empty
или ещё чего | |
|
| |
|
|
|
| Сэтой ошибкой справился.
Теперь к основному вопросу: как передать правильно параметр или функция знает какое поле (имя) ее запустило и в ней это можно вытащить.
Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)" так не работает! | |
|
| |
|
|
|
| Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)"
Me.Controls("lh" & j & i).OnLostFocus =funCalc(j,i)
Кстати называйте как хотите функция или прцедура и та и другая может вернуть результат вычисления. Давайте назовём её функция, тогда в функцию передаём через запятую - все необходимые данные(параметры)
Имя обновляемого поля можно передать двумя способами
В функцию вот так:
Public Function Моя_Функция (Имя_поля, Имя_формы, Чё_Делать)
где Имя_поля - Имя обновляемого поля
end Function
или короче
Public Function Моя_Функция (Имя_поля,)
где Имя_поля - Имя обновляемого поля
Msgbox "Так вот ты какое поле " & Имя_поля
end Function
А в процедуру
Public Имя_Передаваемого_поля AS string
Имя_Передаваемого_поля = Имя_поля
Public sub Чё_делать ()
получили переменную
Имя_Передаваемого_поля
end sub
есть ещё способ:
КокоеПоле=Screen.activeControl
КакаяФорма=Screen.activeForm
(Возможно я написал с синтаксической ошибкой) | |
|
| |