2

我正在尝试一些东西,并想做一个 delphi IDE 扩展。我的基本想法是扩展当前在 IDE 中的 ToDo 列表功能。

第一步是向 IDE 添加一个工具按钮,该按钮将打开一个显示待办事项的表单。

但我注意到一些我希望自己造成的奇怪事情,因为这意味着它可以很容易地修复。

我正在将我的工具按钮添加到自定义工具栏,这是带有蓝色问号的工具栏(见稍后截图)

发生的事情:我安装了我的包,按钮添加了正确的图像,就在现有按钮的旁边。现在我用已安装的包关闭模态表单,然后蓝色问号发生变化。

在此处输入图像描述

不要介意我使用的图标,我最终会使用不同的图标,但没关系。
所以基本上现有的项目更改为我自己的图标,但由于某种原因被禁用。我无法弄清楚为什么会发生这种情况。

正如我在网上找到的指南中所建议的那样,我使用了 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 或类似的东西上。

编辑: 感谢@Uwe Raabe,我设法解决了这个问题。问题在 INTAServices.AddImages 的评论中发现

AddImages 从给定的图像列表中获取所有图像并将它们添加到主应用程序图像列表中。它还创建了一个从原始图像索引到主图像列表中的新索引的内部映射数组。AddActionMenu 使用此映射将操作对象的 ImageIndex 属性重新映射到新的 ImageIndex。这应该是向主应用程序窗口添加操作和菜单项时调用的第一个方法。返回值是源列表中第一个图像在主应用程序图像列表中的第一个索引。使用 nil 图像列表调用此函数以清除内部映射数组。与祖先接口中的 AddImages 函数不同,此版本采用允许重用相同基本索引的 Ident。

最终解决方案是将我的图像添加到本地图像列表中,该图像列表已添加到 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;
4

1 回答 1

3

你不应该直接摆弄INTAServices.ImageList。而是使用INTAServices.AddMaskedINTAServices.AddImages(如果您的数据模块中有本地图像列表)。

您可以安全地使用INTAServices.ImageList连接到您的控件,但您不应直接添加删除其中的图像。

于 2017-09-26T11:54:28.767 回答