Советы по Delphi

         

Форма не существует? Так создайте!


В обычной ситуации, динамические экземпляры форм (или подформ в нашем случае) создаются примерно таким образом...

    frmNewForm := TNewForm.Create( owner );

Приведем 3 возможных решения вашей проблемы:

  1. объявляя frmNewForm как глобальную переменную, вы можете использовать следующий код:

    IF frmNewForm = NIL THEN

frmNewForm := TNewForm.Create( owner ); frmNewForm.Show;

с привлечением глобальных переменных

  • Найдите ссылку на frmNewForm, которая сохраняется в списке компонентов родителя при вызове TForm.Create( owner ). В большинстве случаев это будет собственностью массива компонентов главной формы.
  • Если у вас нет главной формы, котоую вы могли бы использовать в качестве родителя подформы, тогда воспользуйтесь методом TAppllication CreateForm( TForm, refernce ). Позже, когда вам понадобиться получить ссылку на подформу, вам нужно будет пройтись в цикле по свойству-массиву components вашего объекта application. Найдите форму по ее имени и получите ссылку. Одно важное замечание: при разрушении объекта вы сами должны устанавливать указатель на объект в nil. В противном случае, в следующий раз вы можете получить GPF.
  •     frmNewForm.Release; frmNewForm := nil;

    Если в качестве родителя формы вы определяете 'Application', то для ее поиска (чтобы убедиться, что она еще существует) необходимо перебрать все компоненты объекта Application.

    Чтобы сделать это, вы можете выбрать один из двух способов:

        Application.CreateForm(TSubForm, SubForm);

    или

        SubForm := TSubForm.Create(Application);

    Затем вы можете проверить существование вашей формы, перебирая в цикле компоненты:

        for i := 0 to Application.ComponentCount-1 do begin if Application.Components[i] = SubForm then ... {форма существует};

    Примечания:

    1. Если при создании формы вместо 'Application' вы используете 'Self', форма не будет являться компонентом Application, поэтому в дальнейшем вы не сможете ее найти, перебирая в цикле компоненты объекта Application.

  • Вместо создания цикла, перебирающего все компоненты Application.Components, вы могли бы воспользоваться 'Application.FindComponent', но только в том случае, *если* после создания формы вы назначили ей имя (например, SubForm.Name := 'SubForm';). 'FindComponent' ищет компоненты в массиве Components по их *имени*, но форму таким образом можно найти только после того, как вы назначите ей имя.
  • Используя для проверки существования формы что-то типа 'if SubForm = nil' учтите, что это может не сработать, если вы не установили ссылку на форму в nil при ее освобождении. Delphi не делает это автоматически. [001748]


  • Содержание раздела