Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

mdi форма   Найти похожие ветки 

 
mutabor   (2005-01-17 15:09) [0]

как и где корректно закрыть mdichild форму, вызываемую из dll?
dll выглядит сл образом:

....
var
DllApp:TApplication;
........
function ShowChild(AMainApp:TApplication):longint;stdcall;
var
 Form:TDllChild;
begin
 if Application<>AMainApp then
 begin
  DllApp :=Application;
  Application := AMainApp;
 end;

  Form := TDllChild.Create(Application);
  Form.Show;
  Form.Edit1.Text := IntTOStr(Application.MainForm.MDIChildCount);
  Res :=LongInt(Form);
  Result := LongInt(Form);
end;
....


вызываеться так


procedure TForm1.Action1Execute(Sender: TObject);
type
 TProc = function(AMainApp:TApplication):longint;stdcall;
var
  Proc:Tproc;
  CloseProc:TCloseProc;
  RetVal:integer;
begin
    try
       if hndDLLHandle=0 then
       begin
         hndDLLHandle := loadLibrary ( "TestDLL.dll" );
         if hndDLLHandle <> 0 then begin
            @Proc := getProcAddress ( hndDLLHandle, "ShowChild" );
             if addr (Proc) <> nil then begin
                ResMDI := Proc(Application);
             end else
             showMessage ( "Function not exists..." );
          end else
          showMessage ( "DLL not found..." );
       end
       else
        begin
         @Proc := getProcAddress ( hndDLLHandle, "ShowChild" );
         ResMDI := Proc(Application);
        end;

    finally
   //    freeLibrary ( hndDLLHandle );
    end;
end;CODE>

 Action := caFree; вызывает ошибку


 
Eraser ©   (2005-01-17 15:18) [1]

Что-то ты тут намудрил....
var
DllApp:TApplication;
- это у чему???????!!!!!
Вместо конструктора Create используй CreateNew.

И убери объявление формы var Form:TDllChild; из локальных переменных процедуры и перенес в глобальные, т.к. форма у тебя немодальная, и она должна СУЩЕСТВОВАТЬ (вернее указатель на неё) после выплнения процедуры, он может и будет даже существовать и в твоём примере, но такой подход- не правильный.

А закрыть в обработчике события OnClose формы впиши Action:=caFree;


 
mutabor   (2005-01-17 15:27) [2]

1.DllApp:TApplication
для перопределения application - иначе вызывающее приложение говорит что у него нет дочерних mdi форм
2. если вызываю CreateNew то ворма не "получаеться" mdi(кривые руки?)
3. теперь трабл сл:(приделал Action := CaFree)
при закрытии сначала дочерней формы , затем гравной все ок.
но при закрытии всего сразу(те основной) - вылетает Access


 
mutabor   (2005-01-17 15:28) [3]

(ошибки исправил)
1.DllApp:TApplication
для перопределения application - иначе вызывающее приложение говорит что у него нет дочерних mdi форм
2. если вызываю CreateNew то форма не "получаеться" mdi(кривые руки?)
3. теперь трабл сл:(приделал Action := CaFree)
при закрытии сначала дочерней формы , затем главной все ок.
но при закрытии всего сразу(те основной) - вылетает Access


 
Eraser ©   (2005-01-17 16:13) [4]

По-моему собака порылась в DllApp:TApplication; я могу ошибаться.
И зачем все эти изващения в Action1Execute?


 
mutabor   (2005-01-17 16:48) [5]

про препересвоение контекста Application говорят в справке: это практически прямая копия кода
в Action закинул просто чтобы с кнопками не возиться



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
1-1108454685
juice
2005-02-15 11:04
2005.02.27
Linker. Генерация C++ object files


4-1105897188
msn777
2005-01-16 20:39
2005.02.27
Как бороться с “thread creation error: Недостаточно памяти для...


3-1106637936
igor_w
2005-01-25 10:25
2005.02.27
Как реализовать PageControl с БД


1-1107929788
snake_r
2005-02-09 09:16
2005.02.27
Определение нажатой клавиши


6-1103188361
Zeba
2004-12-16 12:12
2005.02.27
Как из Delphi получить курсы валют с сайта ЦБ РФ?