Dodanie menu kontekstowego obsługującego przeciąganie plików

0

Witam. Chciałbym zrobić menu kontekstowe do swojego programu, ale mam drobny problem (w zasadzie dwa, ale to za chwile). Wzoruje się na tym przykładzie, w którym niestety owe menu działa tylko dla jednego zaznaczonego pliku. Wprowadziłem wiec małe poprawki...

Ten kod:

  if (DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, NIL, 0) = 1) then
  begin
    SetLength(FFileName, MAX_PATH);
    DragQueryFile(StgMedium.hGlobal, 0, PChar(FFileName), MAX_PATH);
    SetLength(FFileName, lstrlen(PChar(FFileName)));
    Result := S_OK;
  end
  else
  begin
    FFileName := '';
    Result := E_FAIL;
  end;  

Zastąpiłem tym:

 
  DroppedFileCount := DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, NIL, 0);

  if DroppedFileCount = 0 then
  begin
    FFiles.Clear;
    //FFileName := '';
    Result := E_FAIL;
  end
  else
  begin
	FFiles.Clear;
    for i := 0 to DroppedFileCount - 1 do
    begin
      SetLength(FFileName, MAX_PATH);
      DragQueryFile(StgMedium.hGlobal, i, PChar(FFileName), MAX_PATH);
      SetLength(FFileName, lstrlen(PChar(FFileName)));
      FFiles.Append(FFileName);
      //MessageBox(0, PChar(FFileName), cClassName, mb_OK or mb_IconInformation);
    end;
    Result := S_OK;
  end;

I tutaj właśnie pojawia się problem bo gdzieś trzeba FFiles (TStrings) stworzyć. Klasa TGetExeInfoShellExt ma tylko deklaracje destruktora, wiec dopisałem:

 
  TGetExeInfoShellExt = class(TInterfacedObject, IShellExtInit, IContextMenu)
    private
	  FFiles: TStrings;
	  ...
    public
      constructor Create;
      destructor Destroy; override;
      ...
  end;

constructor TGetExeInfoShellExt.Create;
begin
  inherited;
  FFiles := TStringList.Create;
end;

Czy to jest poprawnie zrobione? Biorąc pod uwagę, ze będzie to rozszerzenie powłoki, chciałbym uniknąć jakiejkolwiek wpadki.

Drugi problem z jakim się borykam, to brak przezroczystej ikony na win7 (działa tylko na XP). Ktoś podpowie jak to zrobić?

0

jeśli korzystasz z tej zmiennej w tylko jednej metodzie to możesz ją zrobić jako lokalną, jeśli w większej ilości metod to jako pole klasy (czyli tak jak masz). Pamiętaj jednak, że obiekt trzeba ZWOLNIĆ w zależności, gdzie go umieścisz albo na końcu metody albo w destruktorze

0

Dzięki za odpowiedź - niby błahostka, ale wolałem się upewnić.

Wracając do problemu z brakiem przezroczystości, doczytałem, że można dobrać się do ownerdrawn przy pomocy IContextMenu2/IContextMenu3, chociaż liczyłem na jakieś prostsze rozwiązanie.

0

Może ten kod w załączniku się na coś Tobie przyda. Bo z przeciąganiem plików jest problem pod nowszymi systemami, w których funkcjonuje mechanizm UAC. Nawet jeżeli jest wyłączony. Chyba, że kombinujesz coś innego. I nie zrozumiałem do końca. Ale o ile wiem to pod Delphi z przeciąganiem plików na własne kontrolki należy kombinować właśnie w ten sposób. Jeśli się jednak ten kod do niczego Tobie nie przyda, to sorry. Być może ktoś jeszcze coś tutaj doradzi, co rozwiąże całkowicie Twój problem. Kod przygotowany pod Delphi 7.

1 użytkowników online, w tym zalogowanych: 0, gości: 1