Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

Чудеса с глобальными (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.039 c
2-1144229243
Der Nechk@ssoff
2006-04-05 13:27
2006.04.16
Сохранение Edit-ов


15-1143353614
Parus
2006-03-26 10:13
2006.04.16
В низу экрана, где "Пуск"...


2-1143932425
Коля
2006-04-02 03:00
2006.04.16
Как правильно прописать параметры функции?


5-1129211071
Saraseko Maksim
2005-10-13 17:44
2006.04.16
Наследовать TCollectionEditor


2-1144053643
VAZMan
2006-04-03 12:40
2006.04.16
RadioButton





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский