![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Игра с формами
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.....