![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно удалить TMenuItem? [D7, WinXP]
Aleksandr. © (2005-07-29 13:50:00)В программе в 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);
недостаточно для удаления? Как их корректно удалять?
Leonid Troyanovsky (2005-07-29 19:37:00) [1]
> Гаврила © (29.07.05 16:20) [10]
> Не "переставь строчки", а вообще убери PM.Items.Delete(PM.Items.Count-1)
Да я не против.
Хотя, можно и наоборот.
Главное - чтобы не так ужасающе.
--
Regards, LVT.
Гаврила (2005-07-29 16:20:00) [2]Не "переставь строчки", а вообще убери PM.Items.Delete(PM.Items.Count-1)
Leonid Troyanovsky (2005-07-29 14:41:00) [3]
> Aleksandr. (29.07.05 14:33) [6]
> PM.Items[PM.Items.Count-1].Free;
> PM.Items.Delete(PM.Items.Count-1)
Переставь строчки, а то выглядит ужасающе.
--
Regards, LVT.
PS А зачем такая кровожадность?
Reindeer Moss Eater (2005-07-29 14:40:00) [4]Если, как ты говоришь, тебе позарез нужны имена создаваемым пунктам меню и если ты "обращаешься" к ним по именам, то фик ли ты не удаляешь их обращаясь по именам?
Найди их всех и сделай Free.
Reindeer Moss Eater (2005-07-29 14:36:00) [5]Отлаживай пошагово свой цикл и смотри что там реально удаляется и уничтожается.
Aleksandr. (2005-07-29 14:33:00) [6]Нифига не получается.
Сделал:
while PM.Items.Count>FixedMenuCount do begin
PM.Items[PM.Items.Count-1].Free;
PM.Items.Delete(PM.Items.Count-1)
end;
То же самое. А, часом, никому не надо вызывать что-то типа RemoveComponent?
Leonid Troyanovsky (2005-07-29 14:01:00) [7]
> Aleksandr. (29.07.05 13:50)
> while PM.Items.Count>FixedMenuCount do
> PM.Items.Delete(PM.Items.Count-1);
>
> недостаточно для удаления? Как их корректно удалять?
Для удаления из меню - вполне достаточно.
Однако, сами по себе объекты продолжают жить
вплоть до их Free.
Можешь Create их при создании формы,
а вставлять-удалять по потребности.
--
Regards, LVT.
Reindeer Moss Eater (2005-07-29 13:59:00) [8]Мне иногда надо обратиться по имени компонента.
Зачем?
PM.Items[0].Clear;
Гаврила (2005-07-29 13:58:00) [9]Корректно удалить можно так:
MenuItem.Free;
Aleksandr. (2005-07-29 13:56:00) [10]Reindeer Moss Eater © :
Мне иногда надо обратиться по имени компонента.
Reindeer Moss Eater (2005-07-29 13:51:00) [11]M.Name:='T0'+s;
А зачем тебе явно указывать свойство "name"?