2017-09-26 11 views
2

나는 몇 가지 시도를하고 있었고 델파이 IDE 확장을 만들고 싶었다. 내 기본 아이디어는 현재 IDE에있는 ToDo 목록 기능을 확장하는 것이 었습니다.델파이 IDE에 툴박트를 추가 할 때 이상한 행동

1 단계는 IDE에 도구 버튼을 추가하여 수행 할 항목을 보여주는 양식을 엽니 다.

하지만 나는 이상하게 생각한 부분이있어서 쉽게 고쳐질 수 있다는 것을 알았습니다.

나는 블루와 Questionmark과 하나입니다 CustomToolbar, 내 toolbutton를 추가하고 (참조 스크린 샷 이상)

일어나는 것 : 좋아, 내 패키지를 설치하고 버튼 올바른 이미지 추가 기존 버튼 옆에 있습니다. 이제 설치된 패키지로 모달 폼을 닫은 다음 파란색 물음표가 변경됩니다.

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 누수를 방지하기 위해 않았다 단지 내 모든 개체를 파괴하고 예외가 발생 내 자신의 과정이다.

그러나 나는 이상한 일은하지 않지만이 문제가 발생한다고 생각합니다.
여기 누군가가 simular를했을 수도 있고 코드에서 오류를 볼 수 있기를 바랍니다.

미리 감사드립니다.

p.s. 더 자세한 정보가 필요하거나 유닛의 나머지 부분을 보게되면 전체 유닛을 github 또는 그와 비슷한 것으로 알려줍니다.

편집 : @Uwe Raabe 덕분에이 문제를 해결할 수있었습니다. 문제는

AddImages는 지정된 이미지 목록에서 모든 이미지를 가져 와서 기본 응용 프로그램의 ImageList에 그들에게 를 추가 INTAServices.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; 
+0

AddToolButton이 반환하는 유형입니다. 당신이 캐스팅해야한다는 것은 그것이 당신이 생각하는 것이 아니라고 제안합니다. –

+0

@DavidHeffernan, AddToolButton은 TControl을 반환합니다. 하드 캐스팅은 여기서 문제가 될 수 있으며 전혀 필요하지 않아야한다는 데 동의합니다. –

답변

3

직접 INTAServices.ImageList 주변에 바이올린 안된다. 대신 INTAServices.AddMasked 또는 INTAServices.AddImages을 사용하십시오 (데이터 모듈에 로컬 imagelist가있는 경우를 대비하여).

당신은 안전하게 INTAServices.ImageList이 당신의 컨트롤에 연결하는 데 사용할 수 있지만, 당신은 어느 쪽도 이 직접에 이미지를 삭제 추가 없습니다.

+0

귀하의 조언에 감사드립니다. AddMasked와 AddImages를 로컬 imagelist와 함께 시도했지만 여전히 문제가 지속됩니다. 다른 생각? –

+0

문제를 보여주는 최소한의 완전한 예제를 제공하십시오. –

+0

글쎄, 나는 그걸 더 들여다 보았다. 나는 그것을 풀었다. 대답은 참으로 INTAServices.AddImages에 있습니다. 위 주석에 있습니다. 아빠가이 문제를 받아 들여서 다시 질문에 답하십시오. 감사합니다. –