Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

Как правильно удалить 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
3-1121236824
Ирина
2005-07-13 10:40
2005.08.21
DBGrid


3-1121166891
Ирина
2005-07-12 15:14
2005.08.21
Сортировка


4-1120138852
<Lelik>
2005-06-30 17:40
2005.08.21
Про CB_DIR


14-1122457669
Layner
2005-07-27 13:47
2005.08.21
База по автомобилям


14-1122472593
Burmistroff
2005-07-27 17:56
2005.08.21
Buffer overflow





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский