![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как мне удалить себя внутри себя? [D7, XP]
буржуй © (2006-02-03 17:31:00)Следующая ситуация. Есть некий навигатор с кучей элементов внутри себя. На каждом элементе находится веббраузер с загруженной в run-time сгенерированной страничкой. На страничке ряд ссылок, ниже привожу обработчик клика по гиперссылке мини-браузера:
procedure TALNavigatorItem.BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
const
AB = 'about:blankrubric_';
var
myRubric: String;
RIndex,i: Integer;
Contacts: TIntegerList;
begin
myRubric:=URL;
Delete(myRubric,1,Length(AB));
try
RIndex:=StrToInt(myRubric);
myRubric:=Self.FMegaContact.Rubrics[RIndex];
//--
Contacts:=TIntegerList.Create;
ADOModule.GetCIndexByRubric('Контакты',myRubric,Contacts);
MainForm.Navigator.ClearItems; // <-- убийство всех экземпляров включая этот
for i:=0 to Contacts.Count-1 do
FNavigator.AddItemWInfo(Contacts[i]);
Contacts.Free;
except
end;
Cancel:=True;
end;
Как мне удалить себя внутри себя?
Как обычно делается подобное? Просто если я вынесу сей метод из public-раздела класса TALNavigatorItem, то возникнит проблема с передачей информации именно текущего экземпляра. Я имею в виду
myRubric:= Self.FMegaContact.Rubrics[RIndex];
Как разрешаются подобные ситуации, что можете посоветовать?
Gero (2006-02-04 12:16:00) [1]> имеете в виду описать пользовательский message
> WM_FREEITEM = WM_USER + 1
>
> и PostMessage'м убивать контрол? посылая WM_FREEITEM. в
> свою очередь реализовав отлов мессаги.
>
> я правильно вас понял?
Да.
буржуй (2006-02-03 21:16:00) [2]SergP © (03.02.06 21:12) [8]
можно поподробнее?
имеете в виду описать пользовательский message
WM_FREEITEM = WM_USER + 1
и PostMessage'м убивать контрол? посылая WM_FREEITEM. в свою очередь реализовав отлов мессаги.
я правильно вас понял?
SergP (2006-02-03 21:12:00) [3]
> я пытаюсь убить себя (Free) будучи в теле себя
Возможно тебе нужен PostMessage ?
буржуй (2006-02-03 19:39:00) [4]может subj плохо сформулирован?
в общем имею код приведенный в [0].
это реализация одного из методов TALNavigatorItem в теле который освобождается объект, который этот метод вызвал. в результате чего (насколько я понял ситуацию) вылетает AV. т.е. я пытаюсь убить себя (Free) будучи в теле себя (метод BeforeNavigate2). как избежать подобной ситуации учитывая приведенные в [0] данные.
Zeqfreed (2006-02-03 19:16:00) [5][5] буржуй (03.02.06 19:01)
> вопрос плохо сформулировал
буржуй (2006-02-03 19:01:00) [6]умоляю, подсобите! думал конкурс изменит отношение к новичкам. может я вопрос плохо сформулировал?
буржуй (2006-02-03 17:43:00) [7]Германн © (03.02.06 17:40) [3]
во-первых я их не удаляю из списка, а только освобождаю ) тут вы несколько не правы =) во-вторых вопрос то ни в этом заключается. смотрим subj + describe ;)
да и пример удаления я привел просто так. так что ваш [3] несколько неуместен.
Германн (2006-02-03 17:40:00) [8]for i:=MainForm.Navigator.Count-1 downto 0 do
буржуй (2006-02-03 17:37:00) [9]MainForm.Navigator.ClearItems; // <-- убийство всех экземпляров включая этот
данная строка приведет приблизительно к следующему:
for i:=0 to MainForm.Navigator.Count-1 do
FreeAndNil(MainForm.Navigator.Items[i]);
в результате проскакивает периодически AV.
либо я дурень и у меня AV возникает не из-за того что я в реализации метода класса удаляю "текущий" экземпляр класса...
Игорь Шевченко (2006-02-03 17:33:00) [10]
> Как мне удалить себя внутри себя?
Что именно имеется в виду ?