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