Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Чудеса с глобальными (public) переменными   Найти похожие ветки 

 
__alex ©   (2006-04-03 20:50) [0]

Хай люди.
Есть некий проект с несколькими формами. В главной форме 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-03 21:03) [1]


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

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


 
Leonid Troyanovsky ©   (2006-04-03 22:22) [2]


> __alex ©   (03.04.06 20:50)  

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


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

--
Regards, LVT.


 
__alex ©   (2006-04-03 23:25) [3]


> > В главной форме 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 23:28) [4]


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

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


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

--
Regards, LVT.


 
__alex ©   (2006-04-03 23:39) [5]


> > __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. В моем же проекте они меняются независимо! (вот ведь засада....)


 
Anatoly Podgoretsky ©   (2006-04-03 23:42) [6]

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


 
__alex ©   (2006-04-03 23:50) [7]


> 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. Другое дело что у меня так почемуто не выходит :)
Кстати, это не глобально по проекту такая лажа, а только в одной (главной) форме! Если приведенный выше код попробовать в других формах проекта - там все нормально!


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

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

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


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


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


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


 
__alex ©   (2006-04-04 00:04) [10]

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


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


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

> end;

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


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

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


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


> __alex ©   (03.04.06 20:50)

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

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

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


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


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

не спорю :-)


 
__alex ©   (2006-04-04 00:28) [15]


> > 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 это вообще не переменная, а поле.

>

см. выше


 
__alex ©   (2006-04-04 00:30) [16]


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


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


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


> __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.



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.037 c
15-1143419024
Ketmar
2006-03-27 04:23
2006.04.16
Guano Apes -- Break The Line -- clip


3-1140270719
John_Doe
2006-02-18 16:51
2006.04.16
Перенос значения функции AVG из SQL - в Delphi


4-1138272737
cyrs
2006-01-26 13:52
2006.04.16
консольное приложение


2-1143966370
foks-06
2006-04-02 12:26
2006.04.16
Получение координат?


2-1143722382
diwww
2006-03-30 16:39
2006.04.16
как избавиться от Access violation?