Cannot change visible in onshow or onhide ошибка

I have a very strange problem with the Delphi 2006 IDE.

If the IDE is minimized, and the PC is locked. I return to the pc, unlock it and maximize the IDE, I sometimes get the error «Cannot change Visible in OnShow or OnHide».

If this happens, I have to kill the IDE with the taskmanager.

Is there anybody out there who has the same problem? And if possible a solution?

I suspect that some third party components are involved, but my coworkers never experience this error.

Jim McKeeth's user avatar

Jim McKeeth

38.2k24 gold badges120 silver badges194 bronze badges

asked Oct 2, 2008 at 7:19

Toon Krijthe's user avatar

Toon KrijtheToon Krijthe

52.9k38 gold badges146 silver badges202 bronze badges

0

Yes I have noticed the same problem when using Terminal Servers. I use GExperts. If you can reproduce the problem you should report it on http://qc.codegear.com/

answered Oct 2, 2008 at 10:46

Lars Truijens's user avatar

Lars TruijensLars Truijens

42.8k6 gold badges127 silver badges143 bronze badges

4

Is this connected to a specific form / forms that you have open at the moment?

If not, then it’s probably not a 3rd party component that causes problems, but an expert you have added to the Delphi. Try disabling all experts. If that solves the problem, add them back one by one.

answered Oct 2, 2008 at 7:47

gabr's user avatar

1

Other way with no need to kill IDE in Taskmanager is to display Taskbar settings and turn off «show above other windows». Use this setting, click OK on IDE err. msg and then set it back. With some practice it could be usefull by time…

Btw: colleague’s IDE layout setting is «classic undocked» and he never had this problem.

But something like bugfix is still missing :/
(WinXP, TurboDelphi 2006)

answered Jan 27, 2009 at 8:34

Ошибка после обновления с 7.0 на 7.1 Cannot change Visible in OnShow or OnHide

Аватара пользователя


Tim

Чт окт 18, 2018 5:39 pm

Чт окт 18, 2018 5:39 pm

#31909 

На части клиентских машин после обновления с версии 7.0 на 7.1 при запуске программы вылетает ошибка «Cannot change Visible in OnShow or OnHide»
на 70% клиентов всё ок

Сответственно чат не стартует и выдаёт сообщения пока не завершишь процесс в диспетчере задач.
Старые Win 7 и свежие Win 10 со всеми апдейтами — закономерности сходу найти не удалось

скрины и логи отправил на почту

Вложения

chat2.jpg

Под Администратором
chat2.jpg (76.78 КБ) Просмотров: 4060


chat1.jpg

Права пользователя
chat1.jpg (36.72 КБ) Просмотров: 4060

Здравствуйте.

Попробуйте заменить mcclient.exe на проблемных местах. Ссылку на закачку я выслал вам почтой.

Team lead
Чат со мной

Аватара пользователя

Tim

Пт окт 19, 2018 2:20 pm

Пт окт 19, 2018 2:20 pm

#31915 

Файл заменили:

WIN7: При запуске файла от имени администратора ошибки не происходит, чат начинает работать нормально. Если же файл, открытый ранее от имени администратора, закрыть и открыть в обычном режиме — проблема возвращается .

WIN10: После замены файла проблема сохранилась, ошибка та же

логи отправил почтой

Права администратора тут не при чём, если вы запускаете программу от имени другого пользователя — он просто создаст новый профиль.

Смотрю логи.

Team lead
Чат со мной

Я не знаю, с чем может быть связана эта ошибка. Свяжитесь со мной чатом, попробую посмотреть удалённо.

Team lead
Чат со мной

Аватара пользователя

Tim

Пт окт 19, 2018 4:46 pm

Пт окт 19, 2018 4:46 pm

#31922 

Спасибо за подсказку!

Методом тыка оказалось что помогает очистка папки db — после переподключения всё заработало на 9 из 10 проблемных компах. Причем logs.db потом без проблем можно вернуть, вместе с историей

Последний буду мучить в пн, если не получится — свяжусь

В общем-то не за что :)

Team lead
Чат со мной

Вроде нашли причину проблемы. Поправили, на будущее.

Team lead
Чат со мной

delphidelphi-7

i am using Delphi 7. When the system times out, or if your computer goes to sleep and then comes back up the system gives an error: » Cannot change Visible in OnShow or OnHide.» Can you please say general reasons for this error

Best Solution

The reason that this error occurs is most likely that you show or hide a control in response to its OnShow or OnHide event. The solution is to change your code so that you no longer try to change the visibility of a control at such an event.

Related Solutions

Delphi – Error “Cannot change Visible in OnShow or OnHide” in Delphi IDE

Yes I have noticed the same problem when using Terminal Servers. I use GExperts. If you can reproduce the problem you should report it on http://qc.codegear.com/

Delphi onshow main form / modal form

One commonly used option is to post yourself a message in the form’s OnShow. Like this:

const
  WM_SHOWMYOTHERFORM = WM_USER + 0;

type
  TMyMainForm = class(TForm)
    procedure FormShow(Sender: TObject);
  protected
    procedure WMShowMyOtherForm(var Message: TMessage); message WM_SHOWMYOTHERFORM;
  end;

...


procedure TMyMainForm.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SHOWMYOTHERFORM, 0, 0);
end;

procedure TMyMainForm.WMShowMyOtherForm(var Message: TMessage);
begin
  inherited;
  with TMyOtherForm.Create(nil) do begin
    try
      ShowModal;
    finally
      Free;
    end;
  end;
end;

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Как спрятать форму?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,

      Senior Member

      ****

      Рейтинг (т): 4

      Надо спрятать форму + добавить иконку в трей.
      Иконку я добавил, но форма не прячеться
      После прочтения DRKB 2.2 был написан такой код

      ExpandedWrap disabled

          type

          TDisconnectForm = class(TForm)

          procedure Ic(n:Integer;Icon:TIcon);

            procedure FormShow(Sender: TObject);

             protected

          procedure IconMouse(var Msg: TMessage); message WM_USER + 1;

        procedure ControlWindow(var Msg: TMessage); message WM_SYSCOMMAND; // WM_SYSCOMMAND       = $0112;

          end;

        var

          DisconnectForm: TDisconnectForm;

          Time:Integer;

        implementation

        uses WarningFormU;

        {$R *.dfm}

        procedure TDisconnectForm.FormShow(Sender: TObject);

        var

        sTime:string;

        begin

        sTime:=Paramstr(1);

        try

        {Проверка полученных данных}

        //Time:=strtoint(stime);

        Time:=2;

        except

        ShowMessage(‘Ошибка в параметре’);

        Close;

        application.Terminate;

        exit;

         end;

        if (time<=0) then begin

        ShowMessage(‘Не положительное число’);

        Close;

        application.Terminate;

        exit;

        end;

        //Праметр задан верно — включаем таймер

        Inc(time);

        ic(1,application.Icon);

        showwindow(handle, SW_hide);

        showwindow(Application.handle, SW_HIDE);

        {

        В DRKB написано что так можно спрятать форму

        Но она не прячеться — она остаеться видимой

        }

        Timer1.Enabled:=true;

        end;

        procedure Tdisconnectform.ControlWindow(var Msg: TMessage);

        begin

        if (Msg.WParam = SC_MINIMIZE) then

         begin

        Ic(1, Application.Icon);

        showwindow(Handle, SW_hide);

        //showwindow(Application.handle, SW_HIDE);

        end

        else

        inherited;

        end;

        Procedure TDisconnectForm.Ic(n:Integer;Icon:TIcon);

        Var Nim:TNotifyIconData;

        begin

         With Nim do Begin

         cbSize:=SizeOf(Nim);

         Wnd:=disconnectform.Handle;

         uID:=1;

         uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;

         hicon:=Icon.Handle;

         uCallbackMessage:=WM_USER+1;

         szTip:=’Tip’

         End;

        Case n OF

         1: Shell_NotifyIcon(NIM_ADD,@Nim); //

         2: Shell_NotifyIcon(NIM_DELETE,@Nim); //

         3: Shell_NotifyIcon(NIM_MODIFY,@Nim); //

         End;

        end;

        procedure Tdisconnectform.IconMouse(var msg:Tmessage);

        var

        p: tpoint;

        begin

        GetCursorPos(p);

        if (Msg.LParam  = WM_RBUTTONUP) then

         begin

         PopupMenu1.Popup(p.X,p.Y);

         PostMessage(Handle, WM_NULL, 0, 0);

         end;

        end;

      Как спрятать форму?


      SPrograMMer



      Сообщ.
      #2

      ,

        У формы вообще то сть свойство Visible и Метод Hide…


        s-mike



        Сообщ.
        #3

        ,

          Хм, а где Application.Minimize?


          мыш



          Сообщ.
          #4

          ,

            также если хочешь чтобы приложение загрузилось сразу без формы, можно написать application.showmainform:=false в файле проекта


            Delphist



            Сообщ.
            #5

            ,

              Senior Member

              ****

              Рейтинг (т): 4

              Цитата

              У формы есть свойство Visible

              Цитата

              Хм, а где Application.Minimize?

              I)Пробуем

              ExpandedWrap disabled

                Visible:=false

              1) В TDisconnectForm.FormShow
              Получаем:
              Debugger Exception Notification

              Project Disconnect.exe raised exception class EInvalidOperation with message
              ‘Cannot change Visible in OnShow or OnHide’. Process stopped. Use Step or
              Run to continue.


              ( Нельзя менять visible в OnShow)

              2) В TDisconnectForm.FormCreate
              Получаем:
              Форма не прячеться ( но иконка в трее есть )

              II)Пробуем

              ExpandedWrap disabled

                Application.Minimize

              1) В TDisconnectForm.FormShow
              Получаем:
              Форма отображаеться.
              Если ее развернуть (из taskbar) и снова свернуть — тогда не отображаеться.

              2) В TDisconnectForm.FormCreate
              Форма все равно не прячеться (она спрятана за остальными окнами)

              III)Пробуем

              ExpandedWrap disabled

                Application.Minimize; Visible:=false;

              1) В TDisconnectForm.FormShow
              Получаем:
              Debugger Exception Notification
              Project Disconnect.exe raised exception class EInvalidOperation with message
              ‘Cannot change Visible in OnShow or OnHide’. Process stopped. Use Step or
              Run to continue.

              2) В TDisconnectForm.FormCreate
              Форма все равно не прячеться (она спрятана за остальными окнами)


              s-mike



              Сообщ.
              #6

              ,

                Цитата Delphist @

                1) В TDisconnectForm.FormShow
                Получаем:
                Debugger Exception Notification

                Project Disconnect.exe raised exception class EInvalidOperation with message
                ‘Cannot change Visible in OnShow or OnHide’. Process stopped. Use Step or
                Run to continue.
                ( Нельзя менять visible в OnShow)

                Компилятор понятно написал, в чем ошибка. Visible формы можно поменять в OnCreate или в design-time.

                Добавлено
                Только для главной формы нужно делать так:

                ExpandedWrap disabled

                  procedure TForm1.FormCreate(Sender: TObject);

                  begin

                    Application.ShowMainForm := False;

                  end;

                Сообщение отредактировано: s-mike


                Delphist



                Сообщ.
                #7

                ,

                  Senior Member

                  ****

                  Рейтинг (т): 4

                  Цитата s-mike

                  Только для главной формы нужно делать так:
                  Application.ShowMainForm := False;

                  Сделал, но

                  ExpandedWrap disabled

                    TDisconnectForm.FormShow

                  — так как форма не появляеться,
                  событие OnShow не воникает => код

                  ExpandedWrap disabled

                    ic(1,application.Icon);

                    showwindow(handle, SW_hide);

                    showwindow(Application.handle, SW_HIDE);

                  не выполняеться => прога в трей не прячеться.
                  А по условию (см 1й пост )

                  Цитата

                  Надо спрятать форму + добавить иконку в трей.


                  SPrograMMer



                  Сообщ.
                  #8

                  ,

                    Давай сделаем маааааленький эксперимент.
                    Кинь на ужасную форму кнопку и при нажатии на неё вызыви код, делающий махинации в трее и плюс убирает форму, ну примерно так:

                    ExpandedWrap disabled

                      procedure TForm1.Button10OnClick(Sender:TObject);

                      Begin

                         HideToSysTray; // прячемся

                         Form1.Visible:=False

                      End;

                    О результатх скажи.


                    Delphist



                    Сообщ.
                    #9

                    ,

                      Senior Member

                      ****

                      Рейтинг (т): 4

                      2 SPrograMMer
                      Все работает ;)
                      Но надо чтобы форма сама пряталась ( без моего вмешательства )


                      Kanes



                      Сообщ.
                      #10

                      ,

                        Delphist,

                        Цитата

                        Но надо чтобы форма сама пряталась ( без моего вмешательства )

                        Поясни, не понемаю какая разница :huh: ?????


                        Delphist



                        Сообщ.
                        #11

                        ,

                          Senior Member

                          ****

                          Рейтинг (т): 4

                          Поясняю

                          Форму можно спрятать так:

                          ExpandedWrap disabled

                            procedure TForm1.Button1Click

                            begin

                            Visible:=false;

                            end;

                          (Форма прячеться по нажатию на кнопку — после моих действий)

                          Можно спрятать так:

                          ExpandedWrap disabled

                            procedure TForm1.FormShow

                            begin

                            Visible:=false;

                            end;

                          (Такой трюк не пройдет, но тем не менее — форму прячет сама прога)


                          SPrograMMer



                          Сообщ.
                          #12

                          ,

                            Delphist Я знал что после щелчка будет все работать, я просто хотел тебе маааленькую вещь показать — как мне кажется, по крайне мере я так делал когда-то, форма сразу после загрузки ДОЛЖНА показаться, а затем — прячем её. Я имею ввиду то что б можно бвло применить

                            ExpandedWrap disabled

                                Form1.Visible:=False

                            Нужно что б в этот момент форма была видима. Соответственно кидаем на форму таймер, установив ему интервал поменьше, можно 10 мс — тогда эффект может быть такой, что как форма отрисовалась и спраталясь, не будет заметно человеческому глазу.
                            и пишем ему:

                            ExpandedWrap disabled

                                Procedure TForm1.Timer1Timer(Sender:TObject);

                                Begin  

                                   Timer1.Enabled:=False; // что б больше не реагировал

                                   HideToSysTray; // прячемся в трей

                                End;

                            Теперь то работает?

                            Добавлено
                            А то 2SPrograMMer, 2SPrograMMer


                            RPC-13



                            Сообщ.
                            #13

                            ,

                              не самый подходящий способ, но.. =)

                              в OnCreate гл. формы:

                              сохрани в переменные — положение, длину и ширину формы

                              ExpandedWrap disabled

                                form1.top:=3000;

                                form1.left:=3000;

                              или

                              ExpandedWrap disabled

                                form1.Top:=0;

                                form1.Left:=0;

                                form1.Width:=0;

                                form1.Height:=0

                              в нужный момент присвой форме те переменные которые сохранил.
                              также можно form1.visible=true/false к этому делу подключить.


                              Delphist



                              Сообщ.
                              #14

                              ,

                                Senior Member

                                ****

                                Рейтинг (т): 4

                                Цитата

                                Теперь то работает?

                                Работает. :)

                                Цитата

                                не будет заметно человеческому глазу.

                                Заметно.
                                Хотя это уже мелочи. ;)

                                2 SPrograMMer,s-mike,мыш:
                                Спасибо


                                miksayer



                                Сообщ.
                                #15

                                ,

                                  Цитата SPrograMMer @

                                  У формы вообще то сть свойство Visible и Метод Hide…

                                  а если эта форма главная? тогда нужно делать так:

                                  ExpandedWrap disabled

                                    Application.ShowMainForm:=false;

                                  если я, конечно, не ошибаюсь

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • Delphi: Общие вопросы
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,1288 ]   [ 16 queries used ]   [ Generated: 21.09.23, 09:07 GMT ]  

                                  Автор Сообщение

                                  Заголовок сообщения: Ошибка из-за обновления библиотеки

                                  СообщениеДобавлено: 01 ноя 2013, 15:35 

                                  Не в сети



                                  Зарегистрирован: 15 янв 2013, 16:17
                                  Сообщений: 11

                                  D2010
                                  TADODataDriver -> TMemTableEh -> DataSource -> TDbGridEh

                                  В моем проекте есть таблица в которой при нажатии кнопки в ячейке (EditButtons) появляется всплывающее окошко, сделанное по аналогии с примером Demo1 Grid2 столбец VendorName. Так вот все работало, но начиная с версии 5,6 возникает ошибка со след. текстом «Cannot change Visible in OnShow or OnHide» причем эта ошибка возникает только при попытке изменить значение во вновь вставленной записи. Т.е.на старых записях без проблем, но вот если вставить новую запись внести какие-либо значения в соседние ячейки, а потом нажать EditButtons возникает ошибка. С чем это связано ? Повторюсь на старых версиях библиотеки этого не было.

                                  Вернуться наверх

                                  Профиль  

                                  Administrator

                                  Заголовок сообщения: Re: Ошибка из-за обновления библиотеки

                                  СообщениеДобавлено: 01 ноя 2013, 21:07 

                                  Не в сети
                                  Администратор



                                  Зарегистрирован: 19 дек 2011, 17:40
                                  Сообщений: 837

                                  Добрый день.

                                  В описании ошибки написано, что вы пытаетесь изменить свойство Visible в событии OnShow or OnHide.
                                  Иногда глючит сам VCL и некорректно выдает текст ошибки.
                                  Единственная возможносто однозначно понять причину ошибки, это пройтись отладчиком по вызову формы и разобраться почему происходит присоваивание Visible в неподходящее время.

                                  _________________
                                  Best regards
                                  Admin

                                  Вернуться наверх

                                  Профиль  

                                  Alesandr

                                  Заголовок сообщения: Re: Ошибка из-за обновления библиотеки

                                  СообщениеДобавлено: 02 ноя 2013, 08:55 

                                  Не в сети



                                  Зарегистрирован: 15 янв 2013, 16:17
                                  Сообщений: 11

                                  Значит проблему решил. Может кому пригодится :)

                                  было:
                                  DbGridEh.Columns[].EditButtons[] — событие Onclick

                                  переделал на:
                                  DbGridEh.Columns[] свойство ButtonStyle:=cbsDropDown — событие OnEditButtonClick . И назойливая ошибка перестала иметь место. Но на стар. версиях, повторюсь такого не было

                                  Вернуться наверх

                                  Профиль  

                                  Понравилась статья? Поделить с друзьями:

                                  Интересное по теме:

                                • Can moment reduction ошибка на бмв
                                • Cannot find appropriate setup exe file matlab ошибка
                                • Candy cdp 4709 ошибки
                                • Cannot enter home directory using как исправить ошибку
                                • Can interconnect failure ошибка ман тга

                                • Добавить комментарий

                                  ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: