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

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

AV в TComponent.SetReference


Kolan ©   (2009-08-10 13:28:00) 

Здравствуйте!

Не могу понять причину AV. Отладка показала что:
В методе TComponent.DestroyComponents(код метода ниже), когда Instance.ClassName— «TMainForm» (главная форма), а Self.ClassName— «TApplication», с Owner'ом Instance'а что-то не то.

Код TComponent.DestroyComponents, чтобы не лазить.
procedure TComponent.DestroyComponents;
var
 Instance: TComponent;
begin
 while FComponents <> nil do
 begin
   Instance := FComponents.Last;
   if (csFreeNotification in Instance.FComponentState)
     or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
     RemoveComponent(Instance)
   else
     Remove(Instance);
   Instance.Destroy;
 end;
end;


То есть если написать в просмотрщике Instance.Owner, то там будет (nil, '', 14370784, nil, nil, 8, [], $1, [csTransient,(out of bound) 6]), а если написать Instance.Owner.ClassName, то Access violation at 00404353 accessing FFFFFFC8


Если двигаться дальше отладкой, то попадем в метод TComponent.RemoveComponent(AComponent: TComponent), а оттуда, после вызова AComponent.SetReference(False), в метод TComponent.SetReference(Enable: Boolean), где и возникает приведенное выше AV, потому что там есть обращение к Owner'у:

procedure TComponent.SetReference(Enable: Boolean);
var
 Field: ^TComponent;
begin
 if FOwner <> nil then
 begin
   Field := FOwner.FieldAddress(FName);
   if Field <> nil then
     if Enable then Field^ := Self else Field^ := nil;
 end;
end;


Вопрос: Где искать причины AV и, заодно, что делает метод SetReference?


Kolan   (2009-08-11 13:31:00) [1]

Где храниться наше — это было в *.dproj, который пришлось исправить руками. Верся Делфи — 2009.

Вот и я не понимаю, как он мог помереть. В проекте особых извращений с памятью и прочим нет.


Жж   (2009-08-11 13:28:00) [2]


> а если написать Instance.Owner.ClassName,


Скорее всего, овнер уже разрушен. Непонятно только, как так получилось


> Где это может еще храниться?


Зависит от версии Delphi


Kolan   (2009-08-10 14:25:00) [3]

Интересно вот еще что. Заглянул в dpr, а там:

uses
 ExceptionLog,
 Forms,
 Domain in 'Domain.pas',
 SystemController in 'SystemController.pas',
 PortWrapper in 'PortWrapper.pas',
 DeviceProtocol in 'DeviceProtocol.pas',
 nrCommPortWrapper in 'nrCommPortWrapper.pas',
 CommunicationInterface in 'CommunicationInterface.pas',
 Repository in 'Repository.pas ' {/,
},

 MainFormMiniCalibrator in 'MainFormMiniCalibrator.pas' {MainForm},
 FTDIUSBPortWrapper in 'FTDIUSBPortWrapper.pas';

{$R *.res}

Что-то я комментировал и осталось {/,}. Интересно, что в форме Project → Options → Forms у меня есть, кроме формы MainForm, форма «/,».

Еще интереснее то, что я не могу от неё избавится. Удалил комментарии, но она не исчезла из доступных. И после перезапуска среды она все еще на месте.

Где это может еще храниться?


Наверх

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