Форум: "Основная";
Текущий архив: 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