![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с дочерней формой в DLL [D7, XP]
madmech © (2009-06-09 15:41:00)Я создаю DLL, к ней подключаю главную форму (MainForm) и дочернюю форму (ChildForm), но когда пытаюсь обратиться в обработчике OnShow главной формы к одному из компонентов, лежащих в дочерней форме, компилятор выдает ошибку. Точнее компилятор выдает ошибку, когда я загружаю эту библиотеку в запускающем приложении. В чем дело? Исходники по необходимости приложу.
Сергей М. (2009-06-10 22:27:00) [1]
> Германн © (09.06.09 21:50) [12]
>
>
> > Сергей М. © (09.06.09 21:44) [11]
>
> при чем тут OnShow? :)
Это у ИШ надо спросить
> в событииTMainForm.Show
)
Игорь Шевченко (2009-06-10 14:35:00) [2]
> Всем спасибо, все свободны.
Есть предложение в дальнейшем использовать отладчик, а не форум. У отладчика гораздо больше возможностей.
madmech (2009-06-10 13:10:00) [3]
> Блин. Давить вас надо.
>
> Ты создаешь локальную переменную ChildForm, а в событии
> TMainForm.Show обращаешься к глобальной переменной.
Все, проблема решена! Всем спасибо, все свободны.
Rouse_ (2009-06-09 22:57:00) [4]
> ChildForm.Label1.Caption := '!!!'; // Вот здесь вылазит
> ошибка!
А, ну да. Не мудрено.
Игорь Шевченко (2009-06-09 22:04:00) [5]Сергей М. © (09.06.09 21:44) [11]
Ты тоже попался на ту же ловушку :)
Германн (2009-06-09 21:50:00) [6]
> Сергей М. © (09.06.09 21:44) [11]
А при чем тут OnShow? :)
Сергей М. (2009-06-09 21:44:00) [7]
> Игорь Шевченко © (09.06.09 21:37) [10]
Так ведь он клянется на Библии, что MainForm.Visible=False выставлено в дизайн-тайме...
OnShow при этом может возникнуть не раньше вызова MainForm.Show[Modal], если конечно же в ходе конструирования ChildForm не предпринимаются попытки вызуализировать MainForm
Игорь Шевченко (2009-06-09 21:37:00) [8]Блин. Давить вас надо.
Ты создаешь локальную переменную ChildForm, а в событии TMainForm.Show обращаешься к глобальной переменной.
Читать до полного и окончательного просветления:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1244381829&n=18
madmech (2009-06-09 20:41:00) [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;
Что самое интересное - стоит. :)
Ega23 (2009-06-09 19:33:00) [10]В DesignTime поставь TMainForm.Visible := False;
Игорь Шевченко (2009-06-09 19:28:00) [11]
> Проблемное место:
> procedure TMainForm.FormShow(Sender: TObject);
> begin
> ChildForm.Label1.Caption := '!!!'; // Вот здесь вылазит
> ошибка!
> end;
ChildForm еще не создана, а ты к ней пытаешься обратиться.
Я тебе сразу совет дам - если в сообщении AV маленький адрес - смотри, где у тебя неинициалированный указатель.
madmech (2009-06-09 19:18:00) [12]Правильнее будет сказать, что ChildForm на самом деле никакая не дочерняя, а такая же как и MainForm, то бишь они равноценные, но по смыслу она дочерняя. Надеюсь, я понятно выразился. :)
madmech (2009-06-09 19:17:00) [13]Текст ошибки:
"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.
Dennis I. Komarov (2009-06-09 16:44:00) [14]... и вызов из приложения до кучи
Amoeba (2009-06-09 16:37:00) [15]... и объявление ф-й в DLL тоже.
oldman (2009-06-09 15:54:00) [16]
> Исходники по необходимости приложу.
Лучше текст ошибки...
Dennis I. Komarov (2009-06-09 15:44:00) [17]
> В чем дело?
Ошибка в программе...