Обращение к свойствам и методам дочернего окна

Рейтинг: 1Ответов: 1Опубликовано: 26.03.2015

Добрый день! Делфи осваивал давно, а сейчас спустя промежуток несколько лет забылись некоторые вещи. Есть такая проблема. На главной форме (приложения MDI) формирую код по созданию дочернего окна:

//// Клиенты
procedure TFormMain.CreateChildFormClient
         (const childName : string);
  var Child: TFormClient;
begin
  Child:= TFormClient.Create(Application);
  Child.Caption := childName;
end;

В этом окне "Клиенты" (FormClient) в коде идет вызов модального окна по кнопке. То есть стандартно так:

 with FormEditClient do
  begin
    ...
    ShowModal;
  end; 

Далее из этого модального окна FormEditClient тоже по событию клика кнопки пытаюсь вызвать метод из формы FormClient (дочернего окна по отношения к родительскому контейнеру, но вызывающего по отношению к форме FormEditClient). В итоге я получаю ошибку памяти, после вызова стандартного даже метода, к примеру, такого:

FormClient.FormShow(Sender);

Получаю такое окошко ошибки:

alt text

С MDI практически не работал, потому нужен совет, как обойти эту ситуацию, чтобы не допускать этих исключительных ошибок памяти.

Ответы

▲ 2Принят

Попробовал я запустить ваш код из комментариев. Вот в этом месте:

procedure TFormBookHelp.Button1Click(Sender: TObject);
begin
  FormHelp.ShowModal;
end;

FormHelp должен быть в списке форм создаваемых автоматически, либо вам его нужно создать самостоятельно перед обращением к нему. Иначе получите AV. Если добавить эту форму в создаваемые автоматически, то все работает.

Делаем раз

Делаем два

Unit1 (главная форма):

uses
  Unit2;

procedure TForm1.bt1Click(Sender: TObject);
var
  Child: TFormBookHelp;
begin
  Child := TFormBookHelp.Create(Application);
  Child.Caption := 'Помощь по программе';
end;

Unit2 (Дочерняя форма):

uses
  Unit3;

procedure TFormBookHelp.bt1Click(Sender: TObject);
begin
  FormHelp.ShowModal;
end;


procedure TFormBookHelp.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TFormBookHelp.Test;
begin
  MessageDlg('Проверка!!', mtError, [mbOK], 1);
end;

Unit3 (Модальная форма):

uses
  Unit2;

procedure TFormHelp.bt1Click(Sender: TObject);
begin
  FormBookHelp.Caption := 'test';
  FormBookHelp.Test;
  Close;
end;