antarey Опубликовано 17 августа, 2022 Поделиться Опубликовано 17 августа, 2022 Добрый день. Помогите побороть access violation Есть главная форма frmMain, на ней лежит панелька rootLayout. По кнопкам создаю фреймы: private: // User declarations TFrame *WorkFrame; TPanel* FrameLayout; // -------------------------------------------------------------------------- void TfrmMain::CreateFrame(String FrameName) { if (FrameLayout != NULL) { delete FrameLayout; } FrameLayout = new TPanel(Application); FrameLayout->StyleLookup = "pushpanel"; FrameLayout->Name = "FrameLayout"; FrameLayout->Parent = rootLayout; FrameLayout->Align = TAlignLayout::Client; if (FrameName == "frmParam") { WorkFrame = new TfrmParam(FrameLayout); } if (FrameName == "frmEditor") { WorkFrame = new TfrmEditor(FrameLayout); WorkFrame->Tag = 1; } if (FrameName == "frmAdmin") { WorkFrame = new TfrmAdmin(FrameLayout); } WorkFrame->Parent = FrameLayout; WorkFrame->Align = TAlignLayout::Client; } // -------------------------------------------------------------------------- На фрейме frmEditor тоже есть панелька ItemsListRootLayout и в етом фрейме я создаю дополнительные фреймы TFrame *EditorWorkFrame; TPanel* EditorFrameLayout; // --------------------------------------------------------------------------- void TfrmEditor::CreateFrame(String FrameName) { if (EditorFrameLayout != NULL) { delete EditorFrameLayout; } EditorFrameLayout = new TPanel(Application); EditorFrameLayout->StyleLookup = "pushpanel"; EditorFrameLayout->Name = "EditorFrameLayout"; EditorFrameLayout->Parent = ItemsListRootLayout; EditorFrameLayout->Align = TAlignLayout::Client; if (FrameName == "frmNewArticleList") { EditorWorkFrame = new TfrmNewArticleList(Application); .................. } ............................... EditorWorkFrame->Parent = EditorFrameLayout; EditorWorkFrame->Align = TAlignLayout::Client; } // -------------------------------------------------------------------------- На фрейме frmNewArticleList лежит ListBox привязан к таблице( пробовал через грид таже ошибка) и есть обработчик //--------------------------------------------------------------------------- void __fastcall TfrmNewArticleList::NewArticleListItemClick(TCustomListBox * const Sender, TListBoxItem * const Item) { frmEditor->Label2->Text = dm->qLocalContent->FieldByName("title")->AsString; } //--------------------------------------------------------------------------- В результате при клике на итеме получаю access violation Подскажите где я накосячил. Заранее благодарен Цитата Ссылка на комментарий
0 Slym Опубликовано 17 августа, 2022 Поделиться Опубликовано 17 августа, 2022 (изменено) вангую в что frmEditor - переменная негде не присвоенная... нужно либо при создании TfrmNewArticleList передавать ссылку на текущий frmEditor, или по Parentам искать его вниз EditorWorkFrame->Parent = EditorFrameLayout; EditorWorkFrame->frmEditor = this; EditorWorkFrame->Align = TAlignLayout::Client; Изменено 17 августа, 2022 пользователем Slym Цитата Ссылка на комментарий
0 antarey Опубликовано 18 августа, 2022 Автор Поделиться Опубликовано 18 августа, 2022 14 часов назад, Slym сказал: EditorWorkFrame->frmEditor = this; правильно frmEditor = this; А можно в двух словах что ето делает? Цитата Ссылка на комментарий
1 krapotkin Опубликовано 18 августа, 2022 Поделиться Опубликовано 18 августа, 2022 записывает ссылку на себя в эту переменную. в целом, более удачным видится создание не панелей а фреймов, хотя, возможно, в вашем примере это лишь заглушка. еще: как-то так сложилась практика, что владельцем создаваемых компонентов является форма или фрейм, а не Application. это логично, потому что компоненты уничтожаются вместе с формой, на которой размещены. Именно за это отвечает параметр Owner. Цитата Ссылка на комментарий
Вопрос
antarey
Добрый день.
Помогите побороть access violation
Есть главная форма frmMain, на ней лежит панелька rootLayout.
По кнопкам создаю фреймы:
На фрейме frmEditor тоже есть панелька ItemsListRootLayout и в етом фрейме я создаю дополнительные фреймы
На фрейме frmNewArticleList лежит ListBox привязан к таблице( пробовал через грид таже ошибка) и есть обработчик
В результате при клике на итеме получаю access violation
Подскажите где я накосячил.
Заранее благодарен
Ссылка на комментарий
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.