Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПроблема с дочерней формой в 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c