Передача значения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Передача значения

Сообщение Sirik » 18.02.2005 (Пт) 13:08

Допусти есть некая функция или процедура в классе, по времени довольно продолжительная.
Во-время исполнения которой надо узнать на каком проценте исполнения она находятся.
Как это можно сделать более красиво?

ЗЫ1. Можно через свойство класса, но прийдётся поставить таймер на главной форме, что не есть хорошо.
ЗЫ2. Можно как-то через АдресОф, но как?

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 18.02.2005 (Пт) 13:12

А может в этой процедуре есть за что ухватиться? Ну типа какие то изменящиеся цифры.. или что вроде этого...:roll:
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 18.02.2005 (Пт) 13:32

Конечно есть, куда уж без них!
Но как их "вытащить" из главной процедуры во время выполнения?
Через иаймер не пойдёт

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 18.02.2005 (Пт) 13:39

2 Sirik, а нельзя в эту процедуру добавить параметр, например, св-во Value прогрессбара? И тогда процедура туда сама будет писать нужное значение, а мы - видеть результат! Типа
Код: Выделить всё
Sub Sub1(ByVal Param1 As Any, ..., ByRef ToWhere As Long)
...
ToWhere = ToWhere + 1
...
ToWhere = ToWhere + 1
...
...
End Sub

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 18.02.2005 (Пт) 14:00

2 A.A.Z.

Ок, смотри:
Код: Выделить всё
...
'Вот вызов функции
Res = MyFunction (Parap as Long, ToWhere As Long)
'как получить изменения переменной ToWhere во время исполнения MyFunction ???
...

Public Function MyFunction (Parap as Long, ByRef ToWhere As Long)
'''тело функции
End Function

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 18.02.2005 (Пт) 14:11

A.A.Z же тебе написал... а куда вставлять увеличение progressbar.value - это уже зависит от твоей функции. Например она в цикле выполняет какой-нить подсчет :
Код: Выделить всё
   
Public Function MyFunction (Parap as Long, ByRef ToWhere As Long)
   
   dim nCount as Integer
   
   progressbar.Value=0
   progressbar.Max=MAXCOUNT
   
   For nCount = 0 to MAXCOUNT
      считает что-нить
      progressbar.Value=progressbar.Value+1
   Next nCount

End Function

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 18.02.2005 (Пт) 14:15

А может создать переменную в классе специально для этих целей и изменять (и отслеживать) ее значение в процессе работы процедуры или функции, а по окончании обнулять. Т.Е. можно будет одну переменную использовать во всех необходимых тебе процедурах и функциях.
Ми..и...и...и..р Вашему дому.............

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.02.2005 (Пт) 14:16

Я обычно делаю примерно так:

Код: Выделить всё
Dim  mvarProgressChange as Long

Friend Property Get ProgressChange() as Long
ProgressChange=mvarProgressChange
end Property

Friend Property Let ProgressChange(byval Value as Long)
mvarProgressChange =Value
MyPorgressBar.Value=Value
end Property

...

Public Function MyFunction (Parap as Long)
'''тело функции
Dim i as long

i=1
ProgressChange=i
....

i=10
ProgressChange=i

....
i=100
ProgressChange=i

....
End Function


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2005 (Пт) 14:24

А я бы сделал событие... Это как-то более "объектно ориентированно".
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.02.2005 (Пт) 14:35

дело вкуса, иногда и с событием делаю, по настроению :wink:

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 18.02.2005 (Пт) 14:37

2 vvs_adm
Ты думаешь я что идиот? Я же написал код должен быть красивым: я не хочу иметь дело с прогрессами в теле процедуры.

2 Тёмыч
Напиши пример

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.02.2005 (Пт) 14:43

Можно сделать разновидность гибрида.
К примеру, процедура вызывается из формы frmMAIN, в которой имеется процедура для отслеживания прогресса:
Код: Выделить всё
'frmMAIN

Option Explicit

Public Sub ProgressChange(ByVal Stage As Long)
...
End Sub

...

Private Sub cmdStartProcess_Click()
DoLongProcess 1, 2, "3", Me, "ProgressChange"
End Sub


И есть твоя процедура:
Код: Выделить всё
Public Sub DoLongProcess(Arg1, Arg2, Arg3, Optional CallbackObject As Object, Optional ByVal CallbackProc As String)
Dim I As Long
For I = 1 To 10000
  ...
  If Not CallbackObject Is Nothing Then
    If Len(CallbackProc) > 0 Then
      CallByName CallbackObject, CallbackProc, I
    End If
  End If
Next I
If Not CallbackObject Is Nothing Then
  If Len(CallbackProc) > 0 Then
    CallByName CallbackObject, CallbackProc, -1
  End If
End If
End Sub
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2005 (Пт) 14:46

2alibek: а чем это лучше простого события? Имхо даже хуже - позднее связывание и т.п...
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.02.2005 (Пт) 14:47

Разве для события не нужен класс? А это можно использовать в модуле.
К тому же, это общий случай. В частном случае можно использовать заранее определенные Callback*.
Lasciate ogni speranza, voi ch'entrate.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 18.02.2005 (Пт) 15:24

Sirik писал(а):2 vvs_adm
Ты думаешь я что идиот? Я же написал код должен быть красивым: я не хочу иметь дело с прогрессами в теле процедуры.
А-а-а, меня никто не понял!
Код: Выделить всё
'У нас есть Label1
Sub Command1_Click()
Call MySub("abc", 123, ..., Label1.Caption)
End Sub

Sub MySub (ByVal Param1$, ByVal Param2&, ..., ByRef ToWhere As Any)
ToWhere = 1
...
ToWhere = ToWhere + 1
...
'И т.д.
End Sub
А вообще, слушайте Тёмыча (не меня, другого) - он дело говорит ;)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2005 (Пт) 18:05

alibek писал(а):Разве для события не нужен класс? А это можно использовать в модуле.

Согласен. но у Sirik-а уже есть класс., так что мудрить незачем.

2AAZ: имхо работать не будет - свойство нельзя передать по ссылке, передастся его копия.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2005 (Пт) 18:12

Ага.
Работать будет в NET, там эту фишку сделали :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 153

    TopList