TActionList Удаление и создание TAction. ЧЯДНТ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

TActionList Удаление и создание TAction. ЧЯДНТ?

Сообщение kotompazb »

Итак, кусок кода:

Код: Выделить всё

  //Удаляем старую историю из ActionList
  for i:=1 to 10 do begin
    tpInt:=ActMain.IndexOfName(Format('ActFileHistory%.2d',[i]));
    if tpInt>-1 then ActMain.Actions[tpInt].Free;
  end;                                                   

  //Создаем новые действия для истории
  if Options.OpenHistory.Count>0 then for i:=1 to Options.OpenHistory.Count do begin
      HistoryAction:=TAction.Create(ActMain);
      HistoryAction.Name:=Format('ActFileHistory%.2d',[i]);
      (HistoryAction as TAction).Caption:=Options.OpenHistory[i-1];
      (HistoryAction as TAction).Tag:=i-1;
      (HistoryAction as TAction).OnExecute:=@OpenFromHistory;
      (HistoryAction as TAction).Update;
    end;

В итоге на строке

Код: Выделить всё

      HistoryAction.Name:=Format('ActFileHistory%.2d',[i]);

получаю ошибку дублирующихся имен. Как это?
gluhow
новенький
Сообщения: 41
Зарегистрирован: 13.08.2015 14:30:20

Re: TActionList Удаление и создание TAction. ЧЯДНТ?

Сообщение gluhow »

Может быть это связано с тем что создаете по количеству историй (Options.OpenHistory.Count), а удаляете только первые 10?
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TActionList Удаление и создание TAction. ЧЯДНТ?

Сообщение kotompazb »

Не. Там их не может быть больше 10. При добавлении нового проверяется их число, и если оно больше 10, то последний удаляется, а новый вставляется вверх списка. Ошибка где-то в другом.
gluhow
новенький
Сообщения: 41
Зарегистрирован: 13.08.2015 14:30:20

Re: TActionList Удаление и создание TAction. ЧЯДНТ?

Сообщение gluhow »

Дело в том что при

Код: Выделить всё

HistoryAction:=TAction.Create(ActMain);

ActMain становится владельцем HistoryAction, это значит что ActMain отвечает за очистку памяти HistoryAction. Но при этом HistoryAction не появляется в списке ActMain, так что корректный вариант будет таким

Код: Выделить всё

        HistoryAction:=TAction.Create(Self);
        HistoryAction.ActionList:=ActMain;
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TActionList Удаление и создание TAction. ЧЯДНТ?

Сообщение kotompazb »

Спасибо за помощь!
Ответить