2017-09-26 179 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中,它在上面的註釋中。 我接受這個,並把解決方案的問題再次.. 謝謝 –