Re[2]: обратиться к объекту из другого модуля
От: Roman1980 http://www.rasland.com, http://free.rasland.com
Дата: 11.11.06 19:30
Оценка:
P>>делаю так
P>>#include "Unit1.h"
P>>Form1->Series8->

P>>получаю ошибку EAccessViolation...


S>вполне вероятно, что в тот момент Form1 не создан. это нужно проверить.

S>самый надежный способ — это находить компонент "врукопашную".
S>если разработчик не извращается то все формы и датамодули имеют одного владельца — Application:TApplication. поэтому можно найти как Application.FindComponent('Form1'). Если же извращается, то найти можно в глобальной переменной Screen: TScreen. Там перечислены все созданные на текущей момент формы и датамодули поотдельности.

А я бы так делать не стал и соответственно не рекомендую. Это как раз не самый надежный способ. Не надо никак извращатся. Никакие поиски формы ее не создадут. Обрабатывать ситуацию когда Form1 не создан все равно придется. Как быть?

Во первых в модуле объявлена глобальная переменная Form1. Возможно что форма и создана, только указатель на нее не присвоен этой переменной. Это может произойти если ты создаешь форму руками. В таком случае можно создавать ее например в unit2, указатель запоминать в локальной переменной, потом с ней работать, потом уничтожать. Типа


TForm1 *F = new TForm1(Aplication);
F.инициализация какаято
F.ShowModal();
delete F;


НО возможно что у тебя форма глобальная, которая должна быть только одна в каждый момент времени. Тогда можно сделать функцию ее показа отдельно в unit1 типа


void ShowForm1()
{
  if (!Form1)
    Form1 = new TForm1(Application);
  Form1->Show();
}


Перед тем как испрользовать форму и графики и вообще для показа первой формы всегда используй эту функцию. Тогда у тебя Form1 всегда будет создан и не будет ошибки.

Ну и наконец если форма может быть а может и не быть к моменту вызова ошибочного кода, то просто добавь проверку


if (Form1)
{
...
}


Пока все. Если ошибка не пропадет, пиши подробнее места где и как создаются все учавствующие в ошибочном коде объекты: формы, Series и т.д.

Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.