Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Народ, спасите чайника в очередной раз, Создание форм - почему вылетает 
:(
    Опции темы
SydeX
Дата 25.1.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
_hunter
Дата 25.1.2005, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



не совсем понял что нужно сделать.
вызвать метод формы, принимающий указатель на TObject?

тогла так:
Form1->user_login((TObject *)NULL); -- всеравно ничего полезного, судя по коду, ты туда не передаеш
Добавлено @ 18:35
+ не плохо бы указать на какой именно строке ошибка вылазит.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
SydeX
Дата 25.1.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
_hunter
Дата 25.1.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а ты эту форму где-то создаеш?

во втором случае, наверное, все-таки так:
void __fastcall FormX::main(TObject * Sender) {
Form4->ShowModal();
}
работает?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
SydeX
Дата 25.1.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.11.2004
Где: Таллинн, Эстония

Репутация: нет
Всего: нет



да это то работает если тобой описанную функцию назначить евентом к чему нибудь а потом сделать этот евент (то бишь кликнуть мышью куда надо или что там ещё в евенте) - а вот так работать не будет:

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) {
FormX->ShowModal();

если просто вызывать функцию без действий без евентов.

Короче, объясню ещё раз, упрощу.
Задача элементарная - вызывается приложение с основной формой Form1
Надо: вызвать при загрузке приложения из Form1 - Form2
как без бага реализовать ?

Вариант который напрашивается на язык я в данном сабже как видите описал выше - ошибку описал тоже.
PM MAIL WWW ICQ   Вверх
_hunter
Дата 25.1.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



конечно не будет -- объект-то не создан.
т.е. нужно что-то типа TFormX *FormX = new TFormX(NULL); перед вызовом приписать


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
SydeX
Дата 25.1.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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();


PM MAIL WWW ICQ   Вверх
Quadruple
Дата 25.1.2005, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



SydeX
Тебе правильно сказали, форма еще не создана, а ты ее вызываешь, даже если пытаешся вызвать другую форму, в конструкторе неработает. Попробуй вызывать в событии OnCreate, должно сработать.
PM   Вверх
_hunter
Дата 26.1.2005, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



это:
new TFormX FormX(NULL);
что за бред? smile я тебе как показывал?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
3,14
Дата 26.1.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 1
Всего: 24



Если уж так нужно создавать вызывать одну форму из конструктора другого (ИМХО в корне не верное решение) то нужно просто правильно расставить порядок создания форм, для этого открываешь Project1.cpp и заменяешь:
Код

                Application->CreateForm(__classid(TForm1), &Form1);
                ...
                Application->CreateForm(__classid(TFormX), &FormX);


на

Код

                Application->CreateForm(__classid(TFormX), &FormX);
                Application->CreateForm(__classid(TForm1), &Form1);
                ...


А new TFormX нужно вызывать только если TFormX у тебя не создаётся автоматически (по умолчанию создаётся)

Это сообщение отредактировал(а) 3,14 - 26.1.2005, 10:30


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Hroft
Дата 2.2.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: 1
Всего: 3



Ох не стоит так делать... Я раз попытался изменить порядок создания форм - все заработало, но возникла проблема в другом месте. После получаса мучений вернул обратно и переделал место, где была ошибка.
PM MAIL ICQ   Вверх
Adil'
Дата 2.2.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 4
Всего: 15



Да нет, ничего страшно, можно поменять порядок создания, нужно только следить за первой создающейся - она станет главной формой приложения. Хотя всё-равно извращение
Цитата(SydeX @ 25.1.2005, 22:51)
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) {
if(FormX==NULL) TFormX * FormX = new TFormX FormX(NULL);
FormX->ShowModal();

Под if новую переменную объявляешь, да еще с такимже именем, что и глобальная



--------------------
Удачи
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.