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


Автор: Keeper89 30.8.2009, 23:17
Доброго времени суток!

Меняю корень STV
user posted image
на новый
user posted image
Код

ShellTreeView1.Root := Edit1.Text;


Как видно - корень в последнем случае не "Новая папка", а "Documents and Settings". Судя по экспериментам такое происходит только в папках, содержащихся в этой самой Documents and Settings (как здесь - на Рабочем Столе).

Может кто-то сталкивался с этим?

Автор: Amphiluke 31.8.2009, 09:07
Это не лекарство (так, хиленькая заплатка), но тем не менее работает...
Код
ShellTreeView1.Root := Edit1.Text;
ShellTreeView1.Items[0].Text := ExtractFileName(Edit1.Text);


Вообще, конечно, можно покопаться в http://www.google.ru/codesearch/p?hl=ru&sa=N&cd=2&ct=rc#mOMTf5SeU4Q/gammu-1.12.90/win32/delphi7.gui/smsd/component/ShellCtrls.pas&q=ShellCtrls.pas%20lang:pascal&l=-1, чтобы понять, откуда растут ноги у этого «бага».

Автор: Keeper89 1.9.2009, 13:30
Заплатка это хорошо, но может есть какой-то другой способ?

Автор: MetalFan 2.9.2009, 12:02
есть:
1. переписать ShellTreeView, чтобы работало, как надо
2. отказаться от STV в пользу VirtualShellTree

Автор: Keeper89 2.9.2009, 16:56
Буду смотреть пока, что переписывать или поставлю заплатку, хотя ее тоже надо продумать - вариант Amphiluke подходит только для директорий, над общим решением надо думать.

Автор: Keeper89 4.9.2009, 14:00
Сделал заплатку следующим образом:
Код

function GetObjectName(objectPIDL: PItemIDList): AnsiString;
  var
    FileInfo: TSHFileInfo;
  begin
    SHGetFileInfo(PAnsiChar(objectPIDL),
                  0, FileInfo, SizeOf(FileInfo),
                  SHGFI_PIDL or SHGFI_DISPLAYNAME);
    Result := FileInfo.szDisplayName;
  end;

procedure TForm1.STV1Change(Sender: TObject; Node: TTreeNode);
var
  tempRootLabel: AnsiString;
begin
  with STV1.Items.GetFirstNode do
  begin
    tempRootLabel := GetObjectName(STV1.SelectedFolder.AbsoluteID);
    if AnsiCompareStr(tempRootLabel,Text) = 0 then
      Text := tempRootLabel;
  end; 
end;

Если есть вариант лучше, буду рад услышать.

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