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

Вниз

Закрытие формы   Найти похожие ветки 

 
Atanas   (2007-03-02 08:17) [0]

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


 
SlymRO ©   (2007-03-02 08:30) [1]

procedure TForm1.FormCreate(Sender: TObject);
begin
 Release;
end;

Но всеравно "Мигнет"... Не проще сначала проверить условия а уж потом открывать B?


 
SlymRO ©   (2007-03-02 08:31) [2]

procedure TForm1.FormCreate(Sender: TObject);
begin
 Release;
end;

Но всеравно "Мигнет"... Не проще сначала проверить условия а уж потом открывать B?


 
SlymRO ©   (2007-03-02 08:31) [3]

procedure TForm1.FormCreate(Sender: TObject);
begin
 Release;
end;

Но всеравно "Мигнет"... Не проще сначала проверить условия а уж потом открывать B?


 
SlymRO ©   (2007-03-02 08:31) [4]

Чета миня зациклило... извиняюсь


 
Elen ©   (2007-03-02 08:42) [5]


> Atanas   (02.03.07 08:17)

Вместо B.Close попробуй B.Hide


 
Atanas   (2007-03-02 08:49) [6]

To: SlymRO

Дело в том, что у меня открываются таблицы и т.д. в самой форме, в зависимости от удачности произведенных операций я и хочу сообщить юзверю и закрыть форму. Переносить весь этот код в главную форму не очень приемлимо.


 
Atanas   (2007-03-02 08:52) [7]

To: Elen

Скрыть то я ее скрою, но мне нужно ее закрыть и освободить все ресурсы.


 
Atanas   (2007-03-02 08:56) [8]

To: SlymRO

Сделал как вы сказали:

По кнопке
procedure TForm1.Button1Click(Sender: TObject);
begin
 form2.show;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
 Release;
end;

При первом нажатии все проходит нормально, при втором и последующем Access Violation


 
SlymRO ©   (2007-03-02 09:01) [9]

Atanas   (02.03.07 8:56) [8]
Access Violation

Ясень пень... ведь :Atanas   (02.03.07 8:52) [7]освободить все ресурсы
после Release; form2.show; не какит т.к. form2 уже нет! ее убило Release;...


 
Elen ©   (2007-03-02 09:03) [10]


> При первом нажатии все проходит нормально, при втором и
> последующем Access Violation

Правильно тебе же " нужно ее закрыть и освободить все ресурсы.", что release и делает. Потом ты ее вызвать не сможеш.


 
Elen ©   (2007-03-02 09:04) [11]


> SlymRO ©   (02.03.07 09:01) [9]

Эх медленно печатаю ;)


 
SlymRO ©   (2007-03-02 09:04) [12]

Тебе форму только показать (модально) или чтоб висела и болталась?
если модально:
procedure TForm1.Button1Click(Sender: TObject);
var form2:Tform2;
begin
 form2:=Tform2.Create(nil);
 try
   form2.showmodal;
 finally
   form2.free;
 end;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
Modalresult:=mrOK;
end;


 
Atanas   (2007-03-02 09:05) [13]

А... понятно, потом создам :-)

Еще сработал вот такой вариант, но тоже моргает

procedure TForm2.FormPaint(Sender: TObject);
begin
 SendMessage(Form2.Handle ,WM_CLOSE,0,0);
end;


 
SlymRO ©   (2007-03-02 09:11) [14]

Удалено модератором


 
ЮЮ ©   (2007-03-02 09:35) [15]

Чтобы не моргало, не нужно Show.

procedure TForm1.Button1Click(Sender: TObject);
begin
 form2 := TForm2.Create(Application);
 // в TForm2.OnCreate выполнить необходимые действия и вастать флаг "показать/не показать"
 // в данном случае это Public св-во ToShow
 if Form2.ToShow then
   Form2.Show
 else begin
   Form2.Free;
   Application.MessageBox("Не могу показать", "Вместо Form2", 0);
 end;
end;

type
 TForm2 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
   FToShow: boolean;
 public
   { Public declarations }
   property ToShow: boolean read FToShow;
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
 FToShow := (Random(2) = 0);
end;

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


 
Atanas   (2007-03-02 09:37) [16]

SlymRO
Спасибо большое, помог :-)
...
Но про глизму, имхо лишнее


 
Atanas   (2007-03-02 09:42) [17]

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


 
SlymRO ©   (2007-03-02 09:44) [18]

Atanas   (02.03.07 9:42) [17]
form2 из авто создания убери


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


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


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


 
ЮЮ ©   (2007-03-02 09:52) [20]

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

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


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


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


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


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


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



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

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


 
ЮЮ ©   (2007-03-02 10:04) [23]

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

А почему нет? При модальном показе (как и в 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:09) [24]


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


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

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


 
SlymRO ©   (2007-03-02 10:13) [25]

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


 
Desdechado ©   (2007-03-02 11:02) [26]

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

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


 
ЮЮ ©   (2007-03-02 11:06) [27]

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

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


 
MsGuns ©   (2007-03-02 14:29) [28]

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


 
Atanas   (2007-03-03 13:49) [29]

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

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


 
Desdechado ©   (2007-03-03 15:25) [30]

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


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

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

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

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


 
Desdechado ©   (2007-03-04 17:57) [32]

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


 
ЮЮ ©   (2007-03-05 04:54) [33]

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

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


> Если вызываемая форма будет 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);


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


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



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


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


 
ЮЮ ©   (2007-03-05 10:10) [35]

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

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


 
SlymRO ©   (2007-03-05 10:11) [36]

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

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


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


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

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


 
Reindeer Moss Eater ©   (2007-03-05 11:42) [38]

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

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



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

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
2-1172911428
Chaval'
2007-03-03 11:43
2007.03.25
panel


15-1172516915
Rouse_
2007-02-26 22:08
2007.03.25
Кто с билдером работает?


15-1172489465
boriskb
2007-02-26 14:31
2007.03.25
США И Великобритания нашли в Ираке то, что искали


2-1172735792
Стас
2007-03-01 10:56
2007.03.25
EControlC


2-1172873525
pasha star
2007-03-03 01:12
2007.03.25
как вставить звук .wav в .exe ?