Форум: "Начинающим";
Текущий архив: 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.035 c