Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Вниз

Игра с формами   Найти похожие ветки 

 
Kostafey ©   (2007-04-24 17:19) [0]

Уважаемые Мастера!
Помогите пожалуйста разрешить следующую проблему.
Повторить ее очень просто.
Создается 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, уже открытую до этого, адекватно работать
при вызове ее из модальной формы?


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

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

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


 
Kostafey ©   (2007-04-24 17:27) [2]

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

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

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


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


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


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


 
Kostafey ©   (2007-04-24 17:29) [4]

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

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


 
Kostafey ©   (2007-04-24 17:32) [5]

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

Вот так ?

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

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


 
Kostafey ©   (2007-04-24 17:33) [6]

то есть

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


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

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

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

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


 
Kostafey ©   (2007-04-24 17:46) [8]

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

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

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

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

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


 
Kostafey ©   (2007-04-24 17:47) [9]

> в совем

в своем


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

> 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:54) [11]

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

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


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

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


 
Kostafey ©   (2007-04-24 17:56) [12]

> 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 18:07) [13]

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

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


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

> [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:45) [15]

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

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


 
Leonid Troyanovsky ©   (2007-04-24 18:46) [16]


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

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

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

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


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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-04-24 18:49) [17]


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

Form2, Form3 - MD.

--
Regards, LVT.


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

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

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


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

Материал усвоил.
Я делал немного по-другому: http://delphimaster.net/view/2-1177072185/
Но одно другому не мешает.


> Form3 - MD.

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


 
Kostafey ©   (2007-04-24 18:58) [19]

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

А вообще, спасибо!


 
{RASkov}   (2007-04-24 19:06) [20]

> [17] Leonid Troyanovsky ©   (24.04.07 18:49)
> Form2, Form3 - MD.

?

> [19] Kostafey ©   (24.04.07 18:58)
with TFormX.Create(nil) do
....

Только из AutoCreate убери(если еще не сделал этого) TFormX.


 
Leonid Troyanovsky ©   (2007-04-24 19:17) [21]


> Kostafey ©   (24.04.07 18:57) [18]

> Материал усвоил.

Ну, если ты так быстро схватываешь,
немодальные оставлю в качестве домашнего задания.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-04-24 19:20) [22]


> {RASkov}   (24.04.07 19:06) [20]

> > Form2, Form3 - MD.

Must Die.
See also: LMD.

--
Regards, LVT.


 
{RASkov} ©   (2007-04-24 19:29) [23]

> [22] Leonid Troyanovsky ©   (24.04.07 19:20)
> Must Die.

Согласаен.
См. [1] и далее [14] - это я чтоб не писать много слов скопировал код автора из [0]. "Ошибки" в данном случае нет. Но для "правильного" написания кода в данной ветке уже обговорены моменты, например в [16], но для НЕ модальных - этого мало. Поэтому и привел в том виде как было сначала.


 
Kostafey ©   (2007-04-24 19:35) [24]

То есть Вы хотите сказать, что работать с модальными окнами через их имена не рекомендуется ?


 
Leonid Troyanovsky ©   (2007-04-24 19:42) [25]


> Kostafey ©   (24.04.07 19:35) [24]

> То есть Вы хотите сказать, что работать с модальными окнами
> через их имена не рекомендуется ?

Мы хотели лишь сказать, что использовать глобальные
переменные типа Form1..N не следует ни для каких форм.

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 19:50) [26]

> Только из AutoCreate убери(если еще не сделал этого) TFormX.

Имеется в виду Application.CreateForm(TForm3, Form3); в основном файле проекта?


> Ну, если ты так быстро схватываешь,
> немодальные оставлю в качестве домашнего задания.

Вы что же хотите сказать, что аналогично нужно и немодальные окна run-time создавать?

Извините, если посчитаете вопросы слишком глупыми. Раздел форума так и называется, да и
определение LMD я разобрал.


 
Kostafey ©   (2007-04-24 19:52) [27]

> Только из AutoCreate убери(если еще не сделал этого) TFormX.

Имеется в виду Application.CreateForm(TForm3, Form3); в основном файле проекта?


> Ну, если ты так быстро схватываешь,
> немодальные оставлю в качестве домашнего задания.

Вы что же хотите сказать, что аналогично нужно и немодальные окна run-time создавать?

Извините, если посчитаете вопросы слишком глупыми. Раздел форума так и называется, да и
определение LMD я разобрал.


 
Leonid Troyanovsky ©   (2007-04-24 19:55) [28]


> {RASkov} ©   (24.04.07 19:29) [23]

>  Поэтому и привел в том виде как было сначала.

Каюсь, начало пропустил :(

Но, твой костыль не спасет уважаемого Kostafey.
Если же он прислушается к другим твоим более, IMHO,
полезным советам, то сможет ходить без костылей.

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 19:57) [29]

> Мы хотели лишь сказать, что использовать глобальные
> переменные типа Form1..N не следует ни для каких форм.

Ясно. В этом случае, немодальные формы могли бы стать, например,
локальными переменными главной формы.
Д.З. понял.


 
Leonid Troyanovsky ©   (2007-04-24 19:58) [30]


> Kostafey ©   (24.04.07 19:52) [27]

> Вы что же хотите сказать, что аналогично нужно и немодальные
> окна run-time создавать?

Аналогия только в одном - без использования глобальных переменных.
Или ты не хочешь делать домашнее задание? :)

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 20:00) [31]

> [28] Leonid Troyanovsky ©   (24.04.07 19:55)

Простите, это > [14] {RASkov} Вы назвали костылем ?


 
Leonid Troyanovsky ©   (2007-04-24 20:04) [32]


> Kostafey ©   (24.04.07 19:50) [26]

> Имеется в виду Application.CreateForm(TForm3, Form3); в
> основном файле проекта?

Вобщем-то - да. Но, лезть в dpr руками не обязательно, достаточно
Project  - Options - Forms: Auto-create -> Available

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 20:05) [33]

> Аналогия только в одном - без использования глобальных переменных.

Да, понимаю. Но завтра в обед мне уже готовый вариант надо показывать.
Глобально что перестраивать сейчас что-то уже поздновато, вот я и пытаюсь
вникнуть лучше, чтобы в следующем проекте уже более грамотно делать.


> Или ты не хочешь делать домашнее задание? :)

Ну как вы такое могли подумать?! Я товарищь на такие вещи ответственный ! :)


 
Leonid Troyanovsky ©   (2007-04-24 20:11) [34]


> Kostafey ©   (24.04.07 20:00) [31]

> Простите, это > [14] {RASkov} Вы назвали костылем ?

Когда что-то хромает, возникает потребность в костыле.

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 20:16) [35]

> Когда что-то хромает, возникает потребность в костыле.

А когда кто-то летает ему и костыли ни к чему. Понял.

Спасибо за Ваши разъяснения !


 
Leonid Troyanovsky ©   (2007-04-24 20:19) [36]


> Kostafey ©   (24.04.07 19:57) [29]

> локальными переменными главной формы.

В быту называемыми полями (формы).
Можно даже и вовсе без переменных обойтись, бо
храняться все ссылки на формы в Screen.Forms.

Ну, а основное отличие немодальных от модальных форм
в том, что неизвестен момент, когда их закроют
(т.е., когда их, собс-но, следует разрушить).

Хотя (hint), как разрушать понятно - Action := caFree

--
Regards, LVT.


 
{RASkov} ©   (2007-04-24 20:36) [37]

> Kostafey ©  

Проделай такой эксперемент и сделай выводы. Для простоты примера обе формы в AutoCreate.

В Form2
procedure TForm2.Button1Click(Sender: TObject);
begin
 Form2:=TForm2.Create(Self);
 Form2.Caption:="F1"; Form2.Left:=Random(Screen.Width-Width);
 Form2.Show;
 Form2:=TForm2.Create(Self);
 Form2.Caption:="F2"; Form2.Left:=Random(Screen.Width-Width);
 Form2.Show;
 Form2:=TForm3.Create(Self);
 Form2.Caption:="F3"; Form2.Left:=Random(Screen.Width-Width);
 Form2.Show;
 FreeAndNil(Form2);
end;

В Form1
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Show;
// if Assigned(Form2) then FreeAndNil(Form2);
// with TForm2.Create(nil) do Show;
end;


Button1 на формах нажимай более одного раза.
Затем расскомментируй втрорую и третью строку и закомментируй первую... попробуй еще раз. Обращай внимание на все и поймешь разницу.


 
{RASkov} ©   (2007-04-24 20:37) [38]

[37] Это как раз про использование глобальных переменных....


 
Leonid Troyanovsky ©   (2007-04-24 20:46) [39]


> {RASkov} ©   (24.04.07 20:36) [37]

> // if Assigned(Form2) then FreeAndNil(Form2);

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

Т.е., FreeAndNil тоже костыль, бо, для любых компонентов
механизма Notification вполне, IMHO, достаточно.

Да озаботятся этим все держатели ссылок на компонент.

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 20:48) [40]

> [37] {RASkov} ©   (24.04.07 20:36)


Form2:=TForm3.Create(Self);
[Oшибкa] Unit2.pas(36): Incompatible types: "TForm2" and "TForm3"

Сейчас попробую разобраться...


 
{RASkov} ©   (2007-04-24 20:52) [41]

> [39] Leonid Troyanovsky ©   (24.04.07 20:46)
> if Assigned(Form2) then FreeAndNil(Form2);

Эта строчка собственно и не нужна, вставил ее только потому что Form2 в Autocreate и, якобы показать выполнение следующей, небудь Form2 в AutoCreate.


 
{RASkov} ©   (2007-04-24 20:54) [42]

> [40] Kostafey ©   (24.04.07 20:48)
> Form2:=TForm3.Create(Self);

Исправь на Form2:=TForm2.Create(Self);
Не доглядел :(


 
{RASkov} ©   (2007-04-24 20:56) [43]

> и, якобы показать выполнение следующей, небудь Form2 в AutoCreate.

якобы показать выполнение следующей строки,.....


 
Leonid Troyanovsky ©   (2007-04-24 21:03) [44]


> {RASkov} ©   (24.04.07 20:52) [41]

> Эта строчка собственно и не нужна, вставил ее только потому
> что Form2 в Autocreate и, якобы показать выполнение

Вот, видно, что ты не педагог :)

Педагог же, если преподносит нечто, то должно, видимо,
небо обвалиться, чтобы он отошел от оного даже в
_малейшем_  начертании.

Т.е., палочки д.б. попендикулярны и усё :)
И никаких яковых.

--
Regards, LVT.


 
Kostafey ©   (2007-04-24 21:04) [45]

> Исправь на Form2:=TForm2.Create(Self);
> Не доглядел :(

Да, догадался, спасибо.


> якобы показать выполнение следующей строки,.....

Понял, речь шла об F3.

Я главного не понял. Почему эта конструкция посыпалась?
Мол, Form2 теперь много?

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;

Боюсь, это уже выше моего понимания.


 
Leonid Troyanovsky ©   (2007-04-24 21:09) [46]


> Kostafey ©   (24.04.07 21:04) [45]

> Мол, Form2 теперь много?
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> Form2.Show;
>
> Боюсь, это уже выше моего понимания.

Когда форма не автосоздаваемая, то ее надо
создать собс-ручно. Логика прослеживается?

Т.е., создаем объект, пользуем и за ненадобностью - рушим.

--
Regards, LVT.


 
{RASkov} ©   (2007-04-24 21:14) [47]

> [45] Kostafey ©   (24.04.07 21:04)
> > якобы показать выполнение следующей строки,.....
>
> Понял, речь шла об F3.

Нет... это не об этом :)

> Почему эта конструкция посыпалась?
> Мол, Form2 теперь много?

Нет, не поэтому... А подумать..... Form2 - это глобальная переменная которую IDE создает автоматом...
Что с ней(Form2) происходит в procedure TForm2.Button1Click и что дает следующее нажатие Button1 на Form1.....AV


 
Kostafey ©   (2007-04-24 21:17) [48]

> Когда форма не автосоздаваемая, то ее надо
> создать собс-ручно. Логика прослеживается?
>
> Т.е., создаем объект, пользуем и за ненадобностью - рушим.

Это ясно.
А что же тогда рушит процедура FreeAndNil(Form2); в [37].
Явно не ту форму, кнопка которой сейчас нажимается.
Мы рушим последнюю Form2 (Form2.Caption:="F3";)?

А потом заново (пришелчке на кнопке первой формы) создаем Form2 первоначального варианта ?


 
{RASkov} ©   (2007-04-24 21:38) [49]

> Мы рушим последнюю Form2 (Form2.Caption:="F3";)?

Мы "рушим глобальную переменную"....
и в Form1 мы уже не имеет корректной Form2 поэтому Form2.Show - AV.


 
Kostafey ©   (2007-04-24 22:09) [50]

> Мы "рушим глобальную переменную"....

Вот ключ моего непонимания.
в procedure TForm2.Button1Click(Sender: TObject);
нигде локальной переменной Form2 не объявлено, кроме того
при разрушении формы она должна исчезнуть с экрана.
А у нас "Исходная" Form2 спокойно "висит".
...
И вообще, получается так, что указатели Form2:=TForm2.Create(Self)
полученные в процедуре обработчика потом теряются.


> и в Form1 мы уже не имеет корректной Form2 поэтому Form2.Show
> - AV.

Если глобальной Form2 нет, то все логично, но непонятно почему она уже уничтожена?


 
Kostafey ©   (2007-04-24 22:09) [51]

> Мы "рушим глобальную переменную"....

Вот ключ моего непонимания.
в procedure TForm2.Button1Click(Sender: TObject);
нигде локальной переменной Form2 не объявлено, кроме того
при разрушении формы она должна исчезнуть с экрана.
А у нас "Исходная" Form2 спокойно "висит".
...
И вообще, получается так, что указатели Form2:=TForm2.Create(Self)
полученные в процедуре обработчика потом теряются.


> и в Form1 мы уже не имеет корректной Form2 поэтому Form2.Show
> - AV.

Если глобальной Form2 нет, то все логично, но непонятно почему она уже уничтожена?


 
{RASkov} ©   (2007-04-24 22:18) [52]

> [50] Kostafey ©   (24.04.07 22:09)

Да-а-а..., не думал я что такой "непонятный" пример приведу.... :)

> нигде локальной переменной Form2 не объявлено,

Вот именно... используем глобальную.

> кроме того
> при разрушении формы она должна исчезнуть с экрана.

А ты разве видишь форму с заголовком F3?

> А у нас "Исходная" Form2 спокойно "висит".

Висит, но ссылка(Form2) на нее "битая" уже...

> И вообще, получается так, что указатели Form2:=TForm2.Create(Self)
> полученные в процедуре обработчика потом теряются.

Именно...

> Если глобальной Form2 нет, то все логично, но непонятно почему она уже уничтожена?

Опять все сначала :(


 
Kostafey ©   (2007-04-24 22:31) [53]

> [52] {RASkov} ©   (24.04.07 22:18)

А-а-а понял.
Дело не в объектах, дело в ссылках на них.
А это
if Assigned(Form2) then FreeAndNil(Form2);
мы просто для "очистки совести" написали.

Далее мы пересоздаем певую (из Form2) созданную форму как будто и не было ее.
with TForm2.Create(nil) do Show;

Правильно ?


 
{RASkov} ©   (2007-04-24 23:15) [54]

> [53] Kostafey ©   (24.04.07 22:31)
> Далее мы пересоздаем певую (из Form2) созданную форму как будто и не было ее.
> with TForm2.Create(nil) do Show;
> Правильно ?

Мы играем в игру угадал/неугадал? Хватит "мусорить".... Перечитай ветку с начала. Вместе с F1, здесь все ответы есть на твои вопросы.
Или задавай их более конкретнее. Я не понял последний твой вопрос. А про
> А это
> if Assigned(Form2) then FreeAndNil(Form2);
> мы просто для "очистки совести" написали.

См [41] с поправкой в [43]. В общем - ветку с начала :)


 
Kostafey ©   (2007-04-24 23:34) [55]

> См [41] с поправкой в [43]. В общем - ветку с начала :)

Перечитал. Все понял.


> Мы играем в игру угадал/неугадал?

Я лишь хотел убедиться, что понял правильно. Убедился. Правильно.


> Хватит "мусорить"

Последний разок помусорю на этой ветке:
с меня пиво :)))

Ну, как говорится, будете к нас на Колыме (С)


 
Kostafey ©   (2007-04-25 03:30) [56]

После нескольких эксперементов возник еще один вопрос.

> Мы хотели лишь сказать, что использовать глобальные
> переменные типа Form1..N не следует ни для каких форм.


> В быту называемыми полями (формы).
> Можно даже и вовсе без переменных обойтись, бо
> храняться все ссылки на формы в Screen.Forms.

Все же получается удобнее иметь для немодальных форм глобальные указатели,
будь то, поля главной формы или просто переменные в случае, если каждое окно
должно быть только в 1 экземпляре.
Конечно, когда требуется иметь несколько экземпляров окна, тут другого пути нет.
Но если нужно работать одним экземпляром, то отсутсвие указателя все только усложнит.
Screen.Forms - не слишком удобно.

Два эти фрагмента

 Form3.Close;
 Form3.Free;
 Form3:=TFormSubject.Create(Application);
и
 Form3.Perform(CM_RECREATEWND, 0, 0);

не идентичны, т.к. при Perform(CM_RECREATEWND, 0, 0) окно межет вести себя довольно странно,
например, если до этого оно находилось wsMaximized (run-time настройка), то после Perform(CM_RECREATEWND, 0, 0)
оно уже не вернется в wsNormal.

В таком случае, неужели если вызов немодального окна происходит из немодальных окон,
(а тем более из модальных) то в профессональных программах всегда предусматривают пересоздание окна ?


 
Leonid Troyanovsky ©   (2007-04-25 15:41) [57]


> Kostafey ©   (25.04.07 03:30) [56]

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


Во-первых, корректное хранение ссылки в поле формы
(никаких переменных!) не так уж и просто.
Вот пример хранения ссылки на TForm2, которая должна
существовать лишь в одном экземпляре:

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
   FForm2: TForm;
 public
   { Public declarations }
   procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 end;

implementation

{$R *.dfm}

uses
 unit2;   {у TForm2 сделаем в обработчике OnClose: Action:= caFree}

procedure TForm1.Notification;
begin
 inherited;
 if AComponent = FForm2 then
   if Operation = opRemove then
     FForm2 := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not Assigned(FForm2) then
   begin
     FForm2 := TForm2.Create(nil);
     FreeNotification(FForm2);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if Assigned(FForm2) then
   TForm2(FForm2).Show;
end;


Так что, использование Screen.Forms может быть и проще :)

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-04-25 15:53) [58]


> Kostafey ©   (25.04.07 03:30) [56]

> (а тем более из модальных)

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

Модальность - это один из способов сосредоточить
внимание юзера на принимаемом решении.

--
Regards, LVT.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.042 c
2-1177505802
cyber.mind
2007-04-25 16:56
2007.05.13
ТОЛЬКО ДЛЯ МАСТЕРОВ!


15-1176693141
DelphiN!
2007-04-16 07:12
2007.05.13
Спам о заработке в Интернете


4-1166178056
niko
2006-12-15 13:20
2007.05.13
Создание окна с помощью CreateWindowEx в Си


2-1176904358
Neket
2007-04-18 17:52
2007.05.13
Как узнать в путь...


8-1156246891
Zeleniy
2006-08-22 15:41
2007.05.13
удаление содержимого звукового файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский