Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.06 c
2-1177403471
artem.gor
2007-04-24 12:31
2007.05.13
Помогите написать процедуры


1-1174234172
Kolan
2007-03-18 19:09
2007.05.13
Пункт «Load Icon» недоступен в опциях проекта, почему?


15-1176372843
Карелин Артем
2007-04-12 14:14
2007.05.13
Инструкция как работать программистам с Subversion есть?


15-1176737810
@!!ex
2007-04-16 19:36
2007.05.13
Кривая по трем точкам.


11-1159024651
ZiTrAX
2006-09-23 19:17
2007.05.13
KOL(KOLIBEvents)+FreePascal