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

Вниз

Как правильно удалить TMenuItem?   Найти похожие ветки 

 
Aleksandr.   (2005-07-29 13:50) [0]

В программе в rt создается меню:

procedure TInvForm.RecreateMenu;
var
 M : TMenuItem;
 T : TMenuItem;
 i : integer;
 s : shortstring;
begin
 while PM.Items.Count>FixedMenuCount do
   PM.Items.Delete(PM.Items.Count-1);
 if DocsList.Count>0 then begin
   for i:=0 to DocsList.Count-1 do begin
     T:=PM.CreateMenuItem;
     PM.D
     s:=DocsList.Names[i];
     while length(s)<3 do
       s:="0"+s;
     T.Name:="M0"+s;
     T.Caption:=h_Print+DocsList.ValueFromIndex[i];
     T.Tag:=StrToInt(DocsList.Names[i]);
     PM.Items.Add(T);
     M:=PM.CreateMenuItem;
     M.Name:="T0"+s;
     M.Tag:=T.Tag+1;
     M.Action:=aPrint;
     M.Caption:=h_DirectPrint;
     T.Add(M);
     M:=PM.CreateMenuItem;
     M.Name:="T1"+s;
     M.Tag:=-(T.Tag+1);
     M.Action:=aPrint;
     M.Caption:=h_ByMenuItem;
     T.Add(M)
   end
 end;
end;

При создании формы все отлично: появляются пункты меню, субменю, работает Action на них. А вот когда созданная форма опять получает сообщение на пересоздание меню, возникает ошибка, что компонент с таким именем уже существует. То есть, получается, просто

 while PM.Items.Count>FixedMenuCount do
   PM.Items.Delete(PM.Items.Count-1);

недостаточно для удаления? Как их корректно удалять?


 
Reindeer Moss Eater ©   (2005-07-29 13:51) [1]

M.Name:="T0"+s;

А зачем тебе явно указывать свойство "name"?


 
Aleksandr.   (2005-07-29 13:56) [2]

Reindeer Moss Eater ©  :
Мне иногда надо обратиться по имени компонента.


 
Гаврила ©   (2005-07-29 13:58) [3]

Корректно удалить можно так:
MenuItem.Free;


 
Reindeer Moss Eater ©   (2005-07-29 13:59) [4]

Мне иногда надо обратиться по имени компонента.
Зачем?

PM.Items[0].Clear;


 
Leonid Troyanovsky ©   (2005-07-29 14:01) [5]


> Aleksandr.   (29.07.05 13:50)  

>  while PM.Items.Count>FixedMenuCount do
>    PM.Items.Delete(PM.Items.Count-1);
>
> недостаточно для удаления? Как их корректно удалять?


Для удаления из меню - вполне достаточно.
Однако, сами по себе объекты продолжают жить
вплоть до их Free.

Можешь Create их при создании формы,
а вставлять-удалять по потребности.

--
Regards, LVT.


 
Aleksandr.   (2005-07-29 14:33) [6]

Нифига не получается.
Сделал:

 while PM.Items.Count>FixedMenuCount do begin
   PM.Items[PM.Items.Count-1].Free;
   PM.Items.Delete(PM.Items.Count-1)
 end;

То же самое. А, часом, никому не надо вызывать что-то типа RemoveComponent?


 
Reindeer Moss Eater ©   (2005-07-29 14:36) [7]

Отлаживай пошагово свой цикл и смотри что там реально удаляется и уничтожается.


 
Reindeer Moss Eater ©   (2005-07-29 14:40) [8]

Если, как ты говоришь, тебе позарез нужны имена создаваемым пунктам меню и если ты "обращаешься" к ним по именам, то фик ли ты не удаляешь их обращаясь по именам?

Найди их всех и сделай Free.


 
Leonid Troyanovsky ©   (2005-07-29 14:41) [9]


> Aleksandr.   (29.07.05 14:33) [6]

>    PM.Items[PM.Items.Count-1].Free;
>    PM.Items.Delete(PM.Items.Count-1)



Переставь строчки, а то выглядит ужасающе.

--
Regards, LVT.

PS А зачем такая кровожадность?


 
Гаврила ©   (2005-07-29 16:20) [10]

Не "переставь строчки", а вообще убери PM.Items.Delete(PM.Items.Count-1)


 
Leonid Troyanovsky ©   (2005-07-29 19:37) [11]


> Гаврила ©   (29.07.05 16:20) [10]
> Не "переставь строчки", а вообще убери PM.Items.Delete(PM.Items.Count-1)


Да я не против.
Хотя, можно и наоборот.
Главное - чтобы не так ужасающе.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
6-1115968072
Valera
2005-05-13 11:07
2005.08.21
ICMP CLIENT


1-1122987824
webpauk
2005-08-02 17:03
2005.08.21
Иконка из Hinstance


14-1122941411
k2
2005-08-02 04:10
2005.08.21
Imagine Cup 2005


1-1122989229
Viktop
2005-08-02 17:27
2005.08.21
Сохранение настроек в ini


1-1122683948
Alexandr+
2005-07-30 04:39
2005.08.21
Как самое простое преобразовать Хтмл в чистый текст?