Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-6038
Sash
2004-02-16 07:04
2004.03.03
Handle окна


14-6241
John S.
2004-02-10 16:01
2004.03.03
Почему сгорел комьютер


1-6046
ARTOSHKA
2004-02-19 01:50
2004.03.03
Перехват панели часов


1-6073
N@$H
2004-02-21 14:31
2004.03.03
Свой task bar


14-6199
марсианин
2004-02-11 16:47
2004.03.03
Имена каталогов после восстановления





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский