Главная страница
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.01 c
3-1227791625
Handbrake
2008-11-27 16:13
2009.10.11
Firebird, проблема с коннектом


15-1250141829
pvr
2009-08-13 09:37
2009.10.11
Управление фотоаппаратом


10-1160379486
cloix
2006-10-09 11:38
2009.10.11
Реализация методов IDispatch


15-1249989451
TUser
2009-08-11 15:17
2009.10.11
Экзопланеты и другие астрономические открытия


2-1249671660
Б
2009-08-07 23:01
2009.10.11
Положение колёсика мыши.