обратиться к объекту из другого модуля
От: Pieros  
Дата: 11.11.06 17:04
Оценка:
к меня есть на форме Unit1 — Form1, на ней график Series1
как мне к нему обратиться из другого unit2?

делаю так
#include "Unit1.h"
Form1->Series8->

получаю ошибку EAccessViolation...
Re: обратиться к объекту из другого модуля
От: svd71 http://visualdesigner.fatal.ru/
Дата: 11.11.06 18:51
Оценка:
Здравствуйте, Pieros, Вы писали:

P>к меня есть на форме Unit1 — Form1, на ней график Series1

P>как мне к нему обратиться из другого unit2?

P>делаю так

P>#include "Unit1.h"
P>Form1->Series8->

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


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

Удачи!
Re[3]: обратиться к объекту из другого модуля
От: Pieros  
Дата: 11.11.06 21:11
Оценка:
нет, друзья, форма создана — 100%,
проверка типа
if (Form1)
{
}

благополучно проходит,

на форме есть кнопка, по нажатию на которую включается таймер
и по таймеру — вызывается процедура из unit2, но, когда эта процедура обращается к Form1 — появляется ошибка

типа того

Unit1.cpp:

...
#include "Unit1.h"
...

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TInData InData;
...
pr(InData)
}


pr.cpp:

#include "Unit1.h"
...

int pra(TInData inData)
{
...
Form1->Series1->AddXY(x1,y1);
...
}

вот примерно так
Re[4]: обратиться к объекту из другого модуля
От: Roman1980 http://www.rasland.com, http://free.rasland.com
Дата: 12.11.06 11:52
Оценка:
Здравствуйте, Pieros, Вы писали:

P>нет, друзья, форма создана — 100%,

Ее видно? Проверь еще.
P>проверка типа
P>if (Form1)
P>{
P>}
P>благополучно проходит,

Не факт, что есть форма. Просто указатель Form1 не равен NULL!!! Это раз.

P>на форме есть кнопка, по нажатию на которую включается таймер

P>и по таймеру — вызывается процедура из unit2, но, когда эта процедура обращается к Form1 — появляется ошибка
P>типа того
P>Unit1.cpp:
P>...
P>#include "Unit1.h"
P>...
P>void __fastcall TForm1::Timer1Timer(TObject *Sender)
P>{
P> TInData InData;
P> ...
P> pr(InData)
P>}

P>pr.cpp:

P>#include "Unit1.h"
P>...
P>int pra(TInData inData)
P>{
P> ...
P> Form1->Series1->AddXY(x1,y1);
P> ...
P>}
P>вот примерно так

Ну в названиях я так и не нашел Unit2 и функции то pr, то pra. Списываю это на невнимательность при наборе сообщения и никак не при наборе программы. Но отметить должен был.

Воспользуйся такими инструментами отладки как точка прерывания. Строку на которой возникает ошибка я так понял ты уже нашел. Перед тем как ее запустить на выполнение при пошаговом выполнении просмотри все значения: Form1, Series1. Может что то не существует? Используй не только Watch. Используй "Run/Inspect". Там еще и значения свойств посмотришь. Если объект не создан будет калямаля.

Но еще одно замечание могу дать сразу. Есть такое понятие как сцепление модуля. Это понятие из области проектирования. Еще есть понятие "рефакторинг". Это переписывание кода чтобы сделать его более красивым, логичным, грамотным и т.д. Так вот я тебе советую сделать именно это, чтобы уменьшить сцепление модуля. Постарайся убрать обращение к глобальной переменной Form1. Обращатся из МЕТОДА Формы1 модуля1 к ПРОЦЕДУРЕ модуля2, которая использует ФОРМУ1 уже как глобальную переменную — это очень некрасиво и мудрено. Подумай и постарайся это убрать. Пусть твой таймер для вычислений использует модуль 2, НО добавление делает сам. А функция pr например просто возвращает пару координат которую надо добавить. Ну или сам реши как отрефакторить. Примеры привел, но полностью сказать не могу. Надо уже код смотреть.

Удачи!
Re[5]: обратиться к объекту из другого модуля
От: Pieros  
Дата: 12.11.06 12:06
Оценка:
да это действительно по невнимательности

что касаеться архитектуры, то обращение обратно к Form1 — это только для отладки программы в конечном варианте,
конечно таких ходов не будет, ну что же сделаю красиво как ты советовал.
спасибо за помощ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.