![]() |
|
![]() ![]() ![]() |
|
SydeX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 3.11.2004 Где: Таллинн, Эстония Репутация: нет Всего: нет |
Ребят, вот такая проблема, я уверен что где то мои грабли но хз.
Когда работает приложение - скажем запускается функция х - всё работает нормально. Если вызываем форму - через функцию которая вызывается по какому нибудь событию все окей. Но если сами вызываем - то от мёртвого осла уши, вылетает с ошибкой отказа в доступе. Для иллюстративности пример. #include "../settings/settings.h" #include "main.h" ... void __fastcall TForm1::user_login(TObject * Sender) { ... if(Form1->public_sys!=0) { Form4->ShowModal(); ... __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { если попробую сделать тут так: Form1->user_login(dynamic_cast<SomeMTFType *>(Somepointer)); получу грабли вида: Access violation at adress 0040361F Read of adress FFFFFF на динамиккаст не обращайте внимания - если его убрать и убрать из дефинишна функции параметр вида обьект - то работать всё равно не будет но уже в обоих случаях т.к. вызов по евенту требует обязательно наличие параметра типа TObject * Sender; в то же время если насобачить на форму BitBtn1 и прикрутить BitBtn1->OnClick = user_login; то без проблем. Я заранее прошу прощения за тупость вопроса, я уверен что просто где то что-то недочитал про билдеровские особенности вызова форм - но сколько не ртфмился - везде пишут что должно работать и так и так. Проблема в том что - при помощи этих методов надо сообщения об ошибке выводить или логин-промты - я так и не понял где мои грабли что у меня не выходит. Заранее благодарен, Виктор Это сообщение отредактировал(а) SydeX - 25.1.2005, 18:11 |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
не совсем понял что нужно сделать.
вызвать метод формы, принимающий указатель на TObject? тогла так: Form1->user_login((TObject *)NULL); -- всеравно ничего полезного, судя по коду, ты туда не передаеш Добавлено @ 18:35 + не плохо бы указать на какой именно строке ошибка вылазит. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
SydeX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 3.11.2004 Где: Таллинн, Эстония Репутация: нет Всего: нет |
Можно и нулл сути дела не меняет.
ошибка вылетает вот на чём Form4->ShowModal(); Да нужно просто вызвать форму, но не из функции которая по какому то евенту срабатывает. А просто из обычной функции. Ну упрощая идею скажем void main(void) { Form4->ShowModal(); } и вот хочу чтобы енто дело скажем в другой какой то функции скажем вот по такому коду работало if (Form1->status<0) main(); только вот не работает - а работает только так: void __fastcall main(TObject * Sender) { Form4->ShowModal(); } .... Menu 1_1->OnClick = main; почему только так ? может есть какие то идеи.... P.S. Если сделать просто вот так: if (Form1->status<0) Form4->ShowModal; // ну или Show() результат не меняется То толку тоже мало - если функция в которой находится строка была вызвана не по эвенту какому либо - а просто откуда то, либо при загрузке - как скажем компонент класса TForm::TForm вылетить с ошибкой. Ошибка та же. Вот из чего вытекает вопрос - почему так и как исправить. Это сообщение отредактировал(а) SydeX - 25.1.2005, 20:13 |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
а ты эту форму где-то создаеш?
во втором случае, наверное, все-таки так: void __fastcall FormX::main(TObject * Sender) { Form4->ShowModal(); } работает? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
SydeX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 3.11.2004 Где: Таллинн, Эстония Репутация: нет Всего: нет |
да это то работает если тобой описанную функцию назначить евентом к чему нибудь а потом сделать этот евент (то бишь кликнуть мышью куда надо или что там ещё в евенте) - а вот так работать не будет:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { FormX->ShowModal(); если просто вызывать функцию без действий без евентов. Короче, объясню ещё раз, упрощу. Задача элементарная - вызывается приложение с основной формой Form1 Надо: вызвать при загрузке приложения из Form1 - Form2 как без бага реализовать ? Вариант который напрашивается на язык я в данном сабже как видите описал выше - ошибку описал тоже. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
конечно не будет -- объект-то не создан.
т.е. нужно что-то типа TFormX *FormX = new TFormX(NULL); перед вызовом приписать -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
SydeX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 3.11.2004 Где: Таллинн, Эстония Репутация: нет Всего: нет |
не помогает - та же ошибка тот же код та же строка - сделал так:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { if(FormX==NULL) TFormX * FormX = new TFormX FormX(NULL); FormX->ShowModal(); потом переделал и так, толку никакого: __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TFormX * FormX = new TFormX FormX(NULL); FormX->ShowModal(); |
|||
|
||||
Quadruple |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 4.11.2004 Репутация: нет Всего: нет |
SydeX
Тебе правильно сказали, форма еще не создана, а ты ее вызываешь, даже если пытаешся вызвать другую форму, в конструкторе неработает. Попробуй вызывать в событии OnCreate, должно сработать. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
это:
new TFormX FormX(NULL); что за бред? ![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
3,14 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 1 Всего: 24 |
Если уж так нужно создавать вызывать одну форму из конструктора другого (ИМХО в корне не верное решение) то нужно просто правильно расставить порядок создания форм, для этого открываешь Project1.cpp и заменяешь:
на
А new TFormX нужно вызывать только если TFormX у тебя не создаётся автоматически (по умолчанию создаётся) Это сообщение отредактировал(а) 3,14 - 26.1.2005, 10:30 -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
||||
|
|||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: 1 Всего: 3 |
Ох не стоит так делать... Я раз попытался изменить порядок создания форм - все заработало, но возникла проблема в другом месте. После получаса мучений вернул обратно и переделал место, где была ошибка.
|
|||
|
||||
Adil' |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 4 Всего: 15 |
Да нет, ничего страшно, можно поменять порядок создания, нужно только следить за первой создающейся - она станет главной формой приложения. Хотя всё-равно извращение
Под if новую переменную объявляешь, да еще с такимже именем, что и глобальная -------------------- Удачи |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |