![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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, форма «/,».
Еще интереснее то, что я не могу от неё избавится. Удалил комментарии, но она не исчезла из доступных. И после перезапуска среды она все еще на месте.
Где это может еще храниться?