powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поместить код функции в процедуре
9 сообщений из 9, страница 1 из 1
Поместить код функции в процедуре
    #33702123
Новатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как начинающий, вопрос может быть из ряда тупых, так что лучше сядьте :

из процедуры вызываю свою функцию

авторSub New_InC ()
...
...
GET_ID_FROM_NAME (фргументи)
...
...
в функции
Код: plaintext
GET_ID_FROM_NAME
происходят определенные действия, и если в функции все прошло нормально
Код: plaintext
GET_ID_FROM_NAME
возвращает
Код: plaintext
True
в противном случае
Код: plaintext
False
.

и в процедуре, сразу после вызова функции, проверяется:
Код: plaintext
If GET_ID_FROM_NAME = False
Then GOTO “место в этой же процедуре”

таких точек в этой процедуре много (невозможно действия поставить в цикл).
Так вот существует или нет в VB возможность, поместить код этой функции в этой процедуре (ясно, она уже не будет называться функцией), чтобы не проверять каждый раз
Код: plaintext
GET_ID_FROM_NAME = False
а прямо из кода если что-то не так прямо перейти в то самое “место в этой же процедуре”. Тем более что эту функцию в других процедурах не использую.
Т.е. Можно или нет организовать из процедуры: вызвать место в этой же процедуре с последующим возвратом в точку вызова.
Спасибо заранее!
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33702265
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новатор, схожую с требуемой функциональность можно получить, используя полиморфизм.
Пусть есть абстрактный класс IMyMethod:
Код: plaintext
1.
2.
3.
Public Sub Invoke()
 'Т.к. класс абстрактный, тело метода пустое
End Sub
Пусть есть три класса, реализующие интерфейс IMyMethod -
класс CMyMethod1:
Код: plaintext
1.
2.
3.
4.
Implements IMyMethod
Private Sub IMyMethod_Invoke()
 Debug.Print "MyMethod1"
End Sub
класс CMyMethod2:
Код: plaintext
1.
2.
3.
4.
Implements IMyMethod
Private Sub IMyMethod_Invoke()
 Debug.Print "MyMethod2"
End Sub
класс CMyMethod3:
Код: plaintext
1.
2.
3.
4.
Implements IMyMethod
Private Sub IMyMethod_Invoke()
 Debug.Print "MyMethod3"
End Sub
Для тестирования создадим форму, на ней тестовое поле и кнопку. Модуль формы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Dim mm( 1  To  3 ) As IMyMethod

Private Function GET_ID_FROM_NAME(ByVal nMyMethod As Integer) As Boolean
 GET_ID_FROM_NAME = (nMyMethod >= LBound(mm)) And (nMyMethod <= UBound(mm))
End Function

Private Sub Command1_Click()
 Dim nMyMethod As Integer
 On Error Resume Next
 nMyMethod = CInt(Text1.Text)
 On Error GoTo  0 
 If GET_ID_FROM_NAME(nMyMethod) Then
    mm(nMyMethod).Invoke
 Else
    Debug.Print "Неверный номер метода"
 End If
End Sub

Private Sub Form_Load()
 Set mm( 1 ) = New CMyMethod1
 Set mm( 2 ) = New CMyMethod2
 Set mm( 3 ) = New CMyMethod3
End Sub
Запускаем, вводим номер метода от 1 до 3 в поле, нажимаем кнопку, и видим в окне отладки результат.
Надеюсь, идея ясна. Но не факт, что быстрее будет работать, чем Select Case.
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33702280
Nikz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может что то в этом роде.
В конце процедуры делаем проверку значения, которое она могла бы вернуть, и если оно не то которое нужно, выполняем действия еще раз...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub GET_ID_FROM_NAME(strName As String)

Dim b As Boolean

METKA:

If Len(strName) =  0  Then
    b = True
Else
    strName = Left(strName, Len(strName) -  1 )
End If

If Not b Then GoTo METKA

End Sub

Private Sub Command1_Click()
    GET_ID_FROM_NAME "asdasd"
End Sub
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33702355
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новаториз процедуры вызываю свою функцию

авторSub New_InC ()
...
...
GET_ID_FROM_NAME (фргументи)
...
...
в функции
Код: plaintext
GET_ID_FROM_NAME
происходят определенные действия, и если в функции все прошло нормально
Код: plaintext
GET_ID_FROM_NAME
возвращает
Код: plaintext
True
в противном случае
Код: plaintext
False
.

и в процедуре, сразу после вызова функции, проверяется:
Код: plaintext
If GET_ID_FROM_NAME = False
Then GOTO “место в этой же процедуре”
Если я правильно понял, то нахрена эту функцию вызывать 2 раза? Достаточно 1 раз.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub New_InC () 
...
...
If GET_ID_FROM_NAME Then
    ...
Else
    ...
End If
...
...[/quot]

Новатортаких точек в этой процедуре много (невозможно действия поставить в цикл).
Опять не пойму. Зачем несколько раз в одной процедуре вызывать одну и туже функцию? Одного раза недостаточно? Или вы не знаете про оператор Else?
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33702519
Новатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока читал первые два ответа, еще сомневался, но когда третий и в ту же сторону понял, что наверно, неправильно поставил вопрос.

Пример:

Sub New_InC ()

r.Fields("[SOURCE]") = GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex(8, i) & "' and Left(ID,3)='par'")
If Trim(r.Fields("[SOURCE]")) = "False" Then GoTo Loop1:

r.Fields("[valuta]") = GET_ID_FROM_NAME("SELECT ID FROM curs WHERE name = '" & Arre_Flex(9, i) & "' and current = True")
If Trim(r.Fields("[valuta]")) = "False" Then GoTo Loop1:

r.Fields("[valuta (Zir)]") = GET_ID_FROM_NAME("SELECT ID FROM curs WHERE name = '" & Arre_Flex(13, i) & "' and home = True")
If Trim(r.Fields("[valuta (Zir)]")) = "False" Then GoTo Loop1:

r.Fields("[Group]") = GET_ID_FROM_NAME("SELECT ID FROM accessories WHERE name = '" & Arre_Flex(14, i) & "' and owner= 'Groups'")
If Trim(r.Fields("[Group]")) = "False" Then GoTo Loop1:

r.Fields("[qveGroup]") = GET_ID_FROM_NAME("SELECT ID FROM accessories WHERE name = '" & Arre_Flex(15, i) & "' and owner= 'SubGroups'")
If Trim(r.Fields("[qveGroup]")) = "False" Then GoTo Loop1:

r.Fields("[Amnt]") = GET_ID_FROM_NAME("SELECT ID FROM accessories WHERE name = '" & Arre_Flex(22, i) & "' and owner= 'Amnt'")
If Trim(r.Fields("[Amnt]")) = "False" Then GoTo Loop1:

r.Fields("[mimRebi]") = GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex(23, i) & "' and Left(ID,3)='obi'")
If Trim(r.Fields("[mimRebi]")) = "False" Then GoTo Loop1:

r.Fields("[Autor]") = GET_ID_FROM_NAME("SELECT ID FROM person WHERE name = '" & Arre_Flex(24, i) & "'")
If Trim(r.Fields("[Autor]")) = "False" Then GoTo Loop1:

r.Fields("[Producer]") = GET_ID_FROM_NAME("SELECT ID FROM producer WHERE name = '" & Arre_Flex(25, i) & "'")
If Trim(r.Fields("[Producer]")) = "False" Then GoTo Loop1:

r.Fields("[Color]") = GET_ID_FROM_NAME("SELECT ID FROM accessories WHERE name = '" & Arre_Flex(31, i) & "' and owner= 'Color'")
If Trim(r.Fields("[Color]")) = "False" Then GoTo Loop1:

и т.д.

...
...
End Sub

Private Function GET_ID_FROM_NAME(Query_String As String) As Boolean
Dim db As DAO.Database, rID As DAO.Recordset
Set rID = db.OpenRecordset(Query_String)
If rID.RecordCount <> 1 Then
MsgBox "Error in Table! We have " & rID.RecordCount & " records " & Chr(13) & "It is dangerous mistake. Please, ask your Administrator for this error!!"
GET_ID_FROM_NAME = False : rID.Close: Set rID = Nothing: Exit Function
End If

taram.. taram...
...
...

GET_ID_FROM_NAME = rID.Fields(0)
rID.Close: Set rID = Nothing
End Function

Второе разместить в теле первого, чтоби в первом не делать дополнительние проверки
Код: plaintext
If ... = "False" Then GoTo Loop1:
Возможно?
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33703586
Nikz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Sub New_InC()

If Not GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex( 8 , i) & "' and Left(ID,3)='par'", r.Fields("[SOURCE]")) Then GoTo Loop1
'r.Fields("[SOURCE]") = GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex(8, i) & "' and Left(ID,3)='par'")
'If Trim(r.Fields("[SOURCE]")) = "False" Then GoTo Loop1:

'...
'...

End Sub

Private Function GET_ID_FROM_NAME(Query_String As String, ByRef rField As DAO.Field) As Boolean
Dim db As DAO.Database, rID As DAO.Recordset
Set rID = db.OpenRecordset(Query_String)
If rID.RecordCount <>  1  Then
MsgBox "Error in Table! We have " & rID.RecordCount & " records " & Chr( 13 ) & "It is dangerous mistake. Please, ask your Administrator for this error!!"
GET_ID_FROM_NAME = False: rField = "False": rID.Close: Set rID = Nothing: Exit Function
End If

'taram.. taram...
'...
'...

rField = rID.Fields( 0 )
GET_ID_FROM_NAME = rID.Fields( 0 )
rID.Close: Set rID = Nothing
End Function


что здесь происходит
вызывается функция GET_ID_FROM_NAME
в нее передается по ссылке нужное поле
функция записывает свой результат в это поле
если функция возвращает false тогда идем в Loop1
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33703692
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Для чего такая сложная конструкция, если функция GET_ID_FROM_NAME возращает логическое значение? Нафига Trim?
Код: plaintext
1.
r.Fields("[SOURCE]") = GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex( 8 , i) & "' and Left(ID,3)='par'")
If Trim(r.Fields("[SOURCE]")) = "False" Then GoTo Loop1:

Не проще ли будет так?
Код: plaintext
If Not GET_ID_FROM_NAME("SELECT ID FROM OBJ WHERE name = '" & Arre_Flex( 8 , i) & "' and Left(ID,3)='par'") Then GoTo Loop1:

2. Чтобы не делать кучу сравнений в процедуре, наверное, нужно так сделать. Здесь же или ранее надо подключаться к БД. А рекордсеты открывать и закрывать функцией, как у вас и сделано.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub New_InC ()
    If Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") Or _
       Not GET_ID_FROM_NAME("SELECT ...") _
    Then GoTo Loop1:
    ...
End Sub

Поправьте меня спецы, если я не прав.

...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33704475
Новатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон,
Код: plaintext
GET_ID_FROM_NAME
не возвращает логическое значение, ошибся при переносе с реального кода в форум.
Код: plaintext
GET_ID_FROM_NAME 
возвращает String, но когда ошибка в функции, возвращает строку - “False”.
...
Рейтинг: 0 / 0
Поместить код функции в процедуре
    #33704537
Новатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного пояснении, в добавок:

эта функция переводит имя, находящееся в определенных ячейках FlexGrid-а (который “Bounded” на массив Arre_Flex), в соответствующие ID, из соответствующих таблиц.
В этих таблицах разрешается повторение имен (но не ID), Но если имя повторяется, обработка ситуации происходит по другому сценарию, код которого как раз находится в Loop1:
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поместить код функции в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]