procedure TForm1.FormShow(Sender: TObject);
begin
if Чего нибудь не хватает then
begin // КАК не показывать форму или сразу закрыть
ее
// возможные варианты
Form1.Close; // пофиг
Form1.Hide; // исключение EInvalidOperation
with message
"Cannot change Visible in OnShow or OnHide"
Abort; // и даже это не помогает
end;
end;
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-01-2007 01:02 | Комментарий к предыдущим ответам
Зачем ее вообще открывать...
Не прошло и семи лет, как решение было найдено! :)))
Mne tozhe nuzhno bylo eto sdelat' i ya sdelala vot tak(mozhet i ne krasivo, no zato rabotaet):
procedure TNeGalvnaja.FormPaint(Sender: TObject);
begin
if lCloseForm then Close;
end;
procedure TNeGalvnaja.FormShow(Sender: TObject);
begin
if Chego_to_ne_hvataet then
begin
MessageDlg('Ne hvataet chego-to!!!', mtError, [mbOk], 0);
lCloseForm := true;
end;
end;
Я старался сформулировать вопрос предельно кратко.
Имя Form1 лишь для примера, а у вас сложилось впечатление,
что это единственная и причем главная форма проекта, который
я не как не могу закрыть. У меня много форм и я хочу закрыть
одну из многих форм, а не завершить программу.
То, что Вы хотите прервать приложение, так и не показав его главную
форму - это и называется "abnormal termination of a program and returns
to the operating system". И не надо бояться слова "abnormal", когда для
Вашей задачи оно на самом деле "normal".
А для программы и для системы Halt ничуть не вреден. Эта штука применяется
Borland"ом еще с первых версий Turbo Pascal. Так что не бойтесь, никуда
Ваш водитель не денется и отличненько будет жить.
А если уж очень страшно прекратить треп и хоть на что-нибудь решиться,
то используйте рекомендуемую хелпом Application.Terminate. Но сразу говорю,
что может и не сработать, это смотря куда оно будет вставлено. А вот Halt
сработает точно.
До свидания, мы слишком много обсуждаем пустячную проблему.
The Halt procedure performs an abnormal termination
of a program and returns to the operating system.
Я спрашиваю как остановить автобус, а Вы советуете
пристрелить водителя ...
12-04-2000 03:35
Павел!
1. Метод Loaded будет вызван после ПОЛНОГО создания и ПОЛНОЙ загрузки
формы, независимо от того, есть ли она в списке AutoCreate, или нет.
Не надо строить предположений там, где можно просто посмотреть Help.
2. В этот момент Вы уже знаете все, что требуется. Ведь Вы собирались
использовать это "все" в OnShow? Значит, знаете и можете использовать
то же самое в Loaded.
3. Halt - это обычная процедура, а не метод класса. См. Help.
4. Дискуссию можно продолжать бесконечно, но, наверное, стоит, наконец,
взять - и просто попробовать. На практике.
Вероятно можно настраивать вид формы при помощи метода Loaded,
но все таки для автосоздавемой формы, я думаю, он будет вызван при
загрузке приложения. А в этот момент я не знаю какую таблицу выберет
юзер и какая в ней сумма для прописи?
Не могу так-же понять, как метод Halt поможет избежать показа формы
при отсутствии таблицы? У TForm и TCustomForm вообще нет такого метода.
procedure TForm1.Loaded;
begin
inherited Loaded;
if Чего_нибудь_не_хватает then Halt
end;
Уважаемый Антон!
Раньше я так и делал и формочки создавал
автоматически при загрузке приложения. А потом вдруг
стали кончаться ресурсы Windows 8-{{
Теперь я сам рожаю формочки
with Tform1.Create(nil) do
begin
r := ShowModal;
Free;
end;
if r = mrOk then
table.Post
else
table.cancel;
Поскольку для того, чтобы видеть контролы формы перед ShowModal
нужно как-то по другому рожать, например,
var d : TForm1; //локальная переменная
...
d:=TForm1.Create(nil);
а главное, из желания размещать код по настройке формы в самом
модуле формы, я поместил проверку и настройку в событие OnShow.
Теперь, где бы не вызывал формочку, проверки будут выполняться не
зависимо от склероза программиста.
Кроме того, можно наследников Form1 настругать c встроенной проверкой!
Странно что в других случаях метод Abort прерывает события, например
в TDBNavigator
procedure Tform1.DBNavigator1BeforeAction(Sender: TObject;
Button: TNavigateBtn);
var r : integer;
begin
case Button of
nbFirst,nbPrior, nbNext, nbLast:
begin
//действия по умолчанию
end;
nbDelete :
begin
Otmena; //мое удаление записи
Abort;
end;
nbEdit :
begin
TryEditMessage; //мое редактирование
Abort;
end;
...
end; {Case of }
end;
Вообще система событий в Дельфи кажется довольно запутанной,
плохо документированной и трудно управляемой. В Парадох для ДОС,
например, у каждого события была переменная, через которую
можно было управлять жизьню событий - типа прекратить или продолжить.
Хотя не знаю стоить ли здесь "БАЗАРИТЬ" на эту тему?
Черт возьми, господа, не слишком ли много мы уделяем внимания проблеме,
которую метод Loaded решает в 5 секунд?
Илья, Вы правильно боитесь, со мной надо соглашаться :о). По крайней
мере, в данном случае, потому что СПОСОБ вызова конструктора формы не
меняет цепочку, т.е. не имеет к теме никакого отношения. Важно лишь то,
что форма, оставаясь еще невидимой, должна проанализировать, правильно
ли заполнены ее контролы и в зависимости от этого либо стать видимой,
либо завершить работу приложения. Для этого сама форма должна быть уже
создана (неважно, как именно), должны быть созданы все ее контролы (а их
сама форма и создает) и, кроме того, эти контролы должны быть заполнены
(что, очевидно тоже делает сама форма). Значит, метод Loaded и есть самое
подходящее место для такого анализа.
Так при чем здесь, Auto эта форма Create, или вручную?
Боюсь, что не соглашусь с мнением уважаемого Юрия Зотова. Если форма
не указана в списке AutoCreate, он никогда не будет создана до тех пор,
пока не будет вызван метод Form.Create() и не будет показана до тех
пор, пока не будет вызван метод Show (ShowModal).
А тогда зачем обрабатывать ее показ?
Ставлю бутылку Пепси, что еще ДО вызова обработчика OnCreate форма будет
ПОЛНОСТЬЮ создана со всеми ее контролами. Поскольку все это СНАЧАЛА создается
в конструкторе формы и лишь ПОТОМ возбуждается событие OnCreate.
Другое дело, что контролы еще не будут проинициализированы теми значениями,
которые были выставлены в Object Inspector. Но и это обходится очень легко,
поскольку специально для таких ситуаций предусмотрен метод Loaded. Он
автоматически вызывается сразу после полной инициализации любого компонента
(а форма - это тоже компонент).
Тогда попробуй сделать так:
выставить во всех контролах visible:=false
Потом уже если этот файл есть сделать их видимыми.
И кстате в OnCreate "контролы уже родились".
Я открываю базу данных и делаю проверку некоторых полей и в зависимости
от их содержимого отрисовываю контролы на форме. Например,
пишу сумму прописью в TMemo. Боюсь на onFormCreate контролы еще
не родились. Если же файл базы данных отсутствует (враг нажал в NC F8)
появляется формочка со "слепыми" контролами, которую я так не хочу
показывать пользователю!
Уважаемый Dmitriy!
Увы! Форма все равно появляется и приходится пользователю лапой
ее закрывать 8-(
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.