Главная страница
    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.042 c
4-1117471883
Terech
2005-05-30 20:51
2005.08.21
Запуска файла ДОС под Win9x


14-1122632474
Kerk
2005-07-29 14:21
2005.08.21
Удобство vs приватность в сети. Диалог. Мысли?


6-1115094895
piople
2005-05-03 08:34
2005.08.21
IIS 6.0 + win2003 + cgi


14-1122586617
Petr V. Abramov
2005-07-29 01:36
2005.08.21
Я почти уверен в победе революции в России


14-1122630536
Lexer
2005-07-29 13:48
2005.08.21
Отчётность АО должна быть в сети?





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