Форум: "Начинающим";
Текущий архив: 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 элемента справочника для позиционирования...
> Это я делаю в переопределенном конструкторе.
эти манипуляции вынести в отдельную процедуру, не метод формы. Сначала вызываем её и по ее результату принимать решение о создании/несоздании формы.
> Это я делаю в переопределенном конструкторе
Я бы вместо
typeTfrmChild = 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