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

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

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

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

Сообщение kotompazb » 25.06.2019 23:18:29

Итак, кусок кода:
Код: Выделить всё
  //Удаляем старую историю из 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]);

получаю ошибку дублирующихся имен. Как это?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 147
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

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

Сообщение gluhow » 26.06.2019 12:26:47

Может быть это связано с тем что создаете по количеству историй (Options.OpenHistory.Count), а удаляете только первые 10?
gluhow
новенький
 
Сообщения: 32
Зарегистрирован: 13.08.2015 15:30:20

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

Сообщение kotompazb » 26.06.2019 14:13:52

Не. Там их не может быть больше 10. При добавлении нового проверяется их число, и если оно больше 10, то последний удаляется, а новый вставляется вверх списка. Ошибка где-то в другом.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 147
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

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

Сообщение gluhow » 26.06.2019 15:36:53

Дело в том что при
Код: Выделить всё
HistoryAction:=TAction.Create(ActMain);

ActMain становится владельцем HistoryAction, это значит что ActMain отвечает за очистку памяти HistoryAction. Но при этом HistoryAction не появляется в списке ActMain, так что корректный вариант будет таким
Код: Выделить всё
        HistoryAction:=TAction.Create(Self);
        HistoryAction.ActionList:=ActMain;
gluhow
новенький
 
Сообщения: 32
Зарегистрирован: 13.08.2015 15:30:20

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

Сообщение kotompazb » 26.06.2019 19:36:52

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru