Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];
Вниз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 → Options → 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c