Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > получить расширение файла


Автор: gonzales 29.8.2007, 11:06
в демках к делфе есть пример virtual listview, но есть одна проблема. Если у пользователя стоит "не показывать расширения зарегистрированных типов", то получается невозможным запуск файлов.
За получение имени файла отвечает функция
Код

function GetDisplayName(ShellFolder: IShellFolder; PIDL: PItemIDList;
                        ForParsing: Boolean): string;
var
  StrRet: TStrRet;
  P: PChar;
  Flags: Integer;
begin
  Result := '';
  if ForParsing then
    Flags := SHGDN_FORPARSING
  else
    Flags := SHGDN_NORMAL;


  ShellFolder.GetDisplayNameOf(PIDL, Flags, StrRet);
  case StrRet.uType of
    STRRET_CSTR:
      SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));
    STRRET_OFFSET:
      begin
        P := @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)];
        SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);
      end;
    STRRET_WSTR:
      Result := StrRet.pOleStr;
  end;
end;



так вот, как заставить ее показывать файл вместе с расширением

Автор: gonzales 29.8.2007, 11:38
все, сам дотумкал

Код

GetDisplayName(FIShellFolder,ID,true)  //флаг SHGDN_FORPARSING дает полный путь к файлу 


таким образом для правильного запуска файлов из virtual listview
Код

procedure TForm1.ListViewDblClick(Sender: TObject);
var
  RootPIDL,
  ID: PItemIDList;
begin
  if ListView.Selected <> nil then
  begin
    ID := ShellItem(ListView.Selected.Index).ID;
    if not IsFolder(FIShellFolder, ID) then
    shellexecute(form1.Handle,'open',PChar(GetDisplayName(FIShellFolder,ID,true)),'','',sw_show)
    else
     begin
      RootPIDL := ConcatPIDLs(FPIDL, ID);
      SetPath(RootPIDL);
     end;
  end;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)