Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.11;
Скачать: CL | DM;

Вниз

AV в TComponent.SetReference   Найти похожие ветки 

 
Kolan ©   (2009-08-10 13:28) [0]

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

Не могу понять причину 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-10 14:25) [1]

Интересно вот еще что. Заглянул в 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 &#8594; Options &#8594; Forms у меня есть, кроме формы MainForm, форма «/,».

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

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


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


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


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


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


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


 
Kolan ©   (2009-08-11 13:31) [3]

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.10.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
15-1249068357
картман
2009-07-31 23:25
2009.10.11
Не вызывается функция dll из clr-ХП


15-1249508352
FF_FF
2009-08-06 01:39
2009.10.11
Как изменить свой ip?


4-1219234428
ШырлиМырли
2008-08-20 16:13
2009.10.11
Работа с UPS.


11-1193764318
=BuckLr=
2007-10-30 20:11
2009.10.11
Проверка ящика на предмет наличия писем


11-1206025013
andreil
2008-03-20 17:56
2009.10.11
Stream2Stream на АСМе?