![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чудеса с глобальными (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.
Не может там объявляться глобальная переменная.