Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ? / 17 сообщений из 17, страница 1 из 1
12.04.2011, 10:29
    #37211291
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Добрый день.

Имеется функция. В ней из процедуры передаются некие параметры.
В другую процедуру получаю некие данные.
Вот эти данные нужно присвоить входным переменным функции.
Как это можно делать ? И возможно ли это ?
Очень надеюсь на Вашу помощь.

Спасибо.

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
Private Sub Command1_Click()
Dim a As String, b As String, c As String, d As String
a = "Janet "
b = "Erin "
c = "Carolyn "
d = "Kate "
cmdDo "test^test", a, b, c, d

'после выполнения, в переменные a,b,c,d должен получить 
'другие параметры (строки) из процедуры o_OnDataArrival
End Sub

Private Sub o_OnDataArrival(ByVal bytesTotal As Long)
On Error GoTo Error_Handler
Dim strChunk As String
On Error GoTo Error_Handler
o.GetData strChunk
rtb.Text = ""
    'if header hasn't arrived
    strHeader = strHeader & strChunk
    If InStr(strHeader, Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 )) Then
     rtb = strHeader
     strHeader = ""
     strChunk = ""
    End If

    ' Как переменным  v1 ,v2 ... v10 из функции
    ' присвоить то что получим здесь ?

Exit Sub
Error_Handler:
    strHeader = ""
    MsgBox ("Error: " & Err.Number & Err.Description)
End Sub


 Function cmdDo(Routine As String, Optional v1, Optional v2, Optional v3, _
                                   Optional v4, Optional v5, Optional v6, _
                                   Optional v7, Optional v8, Optional v9, Optional v10)
Dim par As Integer
Dim strLen1 As Long, strLen2 As Long, strLen3 As Long, strLen4 As Long, strLen5 As Long
Dim strLen6 As Long, strLen7 As Long, strLen8 As Long, strLen9 As Long, strLen10 As Long
Dim Str As Variant
Dim LenStr As Variant
Dim strSend As Variant
Dim strLenAll As Long
Dim strRes As Variant
    
par =  0 
strLenAll =  0 

If IsMissing(v1) = False Then
par = par +  1                            'Parameter
Str = Str & v1 & Chr( 13 ) & Chr( 10 )      'String
strLen1 = Len(v1)                       'Len string
strLenAll = strLenAll + Len(v1)         'All Len
Else
par = par
strLen1 =  0 
strLenAll = strLenAll
End If

If IsMissing(v2) = False Then
par = par +  1 
Str = Str & v2 & Chr( 13 ) & Chr( 10 )
strLen2 = Len(v2)
strLenAll = strLenAll + Len(v2)
Else
par = par
strLen2 =  0 
strLenAll = strLenAll
End If

If IsMissing(v3) = False Then
par = par +  1 
Str = Str & v3 & Chr( 13 ) & Chr( 10 )
strLen3 = Len(v3)
strLenAll = strLenAll + Len(v3)
Else
par = par
'Str = ""
strLen3 =  0 
strLenAll = strLenAll
End If

If IsMissing(v4) = False Then
par = par +  1 
Str = Str & v4 & Chr( 13 ) & Chr( 10 )
strLen4 = Len(v4)
strLenAll = strLenAll + Len(v4)
Else
par = par
strLen4 =  0 
strLenAll = strLenAll
End If

If IsMissing(v5) = False Then
par = par +  1 
Str = Str & v5 & Chr( 13 ) & Chr( 10 )
strLen5 = Len(v5)
strLenAll = strLenAll + Len(v5)
Else
par = par
strLen5 =  0 
strLenAll = strLenAll
End If

If IsMissing(v6) = False Then
par = par +  1 
Str = Str & v6 & Chr( 13 ) & Chr( 10 )
strLen6 = Len(v6)
strLenAll = strLenAll + Len(v6)
Else
par = par
strLen6 =  0 
strLenAll = strLenAll
End If

If IsMissing(v7) = False Then
par = par +  1 
Str = Str & v7 & Chr( 13 ) & Chr( 10 )
strLen7 = Len(v7)
strLenAll = strLenAll + Len(v7)
Else
par = par
strLen7 =  0 
strLenAll = strLenAll
End If

If IsMissing(v8) = False Then
par = par +  1 
Str = Str & v8 & Chr( 13 ) & Chr( 10 )
strLen8 = Len(v8)
strLenAll = strLenAll + Len(v8)
Else
par = par
'Str = ""
strLen8 =  0 
strLenAll = strLenAll
End If

If IsMissing(v9) = False Then
par = par +  1 
Str = Str & v9 & Chr( 13 ) & Chr( 10 )
strLen9 = Len(v9)
strLenAll = strLenAll + Len(v9)
Else
par = par
strLen9 =  0 
strLenAll = strLenAll
End If

If IsMissing(v10) = False Then
par = par +  1 
Str = Str & v10 & Chr( 13 ) & Chr( 10 )
strLen10 = Len(v10)
strLenAll = strLenAll + Len(v10)
Else
par = par
strLen10 =  0 
strLenAll = strLenAll
End If

strRes = "DO " & Routine & "~" & par & "~" & "Q" _
& "~" & strLenAll & "~" & strLen1 & "~" & strLen2 _
& "~" & strLen3 & "~" & strLen4 & "~" & strLen5 _
& "~" & strLen6 & "~" & strLen7 & "~" & strLen8 _
& "~" & strLen9 & "~" & strLen10 & vbCrLf & Str
o.SendData strRes

End Function
...
Рейтинг: 0 / 0
12.04.2011, 10:46
    #37211327
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Valeriuдолжен получить
другие параметры (строки) из процедуры o_OnDataArrival

При этом o_OnDataArrival нигде в коде не вызывается. Пока не вызывается - никак. Из o_OnDataArrival функция cmdDo тоже не вызывается. Логика работы вашей конструкции непонятна, поэтому упростите каждую процедуру до двух строк и скажите, что куда нужно передать.
...
Рейтинг: 0 / 0
12.04.2011, 10:55
    #37211336
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Valeriu,
сам-то понял, что хотел спросить?
1) чтобы вернуть из процедуры какие-либо значения - добавляешь ей параметов с методом передачи ByRef и передаешь в качестве параметров ссылки на переменные, которые хочется изменить в этой функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub Command1_Click()
Dim a As String, b As String, c As String, d As String
' ...
  Call o_OnDataArrival( 100500 , a, b, c, d)
' ...
End Sub

Private Sub o_OnDataArrival(ByVal bytesTotal As Long, a$, b$, c$, d$)

' ...
 a = "новое значение для a из процедуры Command1_Click()"
 b = "новое значение для b из процедуры Command1_Click()"
 c = "новое значение для c из процедуры Command1_Click()"
 d = "новое значение для d из процедуры Command1_Click()"

' ...
End Sub
2) ... даже не знаю как сформулировать. Вызывай свою функцию с теми значениями параметров, какие "надо присвоить переменным из функции"
...
Рейтинг: 0 / 0
12.04.2011, 11:23
    #37211423
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Конечно извините за каламбур.

1. Данные из команды Command1_Click() передаются в функцию cmdDo

2. Данные из функции передаются серверу через сокет

3. Полученные данные от сервера через сокет получаю в o_OnDataArrival
Здесь разбираю(буду разбирать по неким критериям) на 4 (четыре) переменных

4. Нужно чтобы в исходную команду Command1_Click() переменным (a,b,c,d) присвоить уже
данные, что получили от сервера, т.е. что разобрали в o_OnDataArrival

Примерно так хочется, что бы работала вся это кухня.
Это что-то на подобие ByRef, но только данные возвращаем из другой среды ...

Спасибо и извините если не правильно излагаю мысль.
...
Рейтинг: 0 / 0
12.04.2011, 11:38
    #37211473
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
1) Command1_Click закончит свою работу раньше, чем выполнится o_OnDataArrival, так что никак
2) Вынесите все содержимое из Command1_Click в отдельную функцию с необязательными параметрами и вызывайте эту функцию как из Command1_Click (с константными параметрами), так и из o_OnDataArrival (с нужными параметрами)
3) Промежуточные значения запоминайте в переменных или массиве, определенных на уровне модуля. Кстати, покурите ParamArray на досуге
...
Рейтинг: 0 / 0
12.04.2011, 12:03
    #37211556
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Shocker.Pro1) Command1_Click закончит свою работу раньше, чем выполнится o_OnDataArrival, так что никак
Или вы имеете ввиду при ПОВТОРНОМ вызове Command1_Click????
Тогда:
Код: 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.
Private a As String, b As String, c As String, d As String

Private Sub Form_Load()

a = "Janet "
b = "Erin "
c = "Carolyn "
d = "Kate "

End Sub

Private Sub Command1_Click()

cmdDo "test^test", a, b, c, d

'после выполнения, в переменные a,b,c,d должен получить 
'другие параметры (строки) из процедуры o_OnDataArrival
End Sub

Private Sub o_OnDataArrival(ByVal bytesTotal As Long)

...
a = "Что-то-другое "
b = "Что-то-другое "
c = "Что-то-другое "
d = "Что-то-другое "
...

End Sub
...
Рейтинг: 0 / 0
12.04.2011, 12:22
    #37211612
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Или вы имеете ввиду при ПОВТОРНОМ вызове Command1_Click

Хотелось конечно при одном вызове ...
...
Рейтинг: 0 / 0
12.04.2011, 12:32
    #37211637
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
ValeriuХотелось конечно при одном вызове ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Command1_Click()

cmdDo "test^test", a, b, c, d

Do Until некий_признак_того_что_o_OnDataArrival_отработал
  DoEvents
Loop

'в этом месте переменные a, b, c, d уже имеют новые значения

End Sub
Если я, конечно, правильно понял, что o_OnDataArrival срабатывает в ответ на СОБЫТИЕ, а не на что-то еще, иначе DoEvents не поможет
...
Рейтинг: 0 / 0
12.04.2011, 12:50
    #37211690
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Если я, конечно, правильно понял, что o_OnDataArrival срабатывает в ответ на СОБЫТИЕ, а не на что-то еще, иначе DoEvents не поможет

Я использую OSWINSCK.dll is a COM library for Visual Basic 6 ( http://www.ostrosoft.com/oswinsck.asp)

Events:
object.OnDataArrival(bytesTotal As Long)
new data arrived


Значит можно ?
...
Рейтинг: 0 / 0
12.04.2011, 13:08
    #37211725
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Если это написать в классе, кроме самой команды ?
Заработает или нет ?
Где-то встретил, что можно представить это как .dll
Честно говоря я с классами не очень работал ...
...
Рейтинг: 0 / 0
12.04.2011, 13:31
    #37211772
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Как Вы считаете, это правильно ?

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
'Option Explicit
Private strHeader As String
Private m_blnHeaderArrived As Boolean
Dim WithEvents o As OSWINSCK.Winsock
------
Private Sub Command1_Click()
Dim a As String, b As String, c As String, d As String
a = "Janet "
b = "Erin "
c = "Carolyn "
d = "Kate "
cmdDo "test^test", a, b, c, d
Do Until m_blnHeaderArrived
  DoEvents
Loop
a = "Что-то  "
b = "Что-то  "
c = "Что-то  "
d = "Что-то  "
MsgBox a & b & c & d
End Sub

Private Sub o_OnDataArrival(ByVal bytesTotal As Long)
On Error GoTo Error_Handler
Dim strChunk As String
m_blnHeaderArrived = False
o.GetData strChunk
rtb.Text = ""
    'if header hasn't arrived
    strHeader = strHeader & strChunk
    If InStr(strHeader, Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 )) Then
     rtb = strHeader
     strHeader = ""
     strChunk = ""
     m_blnHeaderArrived = True
    End If
   
Exit Sub
Error_Handler:
    strHeader = ""
    MsgBox ("Error: " & Err.Number & Err.Description)
End Sub
...
Рейтинг: 0 / 0
12.04.2011, 14:12
    #37211890
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
ValeriuКак Вы считаете, это правильно ?
не знаю, вы ж меняете показания.

Вам нужно было программировать a b с и d в o_OnDataArrival или в cmdDo, а вы опять запихали в Command1_Click

ну или тогда введите промежуточные переменные.
...
Рейтинг: 0 / 0
12.04.2011, 14:30
    #37211942
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Прошу прощения.
Вы правы, там и получить их в команде ...
А подход с Private m_blnHeaderArrived As Boolean правильный ?
Вроде реагирует на событие...
Сейчас попробую дальше двигаться.
...
Рейтинг: 0 / 0
12.04.2011, 14:58
    #37212045
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
ну или тогда введите промежуточные переменные

Вроде работает.

'
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Option Explicit

Private strHeader As String
Private m_blnHeaderArrived As Boolean
Private m_var1 As String
Private m_var2 As String
Private m_var3 As String
Private m_var4 As String
Dim WithEvents o As OSWINSCK.Winsock
---------------------

Private Sub o_OnDataArrival(ByVal bytesTotal As Long)
On Error GoTo Error_Handler
Dim strChunk As String
m_blnHeaderArrived = False
o.GetData strChunk
rtb.Text = ""
    'if header hasn't arrived
    strHeader = strHeader & strChunk
    If InStr(strHeader, Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 )) Then
     rtb = strHeader
     strHeader = ""
     strChunk = ""
     m_blnHeaderArrived = True
    End If
   m_var1 = "Din o_OnDataArrival var1"
   m_var2 = "Din o_OnDataArrival var2"
   m_var3 = "Din o_OnDataArrival var3"
   m_var4 = "Din o_OnDataArrival var4"
Exit Sub
Error_Handler:
    strHeader = ""
    MsgBox ("Error: " & Err.Number & Err.Description)
End Sub


Function cmdDo(Routine As String, Optional v1, Optional v2, Optional v3, _
                                   Optional v4, Optional v5, Optional v6, _
                                   Optional v7, Optional v8, Optional v9, Optional v10)
................................

strRes = "DO " & Routine & "~" & par & "~" & "Q" _
& "~" & strLenAll & "~" & strLen1 & "~" & strLen2 _
& "~" & strLen3 & "~" & strLen4 & "~" & strLen5 _
& "~" & strLen6 & "~" & strLen7 & "~" & strLen8 _
& "~" & strLen9 & "~" & strLen10 & vbCrLf & Str
o.SendData strRes

Do Until m_blnHeaderArrived
  DoEvents
Loop
' Call and recive data on o_OnDataArrival
v1 = m_var1
v2 = m_var2
v3 = m_var3
v4 = m_var4
m_blnHeaderArrived = False
 m_var1 = ""
 m_var2 = ""
 m_var3 = ""
 m_var4 = ""

End Function
...
Рейтинг: 0 / 0
12.04.2011, 15:04
    #37212067
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
To Shocker.Pro

Спасибо.

PS. Все таки написать это в класс что-то получится ?
...
Рейтинг: 0 / 0
12.04.2011, 19:02
    #37212785
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
ValeriuPS. Все таки написать это в класс что-то получится ?
что вызывает сомнения?
...
Рейтинг: 0 / 0
13.04.2011, 08:50
    #37213348
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ?
Спасибо, будем пробовать.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как можно получить обратно в функцию параметры отличные от тех, что передали в ней ? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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