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