Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.047 c
3-1167148645
V-A-V
2006-12-26 18:57
2007.03.25
Можно ли восстановить базу?


11-1151328705
lollol
2006-06-26 17:31
2007.03.25
Delphi SE and KOL


15-1172596623
SamProf
2007-02-27 20:17
2007.03.25
Как сделать WYSIWYG редактор?


2-1173057436
совсем чайник
2007-03-05 04:17
2007.03.25
Панель задач+ сворачивание окна


2-1172855293
pasha star
2007-03-02 20:08
2007.03.25
Мигание как в mIRC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский