![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с AV [D7]
аноним © (2006-02-24 19:22:00)Имею абсолютно не понятный мне AV в абсолютно понятном месте.
В общем есть следующая ситуация:
type
TListClass= class
private
FVCList: TList;
...
public
...
function AddObject: TObjectClass ;
...
end;
TObjectClass = class
private
...
FPageItem: TSomeClass;
...
public
...
procedure Select;
...
end;
function TListClass.AddObject: TObjectClass;
var
VC: TObjectClass;
begin
VC:=TObjectClass.Create(Self);
FVCList.Add(VC);
end;
все в порядке вещей, код привожу для понимания ситуации =)
procedure TObjectClass.Select;
var
Page: TSomeClass;
begin
...
Page:=FPageItem; // имеем AV...
...
end;
смотрим на каком же месте у нас AV:
mov eax, [eax+$18]
и этот АВ после создания экземпляра класса TObjectClass происходит при любом обращении (именно чтении) к его свойствам. я не понимаю в чем дело. уже не первый год программирую и чувствую себя идиотом. может пора вздремнуть...
где-то в затылок закралсь мысль что уж не виновата ли _локальная_ переменная в AddObject'e. но ведь не раз уже так делал. тут все пучком вроде. черт побери. повешусь! умоляю, помогите.
Джо (2006-02-24 19:39:00) [1]И не лучше ли вообще без временной переменной, то есть так:
Result := TObjectClass.Create (Self);
FVCList.Add(VC);
или даже так:
Result := TObjectClass (FVCList.Add(TObjectClass.Create(Self)))
Джо (2006-02-24 19:39:00) [2]> [7] Джо © (24.02.06 19:39)
> И не лучше ли вообще без временной переменной, то есть так:
>
> Result := TObjectClass.Create (Self);
> FVCList.Add(VC);
Тьху, сам не выспался. Вот так:
Result := TObjectClass.Create (Self);
FVCList.Add(Result);
Джо (2006-02-24 19:38:00) [3]> [4] аноним (24.02.06 19:37)
> понимаете в чем дело. он создан =)
Ты из функции значение возвратил?! В общем, см. [3].
аноним (2006-02-24 19:37:00) [4]понимаете в чем дело. он создан =)
procedure TfrmTEST.btnTESTClick(Sender: TObject);
var
VC: TObjectClass;
begin
VC:=VLST.AddObject;
VC.Select;
end;
вот где вызывается Select. VC<>nil. я не понимаю. я уже все перепроверил...
аноним (2006-02-24 19:37:00) [5]хахаха ))) черт побери!
спасибо! все, иду спать. идиот.
Джо (2006-02-24 19:35:00) [6]Упс:
function TListClass.AddObject: TObjectClass;
var
VC: TObjectClass;
begin
VC:=TObjectClass.Create(Self);
FVCList.Add(VC);
Result := VC;
end;
Кто возвращать значение будет? ;)
Джо (2006-02-24 19:34:00) [7]экземпляр TObjectClass, сорри.
Джо (2006-02-24 19:33:00) [8]> procedure TObjectClass.Select;
> var
> Page: TSomeClass;
> begin
> ...
> Page:=FPageItem; // имеем AV...
> ...
> end;
Чует сердце, что экземпляр TObjectClass.Select на момент обращения к собственному полю не создан.