На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Динамическое создание обектов , ошибка (Непонятное исключение)
    Здравствуйте, Уважаемые Знатоки!
    Проблема такова:
    Создал проект, в котором есть основная форма (в автозапуске) и шесть дочерних (не в автозапуске)!
    удалил
    ExpandedWrap disabled
      //TForm6 *Form6; //extern PACKAGE TForm6 *Form6; //Application->CreateForm(__classid(TForm6), &Form6);

    далее из формы основной произвожу обращение к форме №7:
    ExpandedWrap disabled
       try{
                      const auto_ptr<TForm7> Form7(new TForm7(this));
       
                      Form7->Top = Form1->Top - 5;
                      Form7->Left = Form1->Left - Form7->Width - 5;
       
                          Form7->ShowModal();
                  } catch (...) {}

    и так же к 6 и т.п.
    ExpandedWrap disabled
       try{
                      const auto_ptr<TForm6> Form6(new TForm6(this));
       
                      Form6->Top = Form1->Top - 5;
                      Form6->Left = Form1->Left - Form6->Width - 5;
       
                          Form6->ShowModal();
                  } catch (...) {}

    Собираю проект, без ошибок! (Билдер 10.2 Токио).
    запускаем.
    открываю форму 7 - закрываю ее.
    открываю форму 6 - возникает ОШИБКА
    First chance exception at $0043EBE1. Exception class $C0000005 with message 'access violation at 0x0043ebe1: read of address 0x0000000c'.
    и с остальными формами та же история!

    Я так понял вылетел визуальный объект из основного потока или я что-то не так понял?!

    Помогите разобраться!!! Что я не так делаю?!

    Спасибо!
    Сообщение отредактировано: zhuravlev80 -
      Цитата zhuravlev80 @
      //TForm6 *Form6;

      Цитата zhuravlev80 @
      //extern PACKAGE TForm6 *Form6;

      Цитата zhuravlev80 @
      //Application->CreateForm(__classid(TForm6), &Form6);

      Прямо так, вот это и удалили о_О?

      Добавлено
      Цитата zhuravlev80 @
      try{
      const auto_ptr<TForm7> Form7(new TForm7(this));

      Form7->Top = Form1->Top - 5;
      Form7->Left = Form1->Left - Form7->Width - 5;

      Form7->ShowModal();
      } catch (...) {}


      Предположу, что блок закончился, ваш указатель подумал что время жизни объекта пришло к концу, и вызвал деструктор, далее, вы пытаетесь работать с уничтоженной формой, отсюда и access violation. попробуйте объявить указатель в другом месте... Там, где он не умрёт не своей смертью :)

      Хотя, форма то модальная... А в каком месте хотя бы крашится?, создание экземпляра, отображение формы, или по событиям формы?
      Сообщение отредактировано: VisualProg -
        VisualProg На сколько я понял из документации, что после
        Цитата
        Form7->ShowModal();
        указатель освобождается...
        и также из доков я понял что необходимо удалить
        Цитата
        //TForm6 *Form6; //extern PACKAGE TForm6 *Form6; //Application->CreateForm(__classid(TForm6), &Form6);
        из дочерней формы... (https://books.google.com.ua/books?id=bk2oFi...page&q&f=false)
        я просто закоментировал...

        да вот в том то и дело, что форма модальная... крах происходит при попытке отображения формы!
        Сообщение отредактировано: zhuravlev80 -
          Пробовали смотреть здесь? (на всякий случай)
            Цитата VisualProg @
            Спасибо!
            в приведенной сцылке на книгу есть такой пример!
            пробовал через
            Цитата
            FormX = new TFormX;
            критическая ошибка, программа сразу закрывалась...
            все на том же
            Цитата
            Form7->ShowModal();


            VisualProg, подтолкнул на мысль, добавить заголовочный файл основной формы... и пока ошибку не отловил:
            в основной форме (Form1) объявил в Form1.h
            ExpandedWrap disabled
              private: // User declarations
              TForm2 *Form2;
              TForm3 *Form3;
              TForm4 *Form4;
              //TForm5 *Form5;
              TForm6 *Form6;
              TForm7 *Form7;

            и дальше Form1.cpp в OnClick N-кнопки (N - 2..7) :
            ExpandedWrap disabled
              try{
              const auto_ptr<TFormN> FormN(new TFormN(this));
               
              FormN->Top = Form1->Top - 5;
              FormN->Left = Form1->Left - FormN->Width - 5;
               
              FormN->ShowModal();
              } catch (...) {}


            Добавлено
            ошибка осталась, теперь даже у основной формы при перерисовке (- свернул и развернул)
            First chance exception at $0043EB83. Exception class $C0000005 with message 'access violation at 0x0043eb83: write of address 0x04380434'.
            Чудеса...
            Сообщение отредактировано: zhuravlev80 -
              Я Сглупил!!! ошибка возникала из-за того, что указатель не освобождался... исправил код создания модальной формы:
              ExpandedWrap disabled
                try{
                const auto_ptr<TFormN> FormN(new TFormN(this));
                 
                FormN->Top = Form1->Top - 5;
                FormN->Left = Form1->Left - FormN->Width - 5;
                 
                FormN->ShowModal();
                } __finally{delete FormN;}

              пока полет нормальны!
              Может есть лучший подход?! Прошу критики!
              Спасибо!
              (тему пока не закрываю... )
              Сообщение отредактировано: zhuravlev80 -
                Цитата zhuravlev80 @
                Может есть лучший подход?!

                Это стандартный подход для VCL (у которой ноги растут из Delphi\pascal-я) - удалять объект "ручками" в блоке try-finally, не полагаясь на сладкие\детские плюшки типа auto_ptr ;)
                  leo, не спорю... :)

                  Ошибка так и не исчезла, всплывает после 3-4 запусков дочерних форм...
                  Покопался в сети и преобразил код:
                  ExpandedWrap disabled
                    Application->ProcessMessages();
                                try{
                                    const auto_ptr<TFormN> NewFormN(new TFormN(NULL));
                                    TFormN * const FormN = NewFormN.get();
                                    
                                        FormN->ShowModal();
                                        //FormN = NULL;
                                }catch(...){}

                  Ошибка стала появляться реже и приводит к закрытию программы!
                  возникает на строке
                  Цитата
                  const auto_ptr<TFormN> NewFormN(new TFormN(NULL));

                  Это чудеса... я уже не знаю что и делать... :wall:
                    Строку:
                    Цитата
                    const auto_ptr<TFormN> NewFormN(new TFormN(NULL));

                    заменил на
                    Цитата
                    const auto_ptr<TFormN> NewFormN(new TFormN(this));

                    пока тестирую, ошибки не наблюдаю...
                      Цитата zhuravlev80 @
                      пока тестирую, ошибки не наблюдаю...


                      Есть ещё вариант, попробовать использовать std::shared_ptr, вместо auto. shared_ptr, меня лично, ещё не подводил :D
                        Цитата VisualProg @

                        Спасибо. Попробую. Воспользуюсь Вашим советом.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0355 ]   [ 16 queries used ]   [ Generated: 29.03.24, 14:04 GMT ]