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

Вниз

Проблема с дочерней формой в DLL   Найти похожие ветки 

 
madmech ©   (2009-06-09 15:41) [0]

Я создаю DLL, к ней подключаю главную форму (MainForm) и дочернюю форму (ChildForm), но когда пытаюсь обратиться в обработчике OnShow главной формы к одному из компонентов, лежащих в дочерней форме, компилятор выдает ошибку. Точнее компилятор выдает ошибку, когда я загружаю эту библиотеку в запускающем приложении. В чем дело? Исходники по необходимости приложу.


 
Dennis I. Komarov ©   (2009-06-09 15:44) [1]


> В чем дело?

Ошибка в программе...


 
oldman ©   (2009-06-09 15:54) [2]


> Исходники по необходимости приложу.


Лучше текст ошибки...


 
Amoeba ©   (2009-06-09 16:37) [3]

... и объявление ф-й в DLL тоже.


 
Dennis I. Komarov ©   (2009-06-09 16:44) [4]

... и вызов из приложения до кучи


 
madmech ©   (2009-06-09 19:17) [5]

Текст ошибки:
"Access violation at 00BD5AC1 in module "lib.dll". Read at address 000002F8"

DLL:
library Lib;

uses
 SysUtils,
 Classes,
 Forms,
 MainUnit in "MainUnit.pas" {MainForm},
 ChildUnit in "ChildUnit.pas" {ChildForm};

{$R *.res}

procedure ShowForm; stdcall;
var MainForm: TMainForm;
   ChildForm: TChildForm;
begin
 MainForm := TMainForm.Create(Application);
 ChildForm := TChildForm.Create(Application);
 MainForm.ShowModal;
 MainForm.Free;
 ChildForm.Free;
end;

exports
 ShowForm;

begin
end.


Проблемное место:
procedure TMainForm.FormShow(Sender: TObject);
begin
 ChildForm.Label1.Caption := "!!!";   // Вот здесь вылазит ошибка!
end;


Вызов из приложения:
unit Launch;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TShowForm = procedure;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  DLLHandle: THandle;
  ShowForm: TShowForm;
begin
    try
 
    DLLHandle := loadLibrary ( "Lib.dll" );

       if DLLHandle <> 0 then begin

          @ShowForm := getProcAddress ( DLLHandle, "ShowForm" );
     
       if addr ( ShowForm ) <> nil then begin  
           ShowForm;
       end else
             showMessage ( "Function not exists..." );

       end else
          showMessage ( "DLL not found..." );

    finally
       freeLibrary (DLLHandle );
    end;
end;

end.


 
madmech ©   (2009-06-09 19:18) [6]

Правильнее будет сказать, что ChildForm на самом деле никакая не дочерняя, а такая же как и MainForm, то бишь они равноценные, но по смыслу она дочерняя. Надеюсь, я понятно выразился. :)


 
Игорь Шевченко ©   (2009-06-09 19:28) [7]


> Проблемное место:
> procedure TMainForm.FormShow(Sender: TObject);
> begin
>  ChildForm.Label1.Caption := "!!!";   // Вот здесь вылазит
> ошибка!
> end;


ChildForm еще не создана, а ты к ней пытаешься обратиться.

Я тебе сразу совет дам - если в сообщении AV маленький адрес - смотри, где у тебя неинициалированный указатель.


 
Ega23 ©   (2009-06-09 19:33) [8]

В DesignTime поставь TMainForm.Visible := False;


 
madmech ©   (2009-06-09 20:41) [9]


> ChildForm еще не создана, а ты к ней пытаешься обратиться.

Как это не создана? А это что, по-твоему?
procedure ShowForm; stdcall;
var MainForm: TMainForm;
  ChildForm: TChildForm;
begin
MainForm := TMainForm.Create(Application);
ChildForm := TChildForm.Create(Application);
MainForm.ShowModal;
MainForm.Free;
ChildForm.Free;
end;

Как видно из кода, я сначала создаю обе формы и лишь ЗАТЕМ показываю главную форму, где и обращаюсь к метке на дочерней форме.


> В DesignTime поставь TMainForm.Visible := False;

Что самое интересное - стоит. :)


 
Игорь Шевченко ©   (2009-06-09 21:37) [10]

Блин. Давить вас надо.

Ты создаешь локальную переменную ChildForm, а в событии TMainForm.Show обращаешься к глобальной переменной.

Читать до полного и окончательного просветления:
http://delphimaster.net/view/2-1244381829/


 
Сергей М. ©   (2009-06-09 21:44) [11]


> Игорь Шевченко ©   (09.06.09 21:37) [10]


Так ведь он клянется на Библии, что MainForm.Visible=False выставлено в дизайн-тайме...
OnShow при этом может возникнуть не раньше вызова MainForm.Show[Modal], если конечно же в ходе конструирования ChildForm не предпринимаются попытки вызуализировать MainForm


 
Германн ©   (2009-06-09 21:50) [12]


> Сергей М. ©   (09.06.09 21:44) [11]

А при чем тут OnShow? :)


 
Игорь Шевченко ©   (2009-06-09 22:04) [13]

Сергей М. ©   (09.06.09 21:44) [11]

Ты тоже попался на ту же ловушку :)


 
Rouse_ ©   (2009-06-09 22:57) [14]


> ChildForm.Label1.Caption := "!!!";   // Вот здесь вылазит
> ошибка!


А, ну да. Не мудрено.


 
madmech ©   (2009-06-10 13:10) [15]


> Блин. Давить вас надо.
>
> Ты создаешь локальную переменную ChildForm, а в событии
> TMainForm.Show обращаешься к глобальной переменной.

Все, проблема решена! Всем спасибо, все свободны.


 
Игорь Шевченко ©   (2009-06-10 14:35) [16]


> Всем спасибо, все свободны.


Есть предложение в дальнейшем использовать отладчик, а не форум. У отладчика гораздо больше возможностей.


 
Сергей М. ©   (2009-06-10 22:27) [17]


> Германн ©   (09.06.09 21:50) [12]
>
>
> > Сергей М. ©   (09.06.09 21:44) [11]
>
> при чем тут OnShow? :)


Это у ИШ надо спросить


> в событии TMainForm.Show


)



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
2-1245065404
kunka
2009-06-15 15:30
2009.08.09
перехват ctrl+v


3-1225445959
dmitry_12_08_73
2008-10-31 12:39
2009.08.09
Сохранение курсоров в TDBGrid


15-1244535124
SPeller
2009-06-09 12:12
2009.08.09
Кто-нить сталкивался?


2-1245062615
Petr
2009-06-15 14:43
2009.08.09
Работа с MS Word


3-1225653941
lamer6666
2008-11-02 22:25
2009.08.09
Можно ли одной командой Inset вставить данные в две таблицы?