Главная страница
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.48 MB
Время: 0.01 c
15-1250080125
desc
2009-08-12 16:28
2009.10.11
Принтер HP Officejet K7100 Series, печатает цветные полосы,


10-1160294865
Primus
2006-10-08 12:07
2009.10.11
Позднее связывание


15-1250073945
NailMan
2009-08-12 14:45
2009.10.11
как определить кто использует DLL?


15-1249632827
yantux
2009-08-07 12:13
2009.10.11
delphi и dll - проблема, рекомендуйте плиз о чём почитать...


1-1219226732
Vlad Oshin
2008-08-20 14:05
2009.10.11
Код из dll в программу