Конференция "KOL" » Demo2NonModalFormsDLL(без мск) [Delphi, Windows]
 
  • RusSun © (13.02.11 18:12) [0]
    Доброе время суток.

    Подскажите пожалуйста как поправить
    ошибку.
    [Error] Project1.dpr(36): Incompatible types: 'method pointer and regular procedure'

    program Project1;

    uses
     windows,
     kol;

    {$R *.res}
    type
     TThreads = array [0..10] of PThread;
    var
    Threads: PList; DLL_PATH : string;
    form,Label1,Button1,Button2:PControl;

    //область для процедур

    {=========================== Starting disc erase ==============================}

    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 );

    //.centeronparent.Tabulate;
    //область для работы

    Form.OnDestroy :=TOnEvent(MakeMethod(nil,@KOLForm1Destroy));
    form.OnClose:=TOnEventAccept(MakeMethod(nil,@KOLForm1Close));
    Button1.OnClick:=TOnEvent(MakeMethod(nil,@Button1Click));
    Button2.OnClick:=TOnEvent(MakeMethod(nil,@Button2Click));
    //FormOnCreate
    Threads := NewList;
    Run(Applet);
    end.
    {  //procedure TThread.SynchronizeEx( Method: TThreadMethodEx; Param: Pointer );
     //TThreadMethodEx = procedure( Sender: PThread; Param: Pointer ) of object;
     //TOnThreadExecute = function(Sender: PThread): Integer of object;}

  • Vladimir Kladov © (13.02.11 18:34) [1]
    Во-первых, забыт напрочь первый параметр. Талдычишь, талдычишь, не доходит. В параметрах что написано? Тип TThreadMethodEx = procedure( Sender: PThread; Param: Pointer ) of object;

    ОФ ОБЖЕКТ!!!

    Это Метод, это не процедура! Сколько еще восклиуательных знаков поставить, чтобы усвоилось?

    А во-вторых, MakeMethod.
  • RusSun © (13.02.11 19:05) [2]
    Спокойствие только спокойствие. Я только что из спячки вышел. И ЭТО ТАК написано было изначально в мск варианте просто я незнаю что туда поставлять надо чтобы правильно работало. Надеюсь это как-то компенсирует Вам не столь содержательный вопрос и сэкономит нервные затраты.
  • Jon © (13.02.11 19:15) [3]
    function RunPlugIns(Sender : PThread): Integer;

    *** Note: Sender = nil ***

    Sender.SynchronizeEx(TThreadMethodEx(MakeMethod(nil,@EnableButton)), Pointer(Sender.Tag));
  • RusSun © (13.02.11 19:26) [4]

    Sender.SynchronizeEx(TThreadMethodEx(MakeMethod(nil,@EnableButton)),Pointer( Sender.Tag ) );



    и Dummy : Pointer; в процедуру кнопки
  • RusSun © (13.02.11 19:29) [5]
    Когда минимизирую Run1 пропадает из виду?
  • Jon © (13.02.11 20:03) [6]

    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;

  • RusSun © (13.02.11 22:10) [7]
    to Vladimir Kladov Большое Спасибо. "... лучший способ защиты — нападение,..." Оскар Уайльд
    to Jon: Thank you very much. Now everything is clear.
  • Vladimir Kladov © (14.02.11 04:38) [8]
    От чего защищаться? Сами подумайте.
 
Конференция "KOL" » Demo2NonModalFormsDLL(без мск) [Delphi, Windows]
Есть новые Нет новых   [120347   +16][b:0][p:0.003]