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

Вниз

Переменная в процедуре .. живучая   Найти похожие ветки 

 
Lip   (2008-01-18 19:51) [0]

Можно как-нибудь в локальной процедуре объявить переменную, так чтобы она сохраняла свое значение до конца работы программы, именно до конца работы программы, а не процедуры.
Что-то типа static переменных в С++

Заодно ещё один вопрос.
Как проверить создан ли объект?
Вот создал list := TStringList.Create; а как проверить, создан ли он уже..
например, if list. уже создан, то ...

Подскажите, пожалуйста!

Заранее спасибо!


 
Mystic ©   (2008-01-18 19:53) [1]

1. Просто объявить глобальную переменную.
2. Инициализировать значением nil, потом проверять на nil


 
Lip   (2008-01-18 19:58) [2]


> 1. Просто объявить глобальную переменную.


глобальные переменные Must Die!!!


 
Черный Шаман   (2008-01-18 20:02) [3]

Project->Options->Compiller->Assignable Checked Constants->Checked


procedure TForm1.Button1Click(Sender: TObject);
const
 sLiveVar: Integer = 0;
begin
 sLiveVar := sLiveVar + 1;
 Form1.Caption := IntToStr(sLiveVar);
end;


 
Mystic ©   (2008-01-18 20:02) [4]

> глобальные переменные Must Die!!!

А static в C++ и есть аналог глобальной переменной :)


 
Черный Шаман   (2008-01-18 20:05) [5]


> Lip   (18.01.08 19:58) [2]
>
> > 1. Просто объявить глобальную переменную.
>
> глобальные переменные Must Die!!!


Если с Initialization/Finalization то очень даже Must Live


 
homm ©   (2008-01-18 21:37) [6]

> [5] Черный Шаман   (18.01.08 20:05)
> Если с Initialization/Finalization

Initialization/Finalization  must due :)


 
Сергей Суровцев ©   (2008-01-18 21:51) [7]

>Lip   (18.01.08 19:51)  
>Можно как-нибудь в локальной процедуре объявить переменную, так чтобы
>она сохраняла свое значение до конца работы программы, именно до конца
>работы программы, а не процедуры.

>Lip   (18.01.08 19:58) [2]
>глобальные переменные Must Die!!!

Ты хочешь глобальную переменную. Но не хочешь ее. Как быть?


 
Palladin ©   (2008-01-18 22:00) [8]


> [2] Lip   (18.01.08 19:58)

сам ты маст дай... все нужно использовать к месту и по назначению...


 
ketmar ©   (2008-01-18 22:06) [9]

>[3] Черный Шаман (18.01.08 20:02)
шаман, аднака.


 
rts111 ©   (2008-01-18 22:14) [10]


> Можно как-нибудь в локальной процедуре объявить переменную,
>  так чтобы она сохраняла свое значение до конца работы


Объяви ее не после, а перед ключевым словом procedura.


 
Черный Шаман   (2008-01-18 22:55) [11]


> rts111 ©   (18.01.08 22:14) [10]
>
>
> > Можно как-нибудь в локальной процедуре объявить переменную,
>
> >  так чтобы она сохраняла свое значение до конца работы
>
>
> Объяви ее не после, а перед ключевым словом procedura.


Зачем если есть такой шаманский подход как [3] для инкапсуляции статических переменных внутри функций через типизированные константы. Это типичный хакерский метод программирования.


 
Sergey Masloff   (2008-01-18 23:01) [12]

Черный Шаман   (18.01.08 22:55) [11]
Метод есть но не хакерский а совсем наоборот.


 
korneley ©   (2008-01-18 23:47) [13]

Один мой знакомый, очень сетовал на то,что вроде локальные переменные, но описанные как типизированные константы (батюшки, бред-то какой), не принимают написанного в тексте значения на любой момент вызова процедуры/функции. Одним словом, с трубопаскаля и далее,сложилось мнение - типизированые константы есть суть глобалы. И сохранят запихнутое в них значение до конца  "работы"


 
rts111 ©   (2008-01-18 23:51) [14]


> Черный Шаман   (18.01.08 22:55) [11]


Ну если это одна константа в проекте, то да, покатит и [3].


 
Сергей Суровцев ©   (2008-01-18 23:55) [15]

А для чего эти пляски с бубном? Если интерисует именно переменная, делаем глобальную. Если просто сохранить значение, пишем в файл.


 
korneley ©   (2008-01-19 00:04) [16]


> Как проверить создан ли объект?

Если ссылка не нил (что не гарантирует присутствия объекта), обратись к полю объекта. получишь AV - значит что-то не так...


 
rts111 ©   (2008-01-19 00:09) [17]

> Как проверить создан ли объект?

if MyObject is TMyClass then ...


 
_xxx_   (2008-01-19 00:15) [18]

procedure qwerty
$J+
const uiop:integer;
$J-
begin
...............
end;

не?


 
_xxx_   (2008-01-19 00:17) [19]

{J+}, скобочки забыл, извиняюсь


 
{RASkov} ©   (2008-01-19 00:22) [20]

В общих случаях так можно проверять:
if Obj<>nil then....
или
if Assigned(Obj) then....

но это не 100%)


 
rts111 ©   (2008-01-19 00:22) [21]


> _xxx_   (19.01.08 00:15) [18]


Блин, точно!


 
korneley ©   (2008-01-19 00:45) [22]


> В общих случаях так можно проверять...

В очень общих... Если нил после освобождения не забыли присвоить...


 
Плохиш ©   (2008-01-19 00:49) [23]


> {RASkov} ©   (19.01.08 00:22) [20]
> В общих случаях так можно проверять:
> if Obj<>nil then....
> или
> if Assigned(Obj) then....

> но это не 100%)

Масло масляное...

В случае Lip 100% не правильно определит...


 
Германн ©   (2008-01-19 00:50) [24]


> korneley ©   (18.01.08 23:47) [13]
>
> Один мой знакомый, очень сетовал на то,что вроде локальные
> переменные, но описанные как типизированные константы (батюшки,
>  бред-то какой), не принимают написанного в тексте значения
> на любой момент вызова процедуры/функции. Одним словом,
> с трубопаскаля и далее,сложилось мнение - типизированые
> константы есть суть глобалы. И сохранят запихнутое в них
> значение до конца  "работы"
>

Не понял. Поясни последнюю фразу.


 
Германн ©   (2008-01-19 00:54) [25]


> rts111 ©   (19.01.08 00:22) [21]
>
>
> > _xxx_   (19.01.08 00:15) [18]
>
>
> Блин, точно!
>

Ес-сно. Это то же самое шаманство, что и в [3]. Только без галочки, а значит "локально-глобальное". Или "глобально-локальное". Хрен их разберёт. :)


 
rts111 ©   (2008-01-19 01:01) [26]

_xxx_ - ты белый шаман


 
homm ©   (2008-01-19 01:01) [27]

> [18] _xxx_   (19.01.08 00:15)
> $J+
> const uiop:integer;
> $J-

А ты вот так вот уверенно снимаешь опцию, а ты уверен, что до тебя она стояла?


 
rts111 ©   (2008-01-19 01:04) [28]

_xxx_ - нет, ты не белый шаман


 
korneley ©   (2008-01-19 01:04) [29]

мой знакомый сокрушался тому,  что если написано внутри процедуры
const i : integer = 0;
то, как он думал, при входе в процедуру i должно (должен?) быть равно/равен нулю. А на практике получал последнее присвоенное значение, т.к. это(т) i пользовал внутри процедуры активно.
 Таки поясняю: типизированные константы = глобальные переменные с инициализацией значения на момент запуска  приложения. Независимо от места описания. Поэтому, что последнее присвоили, то и получим при очередном считывании. Пошёл за бинтами... :)))


 
Германн ©   (2008-01-19 01:17) [30]


> homm ©   (19.01.08 01:01) [27]
>
> > [18] _xxx_   (19.01.08 00:15)
> > $J+
> > const uiop:integer;
> > $J-
>
> А ты вот так вот уверенно снимаешь опцию, а ты уверен, что
> до тебя она стояла?
>

Эээ. Внутри своего модуля всяк хозяин опций компилятора. И всяк уверен. А за пределы модуля это не распространится.


 
Германн ©   (2008-01-19 01:21) [31]


> korneley ©   (19.01.08 01:04) [29]
>
> мой знакомый сокрушался тому,  что если написано внутри
> процедуры
> const i : integer = 0;
> то, как он думал, при входе в процедуру i должно (должен?
> ) быть равно/равен нулю. А на практике получал последнее
> присвоенное значение, т.к. это(т) i пользовал внутри процедуры
> активно.
>  Таки поясняю: типизированные константы = глобальные переменные
> с инициализацией значения на момент запуска  приложения.
>  Независимо от места описания. Поэтому, что последнее присвоили,
>  то и получим при очередном считывании. Пошёл за бинтами.
> .. :)))
>

Понял. Знакомый был не прав. А ты в [29] прав. Посему бинты отдай знакомому. Ему они нужней.


 
korneley ©   (2008-01-19 01:33) [32]

Про бинты - как знать... А в чем не прав? С удовольствием подправлю концепцию мироздания :)


 
Германн ©   (2008-01-19 01:46) [33]


> korneley ©   (19.01.08 01:33) [32]
>
> Про бинты - как знать... А в чем не прав?

Кто не прав? Знакомый? В том что полагал, что при входе в процедуру типизированная константа описанная в ней (процедуре) должна принимать значение написанное в коде. А на деле она (типизированная константа описанная в данной процедуре) это значение (описанное в коде) принимает только один раз при старте программы. Последующие входы в данную процедуру на её значение не влияют.


 
Германн ©   (2008-01-19 01:49) [34]


> Германн ©   (19.01.08 01:17) [30]
>
>
> > homm ©   (19.01.08 01:01) [27]
> >
> > > [18] _xxx_   (19.01.08 00:15)
> > > $J+
> > > const uiop:integer;
> > > $J-
> >
> > А ты вот так вот уверенно снимаешь опцию, а ты уверен,
>  что
> > до тебя она стояла?
> >
>
> Эээ. Внутри своего модуля всяк хозяин опций компилятора.
>  И всяк уверен. А за пределы модуля это не распространится.
>
>

Кстати те манипуляции с опциями компилятора описанные в [18] не распространятся даже за пределы той процедуры.


 
korneley ©   (2008-01-19 01:51) [35]

С формальной точки зрения, переменная, описанная внутри процедуры/функции должна хранить данные на время работы кода этой самой процедуры и не более. А  тут мы получаем неявные глобалы. Естественно, человек, читавший Вирта, в недоумениии. И все, что я могу ему сказать: есть такие штуки, как недокументированые возможности, ну, или "фичи"...


 
uw ©   (2008-01-19 01:56) [36]

Mystic ©   (18.01.08 20:02) [4]
А static в C++ и есть аналог глобальной переменной :)

void foo()
{
 static int non_global = 0;
 ...
}


 
Германн ©   (2008-01-19 02:02) [37]


> korneley ©   (19.01.08 01:51) [35]
>
> С формальной точки зрения, переменная, описанная внутри
> процедуры/функции должна хранить данные на время работы
> кода этой самой процедуры и не более. А  тут мы получаем
> неявные глобалы. Естественно, человек, читавший Вирта, в
> недоумениии. И все, что я могу ему сказать: есть такие штуки,
>  как недокументированые возможности, ну, или "фичи"...
>

Эээ. Пардон. А причем тут Вирт. Не ну мы конечно ему благодарны, но реальный язык Паскаль уже во многом ушел от того первого стандарта.
Да и кстати. Типизированные константы были нормальным явлением вплоть до Д1. В более поздних версиях они "поддерживаются для совместимости".


 
rts111 ©   (2008-01-19 02:06) [38]


> Германн ©   (19.01.08 01:49) [34]


> Кстати те манипуляции с опциями компилятора описанные в
> [18] не распространятся даже за пределы той процедуры.


Что-то у меня распространяются, сейчас проверил:


procedure Tw0.Button1Click(Sender: TObject);
{$j+}
const
rrr :integer = 10;
begin
beep;
end;

procedure Tw0.Button2Click(Sender: TObject);
const
rrr :integer = 10;
begin
rrr := rrr+1;
beep;
end;


 
rts111 ©   (2008-01-19 02:09) [39]


> rts111 ©   (19.01.08 02:06) [38]


Т.е. если глобально стоит $j+ и сделать так:

> [18] _xxx_   (19.01.08 00:15)
> $J+
> const uiop:integer;
> $J-

то, далее в модуле будет уже $J-


 
Германн ©   (2008-01-19 02:33) [40]


> rts111 ©   (19.01.08 02:06) [38]
>
>


> ts111 ©   (19.01.08 02:09) [39]
>
>

Завтра(сегодня) проверю, если понадобится. Сейчас - занят. Нет времени.



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

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

Наверх




Память: 0.57 MB
Время: 0.022 c
15-1201259906
Lip
2008-01-25 14:18
2008.02.24
форум умер потому что delphi умерла?


15-1200506129
TStas
2008-01-16 20:55
2008.02.24
Чем открывать файл электронной книги djvu?


2-1201510223
AndrewK
2008-01-28 11:50
2008.02.24
Как раскрасить заголовок в DBGridEh


11-1184062837
nikfel
2007-07-10 14:20
2008.02.24
Помогите перевести код для выключения.


2-1201681975
Andrej
2008-01-30 11:32
2008.02.24
TShellTreeView