|
|
|
| На всех формах (почти) имеется поле - MSG
Все сообщения (Soo As String) коои выдаёт программа вначале попадают в функцию
Function Mesages(Soo As String) As String
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
Dim frmCurrentForm As Form
Set frmCurrentForm = Screen.ActiveForm
frmCurrentForm.Name
'!MSG = Mesages_String
End Function
|
как это сообщение передать в этой функции в активную форму и в её поле MSG
поле скорее всего не активно...
Ды точно не активно, с чего ж ему активным быть. | |
|
| |
|
|
|
| А не проще передавать в функцию аргументами имя формы и имя контрола, дабы использовать затем для задания значения полю конструкцию:
Forms(strFormName).Controls(strFieldName).Value = Mesages_String
|
| |
|
| |
|
|
|
| Или сразу в форме присваивать значение функции:
| |
|
| |
|
|
|
| проще,
но в эту функцу из всех уголков попадаем
и какая сейчас активна - точно не знаем.
Вот башку и ломаем
Function Mesages(Soo As String) As String
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
Dim frmCurrentForm As Form
Dim nCnt As Long
Set frmCurrentForm = Screen.ActiveForm
For nCnt = 1 To Screen.ActiveForm.ControlCount
If Screen.ActiveForm.Controls(nCnt).Name = "MSG" Then
Screen.ActiveForm.Controls(nCnt).Value = Mesages_String
End If
Next nCnt | |
|
| |
|
|
|
| А нам по барабану которая форма активна.
В первом примере мы жестко прописываем куда вернуть (правда если форма открыта не экземпляром класса), а во втором вообще без вариантов, только туда, откуда вызвали.
Только из функции все лишнее надо выкинуть, оставить только текстовый функционал.
[code][
Function Mesages(Soo As String) As String
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
End Function
/code] | |
|
| |
|
|
|
| Вам хорошо..........
Вам по барабану........
А мне ниже барабана - мне по я..... не буду говорить | |
|
| |
|
|
|
| Тогда получается
Forms(Screen.ActiveForm.Name).Controls("MSG").Value = Mesages_String | |
|
| |
|
|
|
| Зачем вообще Screen.ActiveForm?
Первый пример- имя формы и имя контрола переданы.
Второй пример - Присваиваем значение непосредственно контролу, вызывая функцию из модуля формы, следовательно активна именно эта форма в настоящий момент. | |
|
| |
|
|
|
| Lukas......
Ну не из модуля формы........
-вызываем откуа придётся из подпрограмм из д\функций модуей из .....
При открытии формы - это однозначно, но в процессе работы........
Хотя конечно тебе видее - мне мож чё не догнать ....
Function Mesages(Soo As String) As String
On Error Resume Next
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
Dim frmCurrentForm As Form
Set frmCurrentForm = Screen.ActiveForm
Forms(frmCurrentForm.Name).Controls("MSG").Value = Mesages_String
End Function
|
| |
|
| |
|
|
|
| При использовании Screen.ActiveForm можно наступить на грабли, причем не сразу, дома во время отладки, а у пользователя в процессе работы или на "сдаче" заказа у Заказчика.
Тогда уж надо организовать "жесткую" проверку на активную форму, а не просто пытаться присвоить на авось. | |
|
| |
|
|
|
| А вообще надо бы хорошо подумать, мне кажется что-то неправильно в самой конструкции.
Как показала практика, если что-то не идет, значит нужно это объехать. | |
|
| |
|
|
|
| не шло то, что я не знал как..........
А ВЫ_ты мне подскаазаллиии.
За что Вам спасибо !!!!!
А я ещё помурыжу ето всё - посмотрб как часто будет получаться
на всяк случай On Error Resume Next | |
|
| |
|
|
|
| Итого выходит - так
Function Mesages(Soo As String) As String
Dim frmCurrentForm As Form
On Error Resume Next
If Len(Mesages_String & Soo) > 255 Then Mesages_String = Left(Mesages_String, 255 - Len(Soo) - 10)
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
Set frmCurrentForm = Screen.ActiveForm
Forms(frmCurrentForm.Name).Controls("MSG").Value = Mesages_String
End Function
|
| |
|
| |