Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.254.122] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, Уважаемые Знатоки!
Проблема такова: Создал проект, в котором есть основная форма (в автозапуске) и шесть дочерних (не в автозапуске)! удалил //TForm6 *Form6; //extern PACKAGE TForm6 *Form6; //Application->CreateForm(__classid(TForm6), &Form6); далее из формы основной произвожу обращение к форме №7: 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 и т.п. 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'. и с остальными формами та же история! Я так понял вылетел визуальный объект из основного потока или я что-то не так понял?! Помогите разобраться!!! Что я не так делаю?! Спасибо! |
Сообщ.
#2
,
|
|
|
Цитата 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. попробуйте объявить указатель в другом месте... Там, где он не умрёт не своей смертью Хотя, форма то модальная... А в каком месте хотя бы крашится?, создание экземпляра, отображение формы, или по событиям формы? |
Сообщ.
#3
,
|
|
|
VisualProg На сколько я понял из документации, что после
Цитата указатель освобождается...Form7->ShowModal(); и также из доков я понял что необходимо удалить Цитата из дочерней формы... (https://books.google.com.ua/books?id=bk2oFi...page&q&f=false)//TForm6 *Form6; //extern PACKAGE TForm6 *Form6; //Application->CreateForm(__classid(TForm6), &Form6); я просто закоментировал... да вот в том то и дело, что форма модальная... крах происходит при попытке отображения формы! |
Сообщ.
#5
,
|
|
|
Цитата VisualProg @ Спасибо!в приведенной сцылке на книгу есть такой пример! пробовал через Цитата критическая ошибка, программа сразу закрывалась...FormX = new TFormX; все на том же Цитата Form7->ShowModal(); VisualProg, подтолкнул на мысль, добавить заголовочный файл основной формы... и пока ошибку не отловил: в основной форме (Form1) объявил в Form1.h private: // User declarations TForm2 *Form2; TForm3 *Form3; TForm4 *Form4; //TForm5 *Form5; TForm6 *Form6; TForm7 *Form7; и дальше Form1.cpp в OnClick N-кнопки (N - 2..7) : 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'. Чудеса... |
Сообщ.
#6
,
|
|
|
Я Сглупил!!! ошибка возникала из-за того, что указатель не освобождался... исправил код создания модальной формы:
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;} пока полет нормальны! Может есть лучший подход?! Прошу критики! Спасибо! (тему пока не закрываю... ) |
Сообщ.
#7
,
|
|
|
Цитата zhuravlev80 @ Может есть лучший подход?! Это стандартный подход для VCL (у которой ноги растут из Delphi\pascal-я) - удалять объект "ручками" в блоке try-finally, не полагаясь на сладкие\детские плюшки типа auto_ptr |
Сообщ.
#8
,
|
|
|
leo, не спорю...
Ошибка так и не исчезла, всплывает после 3-4 запусков дочерних форм... Покопался в сети и преобразил код: 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)); Это чудеса... я уже не знаю что и делать... |
Сообщ.
#9
,
|
|
|
Строку:
Цитата const auto_ptr<TFormN> NewFormN(new TFormN(NULL)); заменил на Цитата const auto_ptr<TFormN> NewFormN(new TFormN(this)); пока тестирую, ошибки не наблюдаю... |
Сообщ.
#10
,
|
|
|
Цитата zhuravlev80 @ пока тестирую, ошибки не наблюдаю... Есть ещё вариант, попробовать использовать std::shared_ptr, вместо auto. shared_ptr, меня лично, ещё не подводил |
Сообщ.
#11
,
|
|
|
Цитата VisualProg @ Спасибо. Попробую. Воспользуюсь Вашим советом. |