|
|
|
| Есть процедура
Public Sub ClickMinus(LabelToner As String, TonerCount As String)
TonerCount = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"))
End Sub
Вызов с параметрами
Call ClickMinus(Me.Надпись7.Caption, Me.Надпись8.Caption)
Естественно Caption объекта надпись,не меняется,я передаю как то не так параметры,что сделать можно чтобы caption могло изменяться внутри процедуры
Заранее спасибо | |
|
| |
|
|
|
| как вообще количество может быть NULL?
NZ в запросе тут не нужен, нужно переделать или запрос- источник либо схему БД | |
|
| |
|
|
|
| Это на всякий случай,привык просто так делать.
Так не меняется надпись,когда идёт присвоение ей значения,если передавать параметры так...причем здесь схема БД | |
|
| |
|
|
|
|
| Логику я всю убрал,оставив строку которая у меня не работала,так как ты предложил,это то что мне надо!!!Спасибо | |
|
| |
|
|
|
| В начале хочется озвучить процедуры передачи переменных в функцию.
Можно передавать БЕЗ возможности изменения, можно С.
Соотв здесь Первый и Второй пример. Не важно, процедура (Sub) или функция (Function) у нас.
Важно то, что не получится изменить св-ва элемента из такой ф-ции, но можно переменную, а результат потом присвоить уже.
ByRef (By Reference -- Как ссылка) - позволяет изменять значение передаваемого параметра (т.н. передача по ссылке (ссылка на область памяти, где лежит передаваемое значение. Меняя это значение- изменится и оригинал)),
ByVal (By Value -- Как значение) - запрещает такое изменение (т.н. передача по значению (передача копии значения, которое может меняться как угодно без влияния на оригинал)).
По-умолчанию, вроде, ByVal, но я сталкивался с тем, что не всегда! Лучше конкретно указывать. Я зачастую работаю с такими переменными (меняю их св-ва по ходу отработки ф-ции, в итоге под конец ф-ции вообще возможно Empty) , вместо того что бы создавать к-нить новую. И если не указать ByVal, то значение в вызывающей ф-ции можно нечаянно изменить, что не есть гутт.
Пример1 (меняем параметр):
Option Explicit
Private Sub MySub1(ByRef sVal1 As String, Optional ByVal sVal2 As String)
If sVal2 <> "" Then sVal1 = sVal2
End Sub
Private Sub Command1_Click()
Dim i As String
i = Me.Caption
Call MySub1(i, "asd")
Me.Caption = i
End Sub
|
Пример2 (запрещаем к изменению параметр):
т.е. его в ф-ции МОЖНО менять (он НЕ ReadOnly), но возвращаться будет не измененное значение!
Option Explicit
Private Sub MySub1(ByVal sVal1 As String, Optional ByVal sVal2 As String)
If sVal2 <> "" Then sVal1 = sVal2
End Sub
Private Sub Command1_Click()
Dim i As String
i = Me.Caption
Call MySub1(i, "asd")
Me.Caption = i
End Sub
|
Применительно к Вашей ф-ции:
Если нужно изменить продпись TonerCount, то ОСТАВЛЯЕМ все как Вы написали, но меняем через переменную (либо передаем для изменения сам объект, как указано выше. Однако данный способ я не использую по собственному разумению: если у передаваемого объекта с к-либо свойством будут нелады (типичный пример- картинка- файл картинки недоступен (был на изъятой флэшке/ cd)),, то при передаче такого объекта- возможна ошибка. При задании же конкретного св-ва ошибку, возможно, обойдем, т.к. не затрагиваем объект целиком со всеми его св-вами):
Оставляем:
Public Sub ClickMinus(LabelToner As String, ByRef TonerCount As String)
TonerCount = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"))
End Sub
|
дописав возврат значений ИЗМЕНЯЕМОГО параметра (ByRef вставил).
Вызов осуществляем несколько по-иному:
dim MeНадпись8Caption as string
MeНадпись8Caption = Me.Надпись8.Caption
Call ClickMinus(Me.Надпись7.Caption, MeНадпись8Caption)
Me.Надпись8.Caption = MeНадпись8Caption
|
Таким образом мы решили поставленную задачку с учетом ее условия
Ошибка была в а) передаче эл-та для изменения, б) в неявном определении типа переменной (изменяемая/ нет) в вызываемой ф-ции.
p.s. надеюсь, не совсем мутно объяснил- старался как можно по-подробнее :)
pp.s. ну и ессно, работающий в настоящий вариант, каким бы он ни был, тоже имеет право на существование | |
|
| |