Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  12:08[Войти] | [Зарегистрироваться]
Ответ на вопрос № 2387

Вопросы с аналогичными сообщениями об ошибках:
  • Cannot change visible in onShow and onHide (4)

    06-04-2000 12:40

    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;

    Как закрыть форму из события OnShow?

    [+] Добавить в избранные вопросы

    Отслеживать ответы на этот вопрос по RSS

    Ответы:


    Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
    Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

    09-01-2007 01:02 | Комментарий к предыдущим ответам
    Зачем ее вообще открывать...

    Не прошло и семи лет, как решение было найдено! :)))

    08-01-2007 15:47
    Зачем ее вообще открывать а потом закрывать проверяйте значение полей
    и принимайте решение

    04-07-2001 14:44
    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;

    20-04-2000 12:56 | Сообщение от автора вопроса
    Ура! Заработало!

    Спасибо.

    20-04-2000 11:11
    Keep it simple,... :-)

    procedure TForm1.Form1OnShow (Sender : TObject);
    begin
      ...

      PostMessage (Handle, wm_Close, 0, 0);
    end;

    13-04-2000 21:37
    сорри, я конечно же имел ввиду if (TryToShowModal = mrOk)

    13-04-2000 19:49
    создавать и пользовать динамически формы, вещь нормальная. и я
    не вижу причин, по которым это может как-то помешать. пример

    with TAnyForm.Create(nil)
    do
      try
        if TryToShowModal
        then
          table.Post
        else
          table.cancel;
      finally
        Free;
      end;

    function TAnyForm.TryToShow:TModalResult;
    begin
      if not(Чего нибудь не хватает)
      then
        Result:=ShowModal
      else
        чего там надо сделать
    end;
         
    и все проверки в объекте формы, и программисту не надо о чем-то
    помнить...

    а еще лучше, если уж эта форма может вызываться во многих местах,
    было бы сделать соответствующий property в форме и Post/Cancel
    делать там.

    13-04-2000 09:38 | Сообщение от автора вопроса
    Извините Юрий!

    Я старался сформулировать вопрос предельно кратко.
    Имя Form1 лишь для примера, а у вас сложилось впечатление,
    что это единственная и причем главная форма проекта, который
    я не как не могу закрыть. У меня много форм и я хочу закрыть
    одну из многих форм, а не завершить программу.

    Простите великодушно, что ввел Вас в заблуждение.

    13-04-2000 02:15
    Павел!

    То, что Вы хотите прервать приложение, так и не показав его главную
    форму - это и называется "abnormal termination of a program and returns
    to the operating system". И не надо бояться слова "abnormal", когда для
    Вашей задачи оно на самом деле "normal".

    А для программы и для системы Halt ничуть не вреден. Эта штука применяется
    Borland"ом еще с первых версий Turbo Pascal. Так что не бойтесь, никуда
    Ваш водитель не денется и отличненько будет жить.

    А если уж очень страшно прекратить треп и хоть на что-нибудь решиться,
    то используйте рекомендуемую хелпом Application.Terminate. Но сразу говорю,
    что может и не сработать, это смотря куда оно будет вставлено. А вот Halt
    сработает точно.

    До свидания, мы слишком много обсуждаем пустячную проблему.

    12-04-2000 14:20
    Уважаемый Юрий!

    Как это не противно, заглянул в хелп: 

    procedure Halt [ ( Exitcode: Integer) ];

    Description

    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. Дискуссию можно продолжать бесконечно, но, наверное, стоит, наконец,
    взять - и просто попробовать. На практике.

    11-04-2000 08:43 | Сообщение от автора вопроса
    Уважаемый Юрий!

    Вероятно можно настраивать вид формы при помощи метода Loaded,
    но все таки для автосоздавемой формы, я думаю, он будет вызван при
    загрузке приложения. А в этот момент я не знаю какую таблицу выберет
    юзер и какая в ней сумма для прописи?

    Не могу так-же понять, как метод Halt поможет избежать показа формы
    при отсутствии таблицы? У TForm и TCustomForm вообще нет такого метода.

    procedure TForm1.Loaded;
    begin
      inherited Loaded;
      if Чего_нибудь_не_хватает then Halt
    end;

    11-04-2000 08:32 | Сообщение от автора вопроса
    Уважаемый Антон!
    Раньше я так и делал и формочки создавал
    автоматически при загрузке приложения. А потом вдруг
    стали кончаться ресурсы 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;

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

    Хотя не знаю стоить ли здесь "БАЗАРИТЬ" на эту тему?

    11-04-2000 01:00
    Черт возьми, господа, не слишком ли много мы уделяем внимания проблеме,
    которую метод Loaded решает в 5 секунд?

    Илья, Вы правильно боитесь, со мной надо соглашаться :о). По крайней
    мере, в данном случае, потому что СПОСОБ вызова конструктора формы не
    меняет цепочку, т.е. не имеет к теме никакого отношения. Важно лишь то,
    что форма, оставаясь еще невидимой, должна проанализировать, правильно
    ли заполнены ее контролы и в зависимости от этого либо стать видимой,
    либо завершить работу приложения. Для этого сама форма должна быть уже
    создана (неважно, как именно), должны быть созданы все ее контролы (а их
    сама форма и создает) и, кроме того, эти контролы должны быть заполнены
    (что, очевидно тоже делает сама форма). Значит, метод Loaded и есть самое
    подходящее место для такого анализа.

    Так при чем здесь, Auto эта форма Create, или вручную?

    10-04-2000 16:27
    Боюсь, что не соглашусь с мнением уважаемого Юрия Зотова. Если форма
    не указана в списке AutoCreate, он никогда не будет создана до тех пор,
    пока не будет вызван метод Form.Create() и не будет показана до тех
    пор, пока не будет вызван метод Show (ShowModal).
    А тогда зачем обрабатывать ее показ?

    09-04-2000 17:41
    признаюсь, не вижу смысла в закрытии окна во время открытия.
    ведь если не надо его открывать, то и не надо... может проще
    поступить так? описать метод

    procedure TAnyForm.TryToShow;
    begin
      if not(Чего нибудь не хватает)
      then
        Show
      else
        чего там надо сделать
    end;

    и где надо его вызывать...

    с уважением

    08-04-2000 06:53
    Ставлю бутылку Пепси, что еще ДО вызова обработчика OnCreate форма будет
    ПОЛНОСТЬЮ создана со всеми ее контролами. Поскольку все это СНАЧАЛА создается
    в конструкторе формы и лишь ПОТОМ возбуждается событие OnCreate.

    Другое дело, что контролы еще не будут проинициализированы теми значениями,
    которые были выставлены в Object Inspector. Но и это обходится очень легко,
    поскольку специально для таких ситуаций предусмотрен метод Loaded. Он
    автоматически вызывается сразу после полной инициализации любого компонента
    (а форма - это тоже компонент).

    Короче, сделайте так.

    type
      TForm1 = class(TForm)
      ...
      piblic
        procedure Loaded; override;
      ...
      end;

    procedure TForm1.Loaded;
    begin
      inherited Loaded;
      if Чего_нибудь_не_хватает then Halt
    end;

    07-04-2000 23:06
    Тогда попробуй сделать так:
    выставить во всех контролах visible:=false
    Потом уже если этот файл есть сделать их видимыми.
    И кстате в OnCreate "контролы уже родились".

    07-04-2000 14:06 | Сообщение от автора вопроса
    Уважаемый Юрий!

    Я открываю базу данных и делаю проверку некоторых полей и в зависимости
    от их содержимого отрисовываю контролы на форме. Например,
    пишу сумму прописью в TMemo. Боюсь на onFormCreate контролы еще
    не родились. Если же файл базы данных отсутствует (враг нажал в NC F8)
    появляется формочка со "слепыми" контролами, которую я так не хочу
    показывать пользователю!

    Уважаемый Dmitriy!

    Увы! Форма все равно появляется и приходится пользователю лапой
    ее закрывать 8-(

    07-04-2000 02:55
    А зачем из OnShow? Гораздо проще из OnCreate - просто Halt.

    06-04-2000 23:34
    Попробуй
      SendMessage (form1.handle,WM_DESTROY,0,0);

    Добавьте свое cообщение

    Вашe имя:  [Войти]
    Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
    контрольный вопрос:
    Вода мокрая или сухая?
    в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
    Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
    Тип сообщения:
    Текст:
    Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Вопросы с аналогичными сообщениями об ошибках:
  • Cannot change visible in onShow and onHide (4)


    Страница избранных вопросов Круглого стола.
  •   
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования