Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2013, 19:50   #11
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Я тоже не совсем понял. Что он понимает под фразой "до создания формы". Будь я идиотом, я бы понял так: Определить, создалась ли форма до того, как произошло обращение к команде вызова формы
Это тоже возможно, нужно обратьться к списку форм, но зачем?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 25.09.2013, 11:04   #12
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

eval
OnCreate вызывается не после и не до создания формы, а в момент создания. Пример не кривой, я опустил полное описание. Если будет легче, то вот
Код:
void __fastcall TForm1::FormCreate( TObject *Sender )
{
  ...
  Add( "Some Message" );
  ...
  ...
  Add( "Another Message" );
}

void __fastcall TForm1::AddMessage(const AnsiString& sMsg)
{
  Memo->Lines->Add( sMsg ); // exception AccessViolation только при первом вызове
}
Smitt&Wesson
Под фразой "до создания формы" я понимаю, что фактически конструктор формы не отработал. Или отработал, но компоненты продолжают создаваться или инициализироваться. Иначе я не могу понять, почему в момент первого вызова обращение к Memo ведёт к AccessViolation. Т.е., мне нужно быть абсолютно уверенным, что всё создалось [форма и все компоненты на ней], чтобы начать основную работу, которая предполагает доступ к компонентам формы. И работа эта должна начаться даже если эту форму никто не собирается показывать
FataLL вне форума Ответить с цитированием
Старый 25.09.2013, 12:18   #13
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

OnCreate вызывается после того как все контролы и компоненты кинутые в дизайнере уже инициализированы и с ними можно работать. Потому то и говорят что форма уже создана. Да и это синхронная обработка, и по другому быть не может.
Слелайте проще, чтобы убедится создайте новый проект, кинте на форму мемо, и в онкрейт пропишите строку кода где просто добавите "строку" в это мемо, и увидите, что все ок.

Что касается вашего примера то и тут криво. Зачем вы приводите код метода AddMessage и не показываете код метода Add?

У вас просто ошибка в 17 строке.
eval вне форума Ответить с цитированием
Старый 25.09.2013, 14:27   #14
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

eval
Ещё раз исправляю.
Код:
void __fastcall TForm1::FormCreate( TObject *Sender )
{
  ...
  AddMessage( "Some Message" );
  ...
  ...
  AddMessage( "Another Message" );
}

void __fastcall TForm1::AddMessage(const AnsiString& sMsg)
{
  try
  {
    Memo->Lines->Add( sMsg ); 
  }
  catch(Exception& e)
  {
    // exception AccessViolation только при первом вызове
  }
}
Неужели так принципиально, что я пишу в качестве примера?

Последний раз редактировалось FataLL; 25.09.2013 в 14:33.
FataLL вне форума Ответить с цитированием
Старый 25.09.2013, 14:52   #15
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Вообще-то, как я усвоил из разных источников, последовательность появления формы такая: сперва в конструкторе создается "виртуальная" форма... - то-есть выделяются области в памяти, распределяется пространство, инициализируются переменные, массивы, но нигде ничего еще не отрисовывается; затем приходит черед onCreate - onShow - onPaint (здесь все появляется на мониторе) - onResize - onPaint (снова). OnCreate в "плюсах" не рекомендуют по причине возможного конфликта с конструктором, но я думаю - если использовать только что-то одно, то коллизий быть не должно. Вот хотелось бы ясности... - действительно ли это так? и что на каком этапе делается?
nick42 вне форума Ответить с цитированием
Старый 25.09.2013, 15:16   #16
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

nick42
Реально, в конструкторе инициализируются три свойства формы и всё. Основная музыка - в методе OnCreate. Там идёт считывание настроек, заполнение компонентов формы данными, создаются потоки [которые и выполняют основную работу] и т.д. В процессе выполнения действий, вызывается AddMessage с обычным текстом, информирующим о ходе работы, который заносится в ListBox и лог-файл. Заметил, что в листбоксе и логе не хватает самых первых сообщений, начал разбираться и выяснил такую вот странную вещь, что самое первое сообщение не выводится из-за непонятного эксепшена. Ума не приложу, почему он возникает. Более того, я всё-таки сделал одноразовый односекундный таймер, и всё заработало, как и ожидалось, но это обход проблемы, а не решение
Код:
void __fastcall TForm1::FormCreate( TObject *Sender )
{
  TimerStart->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimerStartTimer(TObject *Sender)
{
  TimerStart->Enabled = false;
  ...
  AddMessage( "Some Message" ); // сообщение стало добавляться
  ...
  ...
  AddMessage( "Another Message" );
}
Добавлю, что код из OnCreate я переносил в конструктор, а OnCreate не использовал вообще - ошибка оставалась.

Последний раз редактировалось FataLL; 25.09.2013 в 15:19.
FataLL вне форума Ответить с цитированием
Старый 25.09.2013, 15:39   #17
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Вы новый проект для теста делали как я предлагал?
А про дебагер слышали что нибудь?
Вы даже пока не выяснили что вызывает исключение, а таймер сваять успели, нет слов..

и конечно важно что вы пишите в вопросах. гадать это на другом форуме. адд у вас там или еще чего..
eval вне форума Ответить с цитированием
Старый 25.09.2013, 15:48   #18
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Добавлю, что код из OnCreate я переносил в конструктор, а OnCreate не использовал вообще - ошибка оставалась
Разберитесь про то как и когда форма читает dfm и инициализирует все что там находиться, ведь не зря же он живет с формой нераздельно.
eval вне форума Ответить с цитированием
Старый 25.09.2013, 16:00   #19
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

eval
И проект новый, и винду переустановил, и новый комп прикупил. Какие ещё есть пляски с бубном на примете? Я создал тему не из праздного любопытства от нечего делать, и уж поверьте, перед этим предпринял не мало. Исключение вызывает обращение к компоненту формы, который при проверке на NULL, таковым не является. Таймер мне тоже не нравится, как я уже сказал. Тем не менее, с ним почему-то работает. Если есть дельная мысль по этому поводу, буду только рад послушать.
FataLL вне форума Ответить с цитированием
Старый 25.09.2013, 17:51   #20
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от FataLL Посмотреть сообщение
Таймер мне тоже не нравится, как я уже сказал.
На прошлой странице я уже писал про OldCreateOrder, но был проигнорирован.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать, захвечен mutex или нет (linux, C++) Egyptorium Общие вопросы C/C++ 1 16.01.2013 14:55
как узнать пересекаются 2 окружности или нет fate Общие вопросы Delphi 2 17.06.2011 15:27
как узнать занят порт или нет DeDoK Работа с сетью в Delphi 3 12.09.2010 21:51
Как узнать программа запущена или нет? ilSMoKEli Общие вопросы Delphi 5 02.05.2010 23:01
Как узнать открыл пользователь окно или нет? KaimNotark Общие вопросы Delphi 5 09.02.2010 09:38