Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чудеса с глобальными (public) переменными


__alex ©   (2006-04-03 20:50:00) 

Хай люди.
Есть некий проект с несколькими формами. В главной форме frmMain в разделе Public объявлена глобальная переменная g_var. В коде frmMain ей (перменной) присваивается некоторое значение, которое потом должны прочитать и изменить другие формы, ну вроде того:

g_var:=123;
Form2.ShowModal;
ShowMessage(g_var);

код Form2:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 frmMain.g_var:=456;
end;

Все вроде просто как дверь. Однако, после вызова Form2.ShowModal,  ShowMessage(g_var) выдает старое значение!!! Начал я копать в чем же дело, дык оказывается, что если верить Inspector'y, переменные g_var и frmMain.g_var имеют разные адреса памяти! И значения у них соответсвенно разные. Но! Это только в том проекте что я делаю! Создаю новый - там такого караула нету!! И никак не пойму в чем тут дело, настройки чтоль какие невзначай поменял? Вобщем, хелп!


Германн   (2006-04-04 00:33:00) [1]


> __alex ©   (04.04.06 00:01) [9]
>
>
> > 2 __alex ©   (03.04.06 23:50) [7]
> >
> > Ищи, где у тебя в данном модуле q_var  определена ещё
> и
> > как просто переменная.
>
>
> нее, уважаемый, за кого вы меня держите :)  переменная g_var
> объявлена один раз в Public declarations. Я с разными переменными
> пробовал (сначала это вообще массив был, потом на Integer
> переключился) - один черт.


Если ты не ошибаешься, тогда выполни пункт меню "FindInFiles" по слову q_var по всем файлам проекта. Наверняка найдешь глобальную переменную с таким именем объявленную в модуле, которой содержится в uses того модуля, в котором описана TfrmMain.


__alex   (2006-04-04 00:30:00) [2]


> Плохиш ©   (04.04.06 00:15) [13]
>
>
> > __alex ©   (03.04.06 20:50)
>
> Ищи, где создаёшь ещё один экземпляр TfrmMain.
> > В главной форме frmMain в разделе Public объявлена глобальная
> > переменная g_var. В коде frmMain ей (перменной) присваивается
> > некоторое значение, которое потом должны прочитать и изменить
> > другие формы,
> Глюкодром. Руки вырывать за это надо.


ну если такой умный, предложи другой простой способ связи двух форм!


__alex   (2006-04-04 00:28:00) [3]


> > procedure TfrmMain.FormShow(Sender: TObject);
> > begin
> >  g_var:=123;
> >  frmMain.g_var:=999;
> > end;
>
> В общем случае это две разные переменные. Учите ооп.
</I

в каком таком общем случае? создай новый проект и убедись - это обращение к одной и той же переменной.


> Anatoly Podgoretsky ©   (04.04.06 00:15) [12]
>
> frmMain.g_var это вообще не переменная, а поле.

>

см. выше


Плохиш   (2006-04-04 00:18:00) [4]


> Anatoly Podgoretsky ©   (04.04.06 00:15) [12]
> frmMain.g_var это вообще не переменная, а поле.

не спорю :-)


Плохиш   (2006-04-04 00:15:00) [5]


> __alex ©   (03.04.06 20:50)

Ищи, где создаёшь ещё один экземпляр TfrmMain.

> В главной форме frmMain в разделе Public объявлена глобальная
> переменная g_var. В коде frmMain ей (перменной) присваивается
> некоторое значение, которое потом должны прочитать и изменить
> другие формы,

Глюкодром. Руки вырывать за это надо.


Anatoly Podgoretsky   (2006-04-04 00:15:00) [6]

frmMain.g_var это вообще не переменная, а поле.


Плохиш   (2006-04-04 00:12:00) [7]


> procedure TfrmMain.FormShow(Sender: TObject);
> begin
>  g_var:=123;
>  frmMain.g_var:=999;

> end;

В общем случае это две разные переменные. Учите ооп.


__alex   (2006-04-04 00:04:00) [8]

Кстати, никакой разницы нет объявляю я эту переменную в Public или Private declarations - косяк все равно вылазит. И, повторюсь, только в одной (главной) форме!


__alex   (2006-04-04 00:01:00) [9]


> 2 __alex ©   (03.04.06 23:50) [7]
>
> Ищи, где у тебя в данном модуле q_var  определена ещё и
> как просто переменная.


нее, уважаемый, за кого вы меня держите :)  переменная g_var объявлена один раз в Public declarations. Я с разными переменными пробовал (сначала это вообще массив был, потом на Integer переключился) - один черт.


Германн   (2006-04-03 23:53:00) [10]

2 __alex ©   (03.04.06 23:50) [7]

Ищи, где у тебя в данном модуле q_var  определена ещё и как просто переменная.


__alex   (2006-04-03 23:50:00) [11]


> Anatoly Podgoretsky ©   (03.04.06 23:42) [6]
>
> Это разные переменные, если это вообще переменные.


Это че значит???
Может так будет яснее:
// код формы fmrMain
unit frmMainUnit;
interface  
 // ...
 public
   { Public declarations }
   g_var: integer;
 // ...
implementation
procedure TfrmMain.FormShow(Sender: TObject);
begin
 g_var:=123;
 frmMain.g_var:=999;
end;

Ну вот, какие еще тут разные переменные? Переменная то одна и та же. Сделай новый проект и убедись - когда меняешь значение g_var, то меняется и frmMain.g_var. Другое дело что у меня так почемуто не выходит :)
Кстати, это не глобально по проекту такая лажа, а только в одной (главной) форме! Если приведенный выше код попробовать в других формах проекта - там все нормально!


Anatoly Podgoretsky   (2006-04-03 23:42:00) [12]

Это разные переменные, если это вообще переменные.


__alex   (2006-04-03 23:39:00) [13]


> > __alex ©   (03.04.06 23:25) [3]
>
> >  если вы создадите новый проект, такого чуда не будет,
>  переменные
> > g_var и frmMain.g_var будут находиться по одному адресу
>
> > и значения будут одинаковые!
>
>
> Ну, и где ж обещанное чудо?


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

Кстати, зря я намудрил 2 формы в примере, оно и на одной все видно:
g_var:=1;
frmMain.g_var:=2;

В новосозданном проекте если пошагово выполнять приведенные строки, то после КАЖДОГО присваивания меняются ОБЕ переменные g_var и frmMain.g_var. В моем же проекте они меняются независимо! (вот ведь засада....)


Leonid Troyanovsky   (2006-04-03 23:28:00) [14]


> __alex ©   (03.04.06 23:25) [3]

>  если вы создадите новый проект, такого чуда не будет, переменные
> g_var и frmMain.g_var будут находиться по одному адресу
> и значения будут одинаковые!


Ну, и где ж обещанное чудо?

--
Regards, LVT.


__alex   (2006-04-03 23:25:00) [15]


> > В главной форме frmMain в разделе Public объявлена глобальная
>
> > переменная g_var.
>
> Не может там объявляться глобальная переменная.


Ладно, просто public-переменная. Но к ней же можно обращаться из других модулей!


> > __alex ©   (03.04.06 20:50)  
>
> >  переменные g_var и frmMain.g_var имеют разные адреса
> памяти!
> >  И значения у них соответсвенно разные.
>
>
> Для "соответственно" - нет оснований.


Эт почему?? Переменной g_var значение 123 присваевается в коде формы frmMain, а в Form2.FormClose меняется (на 456) уже не она, а ДРУГАЯ переменная frmMain.g_var !!! Но повторяю, если вы создадите новый проект, такого чуда не будет, переменные g_var и frmMain.g_var будут находиться по одному адресу и значения будут одинаковые!


Leonid Troyanovsky   (2006-04-03 22:22:00) [16]


> __alex ©   (03.04.06 20:50)  

>  переменные g_var и frmMain.g_var имеют разные адреса памяти!
>  И значения у них соответсвенно разные.


Для "соответственно" - нет оснований.

--
Regards, LVT.


Рамиль   (2006-04-03 21:03:00) [17]


> В главной форме frmMain в разделе Public объявлена глобальная
> переменная g_var.

Не может там объявляться глобальная переменная.


Наверх

Титульная страница Поиск, карта сайта Написать письмо