-
Доброе время суток. Подскажите пожалуйста как поправить ошибку. [Error] Project1.dpr(36): Incompatible types: 'method pointer and regular procedure' program Project1;
uses
windows,
kol;
type
TThreads = array [0..10] of PThread;
var
Threads: PList; DLL_PATH : string;
form,Label1,Button1,Button2:PControl;
procedure EnableButton(Sender: PThread; btn: Pointer);
begin
PControl( btn ).Enabled := TRUE;
end;
function RunPlugIns(Sender : PThread): Integer;
var
RunForm : procedure (AHandle: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar(DLL_PATH));
if FHandle <> 0 then
begin
RunForm := GetProcAddress(FHandle, 'RunForm');
if @RunForm <> nil then
RunForm(Applet.Handle);
FreeLibrary(FHandle);
end;
Threads.Remove( Sender );
Sender.SynchronizeEx(EnableButton,Pointer( Sender.Tag ) );
end;
function MakeRunThread(btn: Pointer): PThread;
begin
Result := NewThread;
Result.OnExecute :=TOnThreadExecute(MakeMethod(nil,@RunPlugIns));
Result.Tag := DWORD( btn );
PControl( btn ).Enabled := FALSE;
Result.Resume;
end;
procedure Button1Click(Dummy : Pointer;Sender: PObj);
begin
DLL_PATH := 'Run_Form1.dll';
Threads.Add( MakeRunThread( Button1 ) );
end;
procedure Button2Click(Dummy : Pointer;Sender: PObj);
begin
DLL_PATH := 'Run_Form2.dll';
Threads.Add( MakeRunThread( Button2 ) );
end;
procedure KOLForm1Destroy(Dummy : Pointer; Sender: PObj);
begin
DLL_PATH := '';
end;
procedure KOLForm1Close(Dummy : Pointer;Sender: PObj; var Accept: Boolean);
begin
if not Button1.Enabled or not Button2.Enabled then
begin
Accept := FALSE;
ShowMessage( 'Close all opened child forms first!' );
end;
end;
Begin
Applet := NewApplet('');
Form := NewForm( Applet, 'Form1' ).SetPosition( 408, 255 ).SetClientSize( 258, 159 ).Tabulate.CenterOnParent;
Form.StayOnTop := True;
Form.Font.FontHeight := 16;
Form.Font.FontName := 'Arial';
Label1 := NewLabel( Form, 'Run ''Run1'' form and try minimizing it!' ).SetPosition( 8, 96 ).AutoSize( TRUE );
Button1 := NewButton( Form, 'Run1' ).SetPosition( 8, 32 ).SetSize( 113, 57 );
Button2 := NewButton( Form, 'Run2' ).SetPosition( 136, 32 ).SetSize( 113, 57 );
Form.OnDestroy :=TOnEvent(MakeMethod(nil,@KOLForm1Destroy));
form.OnClose:=TOnEventAccept(MakeMethod(nil,@KOLForm1Close));
Button1.OnClick:=TOnEvent(MakeMethod(nil,@Button1Click));
Button2.OnClick:=TOnEvent(MakeMethod(nil,@Button2Click));
Threads := NewList;
Run(Applet);
end.
-
Во-первых, забыт напрочь первый параметр. Талдычишь, талдычишь, не доходит. В параметрах что написано? Тип TThreadMethodEx = procedure( Sender: PThread; Param: Pointer ) of object;
ОФ ОБЖЕКТ!!!
Это Метод, это не процедура! Сколько еще восклиуательных знаков поставить, чтобы усвоилось?
А во-вторых, MakeMethod.
-
Спокойствие только спокойствие. Я только что из спячки вышел. И ЭТО ТАК написано было изначально в мск варианте просто я незнаю что туда поставлять надо чтобы правильно работало. Надеюсь это как-то компенсирует Вам не столь содержательный вопрос и сэкономит нервные затраты.
-
function RunPlugIns(Sender : PThread): Integer;
*** Note: Sender = nil ***
Sender.SynchronizeEx(TThreadMethodEx(MakeMethod(nil,@EnableButton)), Pointer(Sender.Tag));
-
Sender.SynchronizeEx(TThreadMethodEx(MakeMethod(nil,@EnableButton)),Pointer( Sender.Tag ) ); и Dummy : Pointer; в процедуру кнопки
-
Когда минимизирую Run1 пропадает из виду?
-
begin
FHandle := LoadLibrary(PKOLChar(DLL_PATH));
if FHandle <> 0 then
begin
RunForm := GetProcAddress(FHandle, 'RunForm');
if @RunForm <> nil then
RunForm(Form.Handle);
FreeLibrary(FHandle);
end;
Threads.Remove(Sender);
Sender.SynchronizeEx(TThreadMethodEx(MakeMethod(nil, @EnableButton)), Pointer(Sender.Tag));
end;
-
to Vladimir Kladov Большое Спасибо. "... лучший способ защиты — нападение,..." Оскар Уайльд to Jon: Thank you very much. Now everything is clear.
-
От чего защищаться? Сами подумайте.
|