向delphi ide

时间:2017-09-26 09:39:58

标签: delphi delphi-10.2-tokyo delphi-ide timagelist

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

第一步是在IDE中添加一个工具按钮,它会打开一个显示待办事项的表单。

但我注意到一些奇怪的事情,我希望自己能引起这种感觉,因为这意味着它很容易修复。

我正在将我的工具按钮添加到CustomToolbar,这是带有蓝色问号的那个(见后面的截图)

发生的事情:我安装了我的软件包,并在现有按钮旁边添加了正确的图像。 现在我用已安装的软件包关闭模态窗体,然后更改蓝色问号。

enter image description here

不要介意我使用的图标,我最终会使用另一个图标但是确定 所以基本上现有项目会更改为我自己的图标但由于某种原因而被禁用。我无法弄清楚为什么会这样。

正如我在网上找到的指南所建议的,我使用了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中的mem泄漏。

但是,我认为,我不做任何奇怪的事情,但这个问题却发生了 所以我希望这里有人可能做了类似的事情,并在我的代码中看到错误。

提前致谢。

P.S。如果您需要更多信息或者看到该单元的其余部分让我知道并将整个单元放在github或类似的东西上。

修改 感谢@Uwe Raabe,我设法解决了这个问题。 问题出现在INTAServices.AddImages

的评论中
  

AddImages获取给定图像列表中的所有图像并添加它们   到了          主要应用图像列表。它还创建了一个内部映射数组          原始图像索引到主图像列表中的新索引。这个          AddActionMenu使用映射来重新映射的ImageIndex属性          动作对象到新的ImageIndex。这应该是第一种方法          将操作和菜单项添加到主应用程序窗口时调用。          返回值是主应用程序映像列表中的第一个索引          源列表中的第一个图像。用nil调用此函数          图像列表清除内部映射数组。与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 个答案:

答案 0 :(得分:3)

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

您可以放心地使用INTAServices.ImageList连接到您的控件,但您不应该直接添加删除图像。