Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
2-1244515357
set1212
2009-06-09 06:42
2009.08.09
Несколько одинаковых форм.


1-1211807607
Jungle
2008-05-26 17:13
2009.08.09
"Правильно" преобразовать тип Variant


15-1244444698
Cerberus
2009-06-08 11:04
2009.08.09
Проблемы локальной сети.


15-1244082212
alert2006
2009-06-04 06:23
2009.08.09
Помогите решить задачу


2-1244723130
Mishechka
2009-06-11 16:25
2009.08.09
Как программно связать поле в отчёте FR с полем БД?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский