ProgressBar в стиле MARQUEE (Win7Style) не работает в DLL
Всем доброго времени суток!
Возникла проблема с прогресбаром. Дело в том, что мне нужно в точке инициализации DLL библиотеки организовать некоторые процедуры и сделать что-то в роде уведомления со статусбаром в стиле Marquee типа как тут: http://www.cyberforum.ru/attachments/196663d1351769468
Вот с этим кодом в EXE файле работает без проблем:
unit Unit1;
interface
uses
tlhelp32, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, psapi, ComCtrls;
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{$R WinStyle.res}
procedure TForm1.FormCreate(Sender: TObject);const
PBS_MARQUEE =8;
PBM_SETMARQUEE=WM_USER+10;
begin
SetWindowLong(ProgressBar1.Handle,GWL_STYLE,PBS_MARQUEE+WS_CHILD+WS_VISIBLE);
SendMessage(ProgressBar1.Handle,PBM_SETMARQUEE,1,30);
end;
end.
Но в DLLке это не работает, т.е. стиль Marquee не наблюдается... Вот фрагмент кода:
unit SplsFrchk;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls,httpsend, jpeg, IdTCPClient, IdICMPClient,
Hash,base64,DECUtil,JclMime,CONVUNIT;
const WM_LOAD = WM_USER+1001;
PBS_MARQUEE =8;
PBM_SETMARQUEE=WM_USER+10;
type
TSplFmr = class(TForm)
Label1: TLabel;
ProgressBar1: TProgressBar;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure doLoad(var Msg: TMessage); message WM_LOAD;
.......................................
{ Private declarations }
public
{ Public declarations }
end;
Type
TdoHandle = procedure(aKey: Integer; blackList: Pchar);
var
SplFmr: TSplFmr;
implementation
{$R *.DFM}
{$R WinStyle.res}
.......................................
procedure TSplFmr.doLoad(var Msg: TMessage);
var
.......................................
begin
SetWindowLong(ProgressBar1.Handle,GWL_STYLE,PBS_MARQUEE+WS_CHILD+WS_VISIBLE);
SendMessage(ProgressBar1.Handle,PBM_SETMARQUEE,1,5);
.......................................
end;
procedure TSplFmr.FormShow(Sender: TObject);
begin
PostMessage(Handle,WM_LOAD,0,0);
end;
procedure TSplFmr.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
.......................................
end;
end.
Запускаю DLLку через LoadLibrary()
.
P.S. Не спрашивайте, почему я делаю всё это именно в точке входа в DLLку! Т.к. без этого в моём проекте никак! И не нужно говорить, что создавать формы и прочее в точке входа нельзя. Я это и так знаю, тем не менее полный код DLLки рабочий.
Источник: Stack Overflow на русском