Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить что переданный в функцию объект ещё не создан? [D7, XP]


Страницы:   1 2

MegaVolt ©   (2007-04-26 10:55:00) 

Как в F2 определить что переданный объект ещё не создан.

Один вариант по AV при обращении к методам объекта. Но как то не очень красиво :( Может естьболее красивые методы? Например как то проверить выделялась ли память на которую указывает объект.

Сравнивать с nil не прошло :(

procedure F1;
var
 x:TBitMap;
...
...
 F2(x);
...
...
end;

procedure F2(x:TBitMap);
begin
...
end;


begin...end   (2007-04-26 11:18:00) [21]

> MegaVolt ©   (26.04.07 10:55)

> Как в F2 определить что переданный объект ещё не создан.

Ввести переменную для индикации существования объекта и самостоятельно изменять её значение при создании и разрушении объекта. Этой переменной может быть, как уже сказали, и сама ссылка на объект -- в этом случае нужно будет позаботиться (опять же, самостоятельно) о том, чтобы для ещё не созданного или уже разрушенного объекта она была равна nil.

> Один вариант по AV при обращении к методам объекта.

Это ошибочный вариант. Во-первых, если метод написан корректно, не является виртуальным или динамическим (и не вызывает такие методы) и не содержит обращений к полям объекта, он не приведёт к AV, будучи вызванным у объекта, который в данный момент не существует. Во-вторых, даже если метод будет обращаться к полям, вовсе не обязательно, что адреса полей, которые вычисляются на основе значения ссылки на объект, не окажутся относящимися к "чужим" областям памяти с нужными правами доступа -- а значит, и в этом случае нет гарантии, что возникнет AV.


stakan   (2007-04-26 11:16:00) [22]


> Сравнивать с nil не прошло :(
>
> procedure F1;
> var
>  x:TBitMap;
> ...
> ...
>  F2(x);
> ...
> ...
> end;

У меня сравнение с nil проходит если с х вообще ничего не делать:

procedure TForm2.Button1Click(Sender: TObject);
var
 x: TMy;
begin
 F(X);
end;

х на момент вызова = nil.
И насчёт AV: Если метод не обращается к полям объекта, то AV  не будет.


_Аноним   (2007-04-26 11:11:00) [23]

Дада, некрасиво проверять, ожидая AV
это тоже самое, как проверять - не забыл ли разрядить ружье после охоты, пытаясь выстрелить из него в потолок.
А вдруг осечка?


Ega23   (2007-04-26 11:02:00) [24]


> Разве он где-то говорил, что он инициализирует передаваемый
> указатель? В [0] он сказал обратное :-)


Да я вообще не понимаю, чё он хочет...


Плохиш   (2007-04-26 11:00:00) [25]


> Ega23 ©   (26.04.07 10:58) [3]

Разве он где-то говорил, что он инициализирует передаваемый указатель? В [0] он сказал обратное :-)


StriderMan   (2007-04-26 10:59:00) [26]

Assigned(x) ?

только хтогда рекомендуется nil'ом проинициализировать. А если он где-то разрушается, то делать FreeAndNil(x);


Ega23   (2007-04-26 10:59:00) [27]


> Так твоя правая рука знает, что делает левая ;-)


Всегда!   :)


Плохиш   (2007-04-26 10:59:00) [28]


> Ega23 ©   (26.04.07 10:57) [1]
>
> > Сравнивать с nil не прошло :(
> >
> У меня проходит.

Так твоя правая рука знает, что делает левая ;-)


Ega23   (2007-04-26 10:58:00) [29]

procedure F2( varx:TBitMap);
begin
 if x=nil then x := TBitmap.Create;
 ....
end;


Плохиш   (2007-04-26 10:58:00) [30]


> Один вариант по AV при обращении к методам объекта.

это единственный вариант.


Ega23   (2007-04-26 10:57:00) [31]


> Сравнивать с nil не прошло :(
>


У меня проходит.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо