Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Форма, поле и вопрос
 
 автор: час   (31.10.2008 в 14:57)   личное сообщение
 
 

На всех формах (почти) имеется поле - 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
поле скорее всего не активно...
Ды точно не активно, с чего ж ему активным быть.

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:09)   личное сообщение
 
 

А не проще передавать в функцию аргументами имя формы и имя контрола, дабы использовать затем для задания значения полю конструкцию:

Forms(strFormName).Controls(strFieldName).Value = Mesages_String 

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:12)   личное сообщение
 
 

Или сразу в форме присваивать значение функции:

Me![MSG]=Mesages(Soo)

  Ответить  
 
 автор: час   (31.10.2008 в 15:14)   личное сообщение
 
 

проще,
но в эту функцу из всех уголков попадаем
и какая сейчас активна - точно не знаем.
Вот башку и ломаем

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

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:18)   личное сообщение
 
 

А нам по барабану которая форма активна.
В первом примере мы жестко прописываем куда вернуть (правда если форма открыта не экземпляром класса), а во втором вообще без вариантов, только туда, откуда вызвали.
Только из функции все лишнее надо выкинуть, оставить только текстовый функционал.
[code][
Function Mesages(Soo As String) As String
Mesages_String = Soo & "..." & Mesages_String
Mesages = Mesages_String
End Function
/code]

  Ответить  
 
 автор: час   (31.10.2008 в 15:22)   личное сообщение
 
 

Вам хорошо..........
Вам по барабану........
А мне ниже барабана - мне по я..... не буду говорить

  Ответить  
 
 автор: час   (31.10.2008 в 15:24)   личное сообщение
 
 

Тогда получается

Forms(Screen.ActiveForm.Name).Controls("MSG").Value = Mesages_String

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:30)   личное сообщение
 
 

Зачем вообще Screen.ActiveForm?
Первый пример- имя формы и имя контрола переданы.
Второй пример - Присваиваем значение непосредственно контролу, вызывая функцию из модуля формы, следовательно активна именно эта форма в настоящий момент.

  Ответить  
 
 автор: час   (31.10.2008 в 15:36)   личное сообщение
 
 

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

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:43)   личное сообщение
 
 

При использовании Screen.ActiveForm можно наступить на грабли, причем не сразу, дома во время отладки, а у пользователя в процессе работы или на "сдаче" заказа у Заказчика.
Тогда уж надо организовать "жесткую" проверку на активную форму, а не просто пытаться присвоить на авось.

  Ответить  
 
 автор: Lukas   (31.10.2008 в 15:50)   личное сообщение
 
 

А вообще надо бы хорошо подумать, мне кажется что-то неправильно в самой конструкции.
Как показала практика, если что-то не идет, значит нужно это объехать.

  Ответить  
 
 автор: час   (31.10.2008 в 15:58)   личное сообщение
 
 

не шло то, что я не знал как..........
А ВЫ_ты мне подскаазаллиии.
За что Вам спасибо !!!!!
А я ещё помурыжу ето всё - посмотрб как часто будет получаться
на всяк случай On Error Resume Next

  Ответить  
 
 автор: час   (31.10.2008 в 15:58)   личное сообщение
 
 

Итого выходит - так

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

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList