Обновление окна из внешней функции

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Обновление окна из внешней функции

Сообщение Inferno » 06.04.2005 (Ср) 17:37

Есть окно с прогресс баром и внешняя функция для управления прогресс баром. Если функция находится в форме - никаких проблем с обновлением, если во вненшнем модуле, то в лучшем случае окно просто не обновляется. Можно конечно вставить в функцию Form.Show, но хотелось бы что-то более цивильное.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 17:52

А как ты обновляешь ? Через API или обычными средствами ?

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 17:53

Хотелось бы глянуть на пример кода

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 06.04.2005 (Ср) 18:19

Да никак я пока не обновляю :)
Особо не заморачивался с этим, пока были другие задачи, а счас очередь дошла и до этого.

так для теста
Код: Выделить всё
'форма
Private Sub Command1_Click()
Call UpdateTest(Me)
End Sub



Код: Выделить всё
'внешний модуль
Public Function UpdateTest(frm As Form)
For k = 0 To 65000
DoEvents
frm.Label1.Caption = k
frm.Show
Next k
End Function

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 18:51

Ничё не понял..... Какого рода обновления ты делаешь :?:

Одно дело Redraw, другое дело обновление данных внутри объектов.

Ты объясни на пальцах, чего сделать нужно :roll:

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 06.04.2005 (Ср) 19:12

На форме есть элемент progress. Из формы вызываю внешнюю функцию находящуююся в другом модуле и изменяющуую значения прогресс бара. Нужно чтобы окно не терялось во время выполнения функции а отображало прогресс выполнения. Посмотри пример, там вроде просто.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 19:19

Ничё не понятно.... Тебе надо чтобы окно всё время поверх что ли было ? Т.е чтобы остальные его не перекрывали ? :?: :?: :?:

P.S Я или совсем туп, или.... одно из двух :?: :shock:

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 06.04.2005 (Ср) 19:23

Возьми пример. Создай форму на ней по дефолту лейбл и комманд буттон. Засунь код ф форму и модуль. Посмотри на результат. Потом заремь в модуле DoEvents и посмотри еще раз.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 19:26

Сделал. Результат увидел. Логичный вопр - а зачем тебе убирать DoEvents ?

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 06.04.2005 (Ср) 20:03

:) Я же говорил, может есть более корректная реализация.

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 06.04.2005 (Ср) 20:05

Наверно потому, что он ужасно тормозит критичные вычисления.
Вот представь себе, что у него не 65000 операций, а пара миллионов...
А DoEvents каждый раз ждёт отклика системы...
Как вариант - вызывать DoEvents через определённое число итераций или юзать стороннюю библу...
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.04.2005 (Ср) 22:11

Вот... Вернулся я.. Девушку встречал. :roll:

А если так сделать ?

Код: Выделить всё
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Do

код..

Sleep 2
Doevents
Loop


А вообще и таймер можно, а если обычный VB -ный не хочется, то можно через API его создать.

Решений море :) :wink:

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 07.04.2005 (Чт) 0:13

Спасибо уже сделал.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 07.04.2005 (Чт) 6:22

Можна еще вот так
Код: Выделить всё
For k = 0 To 65000

if k mod 1000 =0 then  DoEvents
frm.Label1.Caption = k
frm.Show
Next k
الفيجوال بيسك الرابح

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.04.2005 (Чт) 9:12

Inferno писал(а):Возьми пример. Создай форму на ней по дефолту лейбл и комманд буттон. Засунь код ф форму и модуль. Посмотри на результат. Потом заремь в модуле DoEvents и посмотри еще раз.


Просто делай Refresh своему Label.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Re: Обновление окна из внешней функции

Сообщение alibek » 07.04.2005 (Чт) 9:30

Inferno писал(а):Есть окно с прогресс баром и внешняя функция для управления прогресс баром. Если функция находится в форме - никаких проблем с обновлением, если во вненшнем модуле, то в лучшем случае окно просто не обновляется. Можно конечно вставить в функцию Form.Show, но хотелось бы что-то более цивильное.

В форме сделай публичный флаг, который будет включаться при событии Activate.
Я обычно создавал публичную функцию Init, которая запускала внешнюю функцию.
Lasciate ogni speranza, voi ch'entrate.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 07.04.2005 (Чт) 9:34

Лэйбл приведен только в качестве примера.
Вобщем если кого интересут - пробуйте.

Код: Выделить всё

Private Declare Function GetInputState Lib "user32" () As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Public Enum WindowState
    SW_HIDE = 0
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
    SW_RESTORE = 9
    SW_SHOW = 5
    SW_SHOWMAXIMIZED = 3
    SW_SHOWMINIMIZED = 2
    SW_SHOWMINNOACTIVE = 7
    SW_SHOWNA = 8
    SW_SHOWNOACTIVATE = 4
    SW_SHOWNORMAL = 1
End Enum

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_SHOWWINDOW = &H40

Private WindowIsActive As Boolean

Public Function Redraw(ByVal hWnd As Long, ByVal State As WindowState, ByVal OnTop As Boolean)
   If Not GetInputState <> 0 Then DoEvents
   If WindowIsActive OR Not OnTop Then
      ShowWindow hWnd, State
   Else
      SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
      WindowIsActive = True
   End If
End Function

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 08.04.2005 (Пт) 17:29

Итак строка
Код: Выделить всё
     If Not GetInputState <> 0 Then DoEvents

никого не смутила :(
Сам лажанулся :)
Код: Выделить всё

  If GetInputState() Then DoEvents

Вобщем рефрешнуть окно можно 3 айпишными функциями:
1) ShowWindow
2) SetWindowPos
3) MoveWindow

Может кто подскажет какая из этих функций выполняется быстрее?
И еще вопрос. У меня создается такое впечатление, что окно не просто отбражается, а создается его новый экземпляр. По крайней мере у меня после выгрузки программы, в памяти остается висеть процесс.[/code]

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 08.04.2005 (Пт) 22:31

Ну, процесс состоит не только из форм...
Ведь прога, в составе которой только сабмэйн, не выгружается из памяти, если ты этого не хочешь :D
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда


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

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

Сейчас этот форум просматривают: Bing-бот и гости: 185

    TopList