Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизTListView.OnDeletion Найти похожие ветки
← →
Digitman (2004-02-19 12:16) [0]То ли лыжи не едут ...
Ситуация такова :
Имеется некоторая ActiveX-форма, класс которой TMyActiveForm есть прямой потомок TActiveForm.
Эта форма единственная в соответствующем OCX-модуле.
На форму положен TListView. В числе прочих назначена процедура обработки события TListView.OnDeletion.
В методе TMyActiveForm.AfterConstruction происходит формирование элементов в ListView обычными Items.Add(), Item.Subitems.Add()
В целях отладки из модуля формы 100%-но исключены все фрагменты кода, в котором вызываются ListView.Item.Clear, Item.Delete и иже с ними (т.е. методы, предназначенные для уничтожения частично или полностью элементов сформированного список в соответствии с некоторой логикой).
Готовый построенный модуль OCX зарегистрирован как положено, фабрика класса имеет атрибуты Apartment + MultiInstance.
В другом (тестовом) Делфи-приложении имеется некая обычная форма, на этой форме есть единственный компонент TOleContainer, в контексте которого я тестирую работу OCX-модуля и ActiveX-формы в составе ее. Тестирование проходит нормально и показывают именно ту логику, что я и ожидаю, а именно : при конструировании объекта активной формы ListView заполняется элементами, при разрушении формы ListView очищается с возбуждением одного-единственного события для каждого удаляемого ListItem"а.
Теперь я тестирую свою активную форму в составе Access :
создаю в режиме конструктора Access-форму, "бросаю" на нее (как внедренный объект) свою активную форму - и вот тут начинаются чудеса !
Сразу после возврата из метода AfterConstruction (где был выполнен код формирования элементов) вдруг ни с того ни с сего для каждого добавленного в ListView элемента вызывается обработчик OnDeletion, после возврата из которого элемент продолжает существовать ! ... А далее все как обычно - разрушаю Access-форму, при этом естественно разрушается и моя активная форма, что снова вызывает возбуждение обработчиков OnDeletion с последующим нормальным удалением элементов.
Еще раз повторюсь - нигде в коде моей активной формы на момент тестирования в обеих средах нет ни намека на явное выполняемое мной удаление элементов списка. И вот при в сем при этом результаты тестирования совершенно различны !
Где тот самый код-невидимка, выполняющийся столь дико и несуразно ? Что я упускаю ? Где не вижу якобы очевидного ?
Надеюсь на свежие идеи ...
← →
Polevi (2004-02-19 12:38) [1]не поленился, сделал как у тебя, все работает нормально
D6, Access2000
если хочешь могу тебе исходники выслать :-)
← →
clickmaker (2004-02-19 12:55) [2]Единственный приходящий в голову вариант, что при инициализации акцесной формы происходит изменение какого-нить св-ва листвью, которое требует вызова ReCreateWnd. А это влечет за собой удаление и пересоздание всех итемов
← →
REA (2004-02-19 13:14) [3]Еще приходит мысль, что кто-то на кого-то наползает и портит память непредсказуемым образом. Последующие вызовы являются следствием. Могу порекомендовать урезать программу до полного пропадания оного эффекта.
← →
Digitman (2004-02-19 13:35) [4]все, разобрался.
во-первых, я дал недостостоверную инф-цию : за "непонятным" OnDeleting действительно следует уничтожение эл-та ... просто визуально это сложно уследить - он тут же создается вновь
вот ключевые фрагменты кода, которые я искал (и которые не вызываются в случае тестирования в акт.формы делфи-приложении):
procedure TActiveXControl.LoadFromStream(const Stream: IStream);
var
OleStream: TOleStream;
begin
OleStream := TOleStream.Create(Stream);
try
OleStream.ReadComponent(FControl); // вот где происхдит это !
finally
OleStream.Free;
end;
end;
function TActiveXControl.PersistStorageLoad(const stg: IStorage): HResult;
var
Stream: IStream;
begin
try
OleCheck(stg.OpenStream("CONTROLSAVESTREAM"#0, nil, STGM_READ +
STGM_SHARE_EXCLUSIVE, 0, Stream));
LoadFromStream(Stream);
FIsDirty := False;
Result := S_OK;
except
Result := HandleException;
end;
end;
← →
Digitman (2004-02-19 14:00) [5]только вот пока - хоть убей - не пойму, какого шута идет перезагрузка компонента из олей-потока
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c