gpt4 book ai didi

delphi - 向delphi ide添加工具按钮时的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 18:30:04 25 4
gpt4 key购买 nike

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

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

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

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

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

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 中的内存泄漏。

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

提前致谢。

附:如果您需要更多信息或查看单元的其余部分,请告诉我,并将整个单元放在 github 或类似的东西上。

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

AddImages takes all the images from the given image list and adds them to the main application imagelist. It also creates an internal mapping array from the original image indices to the new indices in the main imagelist. This mapping is used by AddActionMenu to remap the ImageIndex property of the action object to the new ImageIndex. This should be the first method called when adding actions and menu items to the main application window. The return value is the first index in the main application image list of the first image in the source list. Call this function with an nil image list to clear the internal mapping array. Unlike the AddImages function from the ancestor interface, this version takes an Ident that allows the same base index to be re-used. This is useful when the IDE implements demand-loading of personalities so that the images will only get registered once and the same image indices can be used.



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

最佳答案

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

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

关于delphi - 向delphi ide添加工具按钮时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46422918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com