Странное поведение при добавлении кнопки к 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
быть подключенным к вашим элементам управления, но вы не должны ни добавлять, ни удалять изображения в нем напрямую.