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

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

Помогите разобраться с 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 на момент обращения к собственному полю не создан.


Наверх

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