Странное поведение при добавлении кнопки к delphi ide

Я пробовал кое-что и хотел сделать расширение Delphi IDE. Моя основная идея заключалась в расширении функции списка дел, которая в настоящее время находится в IDE.

Первым шагом было добавление в IDE кнопки инструментов, которая открывала бы форму, показывающую элементы задачи.

Но я заметил некоторые странные вещи, которые, я надеюсь, вызвал у себя, так как это означало бы, что это легко исправить.

Я добавляю свою панель инструментов на панель инструментов CustomToolbar с синим вопросительным знаком (см. Скриншот ниже)

Вот что происходит: я устанавливаю свой пакет, и кнопка добавляется с правильным изображением, прямо рядом с существующей кнопкой. Теперь я закрываю модальную форму с установленными пакетами, а затем синий вопросительный знак меняется.

Не берите в голову иконку, которую я использовал, я буду использовать другую, но хорошо.
Поэтому в основном существующий элемент меняется на мой собственный значок, но по какой-то причине отключается. И я не могу понять, почему это происходит.

Как указано в руководстве, которое я нашел в Интернете, я использовал TDatamodule для реализации своего кода.

Мой код:

procedure TDatamoduleToDoList.Initialize;
var
  LResource, LhInst: Cardinal;
begin
  LhInst := FindClassHInstance(Self.ClassType);
  if LhInst > 0 then
  begin
    LResource := FindResource(LhInst, 'icon', RT_Bitmap);
    if LResource > 0 then
    begin
      FBMP := Vcl.Graphics.TBitmap.Create;
      FBMP.LoadFromResourceName(LhInst, 'icon');
    end
    else
      DoRaise('Resource not found');
  end
  else
    DoRaise('HInstance Couldn''t be found');
  FToDoAction := TTodoAction.Create(Self);
  FToDoAction.Category := actionCat;
  FToDoAction.ImageIndex := FIntaServices.ImageList.Add(FBMP, nil);
  FToDoAction.Name := 'my_very_own_action_man';
end;

procedure TDatamoduleToDoList.DataModuleCreate(Sender: TObject);
begin
  //Create extension
  if Supports(BorlandIDEServices, INTAServices, FIntaServices) then
  begin
    Initialize;
    if FToDoAction <> nil then
      FCustBut := TSpeedButton(FIntaServices.AddToolButton(sCustomToolBar, 'CstmToDoList', FToDoAction))
    else
      DoRaise('Initialize failed');
  end
  else
    DoRaise('Something went wrong');
end;

DoRaise - это моя собственная процедура, которая просто уничтожает все мои объекты и вызывает исключение, сделав это для предотвращения утечек памяти в ide.

Но, думаю, я не делаю ничего странного, но эта проблема возникает.
Поэтому я надеюсь, что кто-то здесь мог сделать что-то похожее и увидеть ошибку в моем коде.

Заранее спасибо.

Ps, если вам нужно больше информации или увидеть остальную часть устройства, дайте мне знать, и я поставлю весь модуль на github или что-то в этом роде.

Редактировать: Благодаря @ Уве Раабе мне удалось решить эту проблему. Проблема была найдена в комментариях INTAServices.AddImages

AddImages берет все изображения из данного списка изображений и добавляет их в основной список изображений приложения. Он также создает внутренний массив сопоставления от исходных индексов изображений до новых индексов в основном списке изображений. Это отображение используется AddActionMenu для переназначения свойства ImageIndex объекта действия в новый ImageIndex. Это должен быть первый метод, вызываемый при добавлении действий и пунктов меню в главное окно приложения. Возвращаемое значение - это первый индекс в списке изображений основного приложения первого изображения в списке источников. Вызовите эту функцию со списком нулевых изображений, чтобы очистить внутренний массив сопоставлений. В отличие от функции AddImages из интерфейса предка, эта версия использует Ident, который позволяет повторно использовать один и тот же базовый индекс. Это полезно, когда в среде IDE выполняется загрузка персон по требованию, чтобы изображения регистрировались только один раз, и можно использовать одни и те же индексы изображений.

Решением в конечном итоге было добавление моего изображения в локальный список изображений, который был добавлен в список изображений кода IntaServices:

procedure TDatamoduleToDoList.DataModuleCreate(Sender: TObject);
begin
  //Create extension
  if Supports(BorlandIDEServices, INTAServices, FIntaServices) then
  begin
    Initialize;
    if FToDoAction <> nil then
    begin
      FCustBut := TSpeedButton(FIntaServices.AddToolButton(sCustomToolBar, 'CstmToDoList', FToDoAction));
      FToDoAction.ImageIndex := FIntaServices.AddImages(FImages);//This is the fix
    end
    else
      DoRaise('Initialize failed');
  end
  else
    DoRaise('Something went wrong');
end;

1 ответ

Решение

Вы не должны возиться с INTAServices.ImageList непосредственно. Вместо этого используйте либо INTAServices.AddMasked или же INTAServices.AddImages (если у вас есть локальный список изображений в вашем модуле данных).

Вы можете безопасно использовать INTAServices.ImageList быть подключенным к вашим элементам управления, но вы не должны ни добавлять, ни удалять изображения в нем напрямую.

Другие вопросы по тегам