Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Игра с формами


Страницы:   1 2 3

Kostafey ©   (2007-04-24 17:19:00) 

Уважаемые Мастера!
Помогите пожалуйста разрешить следующую проблему.
Повторить ее очень просто.
Создается Form1, Form2, Form3.

На Form1размещаются 2 кнопки (вызывающие Form2 -модально и Form3):

procedure TForm1.ButtonForm2ModalCallClick(Sender: TObject);
begin
 Form2.ShowModal;
end;

procedure TForm1.ButtonForm3CallClick(Sender: TObject);
begin
 Form3.Show;
end;


На Form2размещается 1 кнопка (вызывающая Form3):

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
 Form3.Show;
end;


На Form3размещается например Memo

Запускаем.
Жмем на кнопку, вызывающую модально Form2, Затем на Form2 нажимаем кнопку, вызывающую Form3.
Memo, находящееся на Form3 будет работать исправно.

Теперь другая ситуация.
Перезапускаем приложение.
Жмем в Form1 на кнопку, вызывающую Form3 (ее содержимое работеает исправно),
затем на Form1 нажимаем кнопку, вызывающую модально Form2. А в Form2
Вызываем уже открытую Form3. Все! Содержимое Form3, например, Memo работать не будет.
Не будут работать и другие визуальные компоненты формы.

Описанная ситуация точно копирует, ту сложность что возникла у меня.
Притом, даже если предварительно программно закрыть Form3:

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
 Form3.Close;
 Form3.Show;
end;

Ничего не изменится.
Сделать так:

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
 if Form3.Active then Form3.BringToFront
 else Form3.Show;
end;

Тоже бесполезно.

Как же заставить Form3, уже открытую до этого, адекватно работать
при вызове ее из модальной формы?


Kostafey   (2007-04-24 18:57:00) [41]

> Выруби у себя на стене: "Модальную форму показываем так":

Топора нет, фламастер высох.
Рисую карандашом.


> после усвоения материала

Материал усвоил.
Я делал немного по-другому: http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1177072185
Но одно другому не мешает.


> Form3 - MD.

MD - модальная ? Это тоже шутка.


Leonid Troyanovsky   (2007-04-24 18:49:00) [42]


> {RASkov}   (24.04.07 18:38) [14]

Form2, Form3 - MD.

--
Regards, LVT.


Leonid Troyanovsky   (2007-04-24 18:46:00) [43]


> Kostafey ©   (24.04.07 18:07) [13]

> Писать, наверное лучше всего так:

Выруби у себя на стене: "Модальную форму показываем так":

with TFormX.Create(nil) do
 try
   {подготовительная работа}
   case ShowModal of
      {анализ выбора пользователя}
   end;
 finally
   Free;
 end;


За остальными знаниями подходи после усвоения материала.

--
Regards, LVT.


Kostafey   (2007-04-24 18:45:00) [44]

> Form3.Perform(CM_RECREATEWND, 0, 0);

О! Спасибо!
Опять меня выручаете.


{RASkov}   (2007-04-24 18:38:00) [45]

> [13] Kostafey ©   (24.04.07 18:07)

Ну тогда попробуй так, т.е. как все и делал вначале только добавь выделенное.

procedure TForm1.ButtonForm2ModalCallClick(Sender: TObject);
begin
Form2.ShowModal;
end;

procedure TForm1.ButtonForm3CallClick(Sender: TObject);
begin
Form3.Show;
end;

На Form2 размещается 1 кнопка (вызывающая Form3):

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
Form3.Perform(CM_RECREATEWND, 0, 0);
Form3.Show;
end;


Kostafey   (2007-04-24 18:07:00) [46]

Вопрос теперь вот в чем.
Писать, наверное лучше всего так:

 Form3.Close;
 Form3.Free; //Нужен вот только ли этот оператор ??
 Form3:= TForm3.Create(Application);
 Form3.Show;


Kostafey   (2007-04-24 17:56:00) [47]

> Form3 ВСЕГДА ОТКРЫВАЕТСЯ В НЕМОДАЛЬНОМ РЕЖИМЕ !!!


> procedure TForm2.ButtonForm3CallClick(Sender: TObject);
> begin
> With TForm3.Create(Application) do begin
>   ShowModal;
>   Free;
> end;
> end;

Классно.
Я конечно имел в виду:

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
With TForm3.Create(Application) do begin
  Show;
  Free;
end;
end;


Kostafey   (2007-04-24 17:54:00) [48]

> Это почемуй-то Form3(Т.н. экземпляр TForm3, а не Form3)
> не закроется...

Ну так Сами попробуйте. Сначала открыть Form3, а потом из Form2 вызвать Ваш обработчик [8]


> пока открыта в модальном режиме TForm3...

Form3 ВСЕГДА ОТКРЫВАЕТСЯ В НЕМОДАЛЬНОМ РЕЖИМЕ !!!
Из разных форм она вызывается, но всегда немодально.


{RASkov}   (2007-04-24 17:49:00) [49]

> procedure TForm2.ButtonForm3CallClick(Sender: TObject);
> begin
> With TForm3.Create(Application) do begin
>   ShowModal;
>   Free;
> end;
> end;
>
> Но тогда Form3 не закроется до закрытия Form2.

Это почемуй-то Form3(Т.н. экземпляр TForm3, а не Form3) не закроется... это к TForm2 доступа не будет пока открыта в модальном режиме TForm3...


Kostafey   (2007-04-24 17:47:00) [50]

> в совем

в своем


Kostafey   (2007-04-24 17:46:00) [51]

> Во первых продумать алгоритм программы, и сделать так, чтоб
> не было возможным отоброжение одной и той же формы в двух
> разных режимах...

Неправда. Каждая форма отображается в совем режиме.
В модальном только Form2 (в данном примере).
Form3 отображается всегда немодально, другой вопрос, что в проекте
форма с аналогичным назначением может вызываться как справочник и как
независимый редактор (может со стороны это выглядит и не совсем корректно).

Вы имели в виду такой обработчик?

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
 With TForm3.Create(Application) do begin
   ShowModal;
   Free;
 end;
end;

Но тогда Form3 не закроется до закрытия Form2.


{RASkov}   (2007-04-24 17:38:00) [52]

> [2] Kostafey ©   (24.04.07 17:27)
> Ну шутку я оценил, здорово!

Это не шутка...
Во первых продумать алгоритм программы, и сделать так, чтоб не было возможным отоброжение одной и той же формы в двух разных режимах...
А про переменные я имел ввиду вот это:

With TFormN.Create() do begin
.....
ShowModal
Free;
end;
Что-то в этом духе....


Kostafey   (2007-04-24 17:33:00) [53]

то есть

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
Form3.Close;
Application.CreateForm(TForm3, Form3);
Form3.Show;
end;


Kostafey   (2007-04-24 17:32:00) [54]

> создай другой экземпляр TForm3, и покажи
> а старый перед этим закрой

Вот так ?

procedure TForm2.ButtonForm3CallClick(Sender: TObject);
begin
 Application.CreateForm(TForm3, Form3);
 Form3.Show;
end;

А что, и правда работает.
Такой способ будет корректным ?


Kostafey   (2007-04-24 17:29:00) [55]

> создай другой экземпляр TForm3, и покажи
> а старый перед этим закрой

А экземпляр уже будет с другим именем?


_Аноним   (2007-04-24 17:28:00) [56]


> Как же заставить Form3, уже открытую до этого, адекватно
> работать
> при вызове ее из модальной формы?


создай другой экземпляр TForm3, и покажи
а старый перед этим закрой


Kostafey   (2007-04-24 17:27:00) [57]

> Имхо... Не пользоваться переменными Form1, Form2, Form3.....

Ну шутку я оценил, здорово!

Нет я нарочно привел такой упрощенный пример, чтобы его
при желании можно было повторить.


{RASkov}   (2007-04-24 17:23:00) [58]

> [0] Kostafey ©   (24.04.07 17:19)

Имхо... Не пользоваться переменными Form1, Form2, Form3.....


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо