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

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

Закрытие формы [D7]


Страницы:   1 2

Atanas ©   (2007-03-02 08:17:00) 

У меня возникла следующая ситуация: Из главной формы A открываю форму B. В событии OnShow формы B в зависимости от условий пытаюсь закрыть форму B. Но форма не закрывается.
Закрываю методами:
B.Close;
B.ModalResult:=mrOk, mrCancel и т.д.
Также пытаюсь закрыть форму B из обработчиков OnCreate, OnActivate не срабатывает. Может кто подсказать, ПОЧЕМУ?
Если рассказать вопрос в двух словах, "Как в обработчике открытия формы заставить ее не открываться"


Reindeer Moss Eater   (2007-03-05 11:42:00) [1]

А зачем вообще безусловно открывать форму, если сразу после Show по условию она зарывается?

Не проще ли открыватьформу по условию?


Atanas   (2007-03-05 10:12:00) [2]


> А до конца [33] читал? "Я бы вместо ... сделал бы ..." -
>  это что то иное?

Уже переделал сделал, как вы сказали, думал еще что-то имеется ввиду.


SlymRO   (2007-03-05 10:11:00) [3]

Atanas   (04.03.07 8:36) [31]
Они могут вызываться как для выбора, так и для редактирования

Для выбора: FormStyle:=fsNormal; ShowModal;
Для редактирования: FormStyle:=fsMDIChild; и полюбому показывать;
Экстренное закрытие Эксепшином в Create;


ЮЮ   (2007-03-05 10:10:00) [4]

> Может подскажете кой путь безглючный? Это же раздел "для
> начинающих". Хотя бы основные моменты, если возможно?

А до конца [33] читал? "Я бы вместо ... сделал бы ..."- это что то иное?


Atanas   (2007-03-05 09:59:00) [5]


> ЮЮ ©   (05.03.07 04:54) [33]



> Тоже мне, нашел спеца по доводке глючного пути решения до
> безглючного визуального проявления :)


Может подскажете кой путь безглючный? Это же раздел "для начинающих". Хотя бы основные моменты, если возможно?


ЮЮ   (2007-03-05 04:54:00) [6]

> Я расписал почему смысл есть. Если есть другие мысли, с
> удовольствием выслушаю. Особенно хотелось бы выслушать мнение
> ЮЮ.

Тоже мне, нашел спеца по доводке глючного пути решения до безглючного визуального проявления :)


> Если вызываемая форма будет MDIChild, то при создании (сразу
> же после выполнения Create) она сразу же становится видимой.
> Нельзя ли это как-то поправить?

Нельзя. По крайней мере в VCL.


> при открытии они получают параметры: тип открытия(выбор,
> редактирование), ID элемента справочника для позиционирования...
> Это я делаю в переопределенном конструкторе.

эти манипуляции вынести в отдельную процедуру, не метод формы. Сначала вызываем её и по ее результату принимать решение о создании/несоздании формы.  


> Это я делаю в переопределенном конструкторе

Я бы вместо
type
 TfrmChild = class(TForm)
 public
   constructor Create(AOwner: TComponent; Id: integer; ...);
 end;


сделал бы

type
 TfrmChild = class(TForm)
 public
   constructor Create(AOwner: TComponent);
 end;

 function CreateChild(Id: integer; ...): boolean;

implementation
 function CreateChild(Id: integer; ...): boolean;
 var
   toShow: boolean;
 begin
   Result := false;
   // проверка возможности создания (переменная) формы для заданного ID
   // естественно без использования экземпляра TfrmChild. Необходимые для этого компоненты можно иметь в DataModule
   if toShow then begin
     Result := true;
     frmChild := TfrmChild.Create(Application);
     ...  
     // frmChild.Show для MDIChild уже не нужно
   end;
 end;


Вызов из главной:
 if not CreateChild(Id) then
   Application.MessageBox('Не могу показать', 'Вместо Form2', 0);


Desdechado   (2007-03-04 17:57:00) [7]

> Компоненты таблиц хранятся в форме справочника, т.к. таких
> окон может быть открыто несколько.
А теперь в одном редактируем, а из другого выбираем, но не видим изменений. Нравится?
Для таких целей есть TDataModule.
И проверки лучше делать предварительно, особенно если это ничегоне стоит. А то будет как "а что будет с мордой, если по ней стукнуть? можно и самому схлопотать, а можно и добавить". Лучше уж заранее спросить, а потом стукать.


Atanas   (2007-03-04 08:36:00) [8]

Ну тады перейду от частного к общему:
Хочу сделать интерфейс как у справочников в 1С. Они могут вызываться как для выбора, так и для редактирования. Все окна работают в главном окне, т.е. получается MDIChild, при открытии они получают параметры: тип открытия(выбор, редактирование), ID элемента справочника для позиционирования... Это я делаю в переопределенном конструкторе. В самом справочнике при создании делаю открытие таблиц БД, если что-либо не проходит, то информирую пользователя и выхожу, а если все в порядке то открываю форму. Компоненты таблиц хранятся в форме справочника, т.к. таких окон может быть открыто несколько.

> Desdechado © (03.03.07 15:25) [30]
> Для MDIChild вообще нет смысла создавать форму, чтобы потом
> выяснить, а нужно ли ее было создавать.

Я расписал почему смысл есть. Если есть другие мысли, с удовольствием выслушаю. Особенно хотелось бы выслушать мнение ЮЮ.


Desdechado   (2007-03-03 15:25:00) [9]

Для MDIChild вообще нет смысла создавать форму, чтобы потом выяснить, а нужно ли ее было создавать.
Я так думаю.


Atanas   (2007-03-03 13:49:00) [10]

To: ЮЮ ©   (02.03.07 11:06) [27]

Вот еще вопросик появился: Если вызываемая форма будет MDIChild, то при создании (сразу же после выполнения Create) она сразу же становится видимой. Нельзя ли это как-то поправить?


MsGuns   (2007-03-02 14:29:00) [11]

Для этого, собсна, и используется функция ToShow, являющаяся методом TForm2, но вызываемая из TForm1


ЮЮ   (2007-03-02 11:06:00) [12]

>Desdechado ©   (02.03.07 11:02) [26]

TForm1.Button1Click в [15] и [23] именно это и делает :)


Desdechado   (2007-03-02 11:02:00) [13]

> в зависимости от удачности произведенных операций я и хочу
> сообщить юзверюи закрыть форму
Что-то я не наблюдаю операций для выделенного тезиса. Ты их тоже в OnShow вставляешь?

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


SlymRO   (2007-03-02 10:13:00) [14]

И вообще... Принято разделять невизуальное (ядро) и визуальное (GUI)... а у тебя ядро вмонтировано в гуй, от этого получается рифма


Atanas   (2007-03-02 10:09:00) [15]


> ЮЮ ©   (02.03.07 10:04) [23]


Класс!!!! Большущее спасибо !!!

Больше вопросов не имею :-)


ЮЮ   (2007-03-02 10:04:00) [16]

А можно этот код с модальным вызовом сделать?

А почему нет? При модальном показе (как и в MDIChild режиме) переменная Form2 в модуле формы TForm - бесполезна и даже вредна. Поэтому я испльзую локальную f2:

procedure TForm1.Button1Click(Sender: TObject);
var
 f2: TForm2;
begin
 f2 := TForm2.Create(Application);
 try
   if f2.ToShow then begin
     f2.ShowModal;
     if f2.ModalResult = mrOk then
       Caption := 'mrOk'
     else
       Caption := IntToStr(f2.ModalResult);
   end
   else
     Application.MessageBox('Не могу показать', 'Вместо Form2', 0);
 finally
   f2.Free;
 end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caHide;
end;


Atanas   (2007-03-02 10:00:00) [17]


> ЮЮ ©   (02.03.07 09:52) [20]



> Последний код не работает, форма 2 все-таки остается открытой
>
> из ЮЮ ©   (02.03.07 09:35) [15] ???
> В какой, интересно, момент?  А Visible.Truee случайно ей
> не ставил? У меня всё работает как задумано, даже и без
> убирания из авто-создания (правда авто-созданный экземпляр
> болтается где-то без надобности :)

Нет,  это был ответ для SlymRO


Atanas   (2007-03-02 09:53:00) [18]


> ЮЮ ©   (02.03.07 09:35) [15]


А можно этот код с модальным вызовом сделать?


ЮЮ   (2007-03-02 09:52:00) [19]

Последний код не работает, форма 2 все-таки остается открытой

из ЮЮ ©   (02.03.07 09:35) [15] ???
В какой, интересно, момент?  А Visible.Truee случайно ей не ставил? У меня всё работает как задумано, даже и без убирания из авто-создания (правда авто-созданный экземпляр болтается где-то без надобности :)


Atanas   (2007-03-02 09:47:00) [20]


> form2 из авто создания убери


Убрал не помогает :-(


Страницы:   1 2

Наверх

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