2017-09-26 180 views
2

我尝试了一些东西并希望创建一个delphi IDE扩展。 我的基本想法是扩展当前在IDE中的ToDo列表功能。在向delphi IDE添加工具按钮时出现奇怪的行为

第一步是在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是我自己的过程,简单地销毁所有我的对象,并抛出一个异常,这样做是为了防止泄漏的MEM在IDE中。

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

在此先感谢。

P.s.如果你需要更多的信息或看到单位的其他部分,让我知道,并把整个单位放在github上或类似的东西。

编辑: 感谢@Uwe Raabe我设法解决了这个问题。 问题在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; 
+0

AddToolButton返回什么类型。你必须演员表明,这不是你认为的。 –

+0

@DavidHeffernan,AddToolButton返回一个TControl。我同意这些演员在这里可能会出现问题,甚至根本不需要。 –

回答

3

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

您可以安全地使用INTAServices.ImageList连接到你的控制,但你既不应该添加也不它直接删除图像。

+0

感谢您的建议。我用本地图像列表尝试了AddMasked和AddImages,但问题仍然存在。任何其他想法? –

+0

提供显示该问题的最简单,完整的示例。 –

+0

好吧,我看着更多,我解决了它。答案确实在INTAServices.AddImages中,它在上面的注释中。 我接受这个,并把解决方案的问题再次.. 谢谢 –