Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизИгра с формами Найти похожие ветки
← →
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.57 MB
Время: 0.044 c