Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
Sirik
-
- 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
А может в этой процедуре есть за что ухватиться? Ну типа какие то изменящиеся цифры.. или что вроде этого...

-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!
-
Sirik
-
- Perspicaz

-

-
- Сообщения: 2280
- Зарегистрирован: 19.02.2004 (Чт) 16:09
- Откуда: Бердичев, Украина
-
Sirik » 18.02.2005 (Пт) 13:32
Конечно есть, куда уж без них!
Но как их "вытащить" из главной процедуры во время выполнения?
Через иаймер не пойдёт
-
A.A.Z.
-
- Член-корреспондент академии 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

-

-
- Сообщения: 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

-

-
- Сообщения: 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

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 18.02.2005 (Пт) 14:24
А я бы сделал событие... Это как-то более "объектно ориентированно".
-
Sirik
-
- 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

-

-
- Сообщения: 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

-
-
- Сообщения: 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

-

-
- Сообщения: 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
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 7