Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
1-6106
Ал
2004-01-23 13:38
2004.03.03
Функция в Делфи


14-6192
Knight
2004-02-09 01:21
2004.03.03
Навеяно темой о Лукьяненко...


1-6137
PHENIX physicist
2004-02-18 18:33
2004.03.03
TeeChart Pro 5.02


14-6196
Undert
2004-02-11 15:42
2004.03.03
History в ICQ


3-5969
чайник1
2004-02-05 15:04
2004.03.03
select из двух таблиц