Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как из DLL можно управлять ProgressBar'ом?


Автор: Monty 17.9.2003, 03:31
Такая во проблемма ..... DLL еще нет, но собираюсь написать ........

В самой программе есть ProgressBar и надо сделать так чтоб DLL управляла этим ProgressBar'ом .... что мне передать ей и как им управлять из неё (из DLL) .......... при этом именно DLL должна передавать значение ProgressBar'у т.е. управлять им, а не программа.

может это будет выглядеть так?

mov eax, offset ProgressBar.Position
mov PosAddr, eax

а потом это передать DLL'ке ... чтоб она могла изменять значение hmmm.gif .... сработает? А какие есть еще предложение? Можно попроще? .... Именно она должна двигать полоску ПрогрессБара! ....... А DLL'ка примерно выполняет копирование файла по блокам (как в примере Дельфи) ... вот и надо сделать чтоб она в этом цикле изменяла значение ПрограссБара

ЗЫ не могу сегодня собраться с мыслями smile.gif .... уж извените меня wink.gif

Автор: <Spawn> 17.9.2003, 05:45
Что бы изменять значение ProgressBar-а из DLL можно, например, использовать сообщения. Используй какое нить значение больше WM_USER. Ну например:

Код
const
WM_PROGRESSUPDATE=WM_USER+100;

в ДЛЛ:

var
mHandle:THandle;
ProgressValue:integer;

{на DLL_PROCESS_ATACH находишь хендл твоего окна}
mHandle:=FindWindow('TForm1',nil);

for i:=0 to n do
begin
 {Операции в цикле}
 ProgressValue:={Вычисляешь значение ProgressBar-а}
 PostMessage(mHandle,WM_PROGRESSUPDATE,0,ProgressValue);
end;

в твоей программе:

TForm1=class(TForm)
  public
   ...
   procedure UpdateProgress(var Msg:TMessage);message WM_PROGRESSUPDATE;
   ...
  end;


procedure UpdateProgress(var Msg:TMessage);
begin
ProgressBar1.Position:=Msg.lParam;
end;



Если же хочется передеть ДЛЛ - ке ссылку на экземпляр твоего ProgressBar-а, то такое не выйдет, разве что использовать Борландовские пэкэйджи.

Автор: Baa 17.9.2003, 09:13
А почему нельзя просто хэндл окна(прогрессбара) передать?
Соотв. посылать окошку PBM_SETPOS или PBM_STEPIT
Ну или, если длл на дельфи, то почему нельзя передать (var ProgressBar: TProgressBar)?
А в длл делать с ним чего хочешь...

Автор: Baa 17.9.2003, 09:20
<Spawn>, зачем изобретать велосипед?
Сообщения для установки позиции в прогрессбаре существуют smile.gif

Автор: <Spawn> 17.9.2003, 12:14
Baa Ну я не спец еще smile.gif Про сообщения прогресс бара не знал. Блин, начитался в одной книге про не возможное использование классов в ДЛЛ и подумал, что экземпляр класса в ДЛЛ, загружаемую в свое приложение, передать нельзя. Проверил - все работает.

Автор: Monty 17.9.2003, 16:14
Спасибо <Spawn> и Baa smile.gif .......... теперь все понятно и как всегда все очень просто smile.gif

ЗЫ Я это буду применять в двух вариантах:
1) EXE (Asm) - DLL (Delphi)
2) EXE (Delphi) - DLL (Любой язык)
Так что идеально подходят сообщения ;)

Автор: Monty 22.9.2003, 01:55
Возник один нюанс hmmm.gif
Цитата
Соотв. посылать окошку PBM_SETPOS или PBM_STEPIT

таких констант в Дельфи просто нет, т.е. в Messages нет таких констант hmmm.gif ... может просто скажите ихнии значения?

Автор: <Spawn> 22.9.2003, 07:47
А кто сказал что они там будут? smile.gif Все делается просто:
1) Ставишь на форму ProgressBar;
2)Видишь что он юзает модуль ComCtrls;
3)Пытаешься найти в этом модуле нужные константы.
4)Видишь, что их там нет. Тогда смотришь какие модули используют данный модуль, ища что нить близкое по смыслу. Ага вот оно - CommCtrl.
5) Опять поиском ищешь константы. Вот и они:
Код
 {$EXTERNALSYM PBM_SETPOS}
 PBM_SETPOS              = WM_USER+2;
 {$EXTERNALSYM PBM_STEPIT}
 PBM_STEPIT              = WM_USER+5;

Автор: Monty 22.9.2003, 19:09
Цитата
А кто сказал что они там будут? smile.gif Все делается просто:
1) Ставишь на форму ProgressBar;
2)Видишь что он юзает модуль ComCtrls;
3)Пытаешься найти в этом модуле нужные константы.
4)Видишь, что их там нет. Тогда смотришь какие модули используют данный модуль, ища что нить близкое по смыслу. Ага вот оно - CommCtrl.
5) Опять поиском ищешь константы. Вот и они:
Код
 {$EXTERNALSYM PBM_SETPOS}
 PBM_SETPOS              = WM_USER+2;
 {$EXTERNALSYM PBM_STEPIT}
 PBM_STEPIT              = WM_USER+5;

Спасибо ..... не знал smile.gif .... копался в Messages, но в следующий раз запущю поиск в каталоге дельфи на *.pas и текст нужной константы smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)