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


Автор: Zero 13.11.2004, 19:47
Народ, у меня возник очень важный для меня вопрос:
Как сделать так, чтобы компонент, ShellListView отображал только те элементы рабочего стола, которые я захочу.
Заранее спасибо всем за любую, помощь!!!

Автор: Alex 13.11.2004, 19:59
Написать свой. smile

Автор: Zero 13.11.2004, 21:39
Цитата
Написать свой.

Я бы непротив, но тогда как получить список отдельных ярлыков, и пирикинуть их на форму или на то, на чём они должны отображатся???

Автор: Alex 13.11.2004, 21:50
Возьми ListView и создай в нем столько элементов, сколько тебе нужно, а картинку возьми из ярлыка (пример извлечения иконки из ярлыка есть в DRKB)

Автор: Girder 13.11.2004, 23:15
1... smile
Код
uses ...ShlObj;
...
function GetFolderPath(nFolder:Integer):String;
var pidlItself:PItemIDList;
   s:string;
   hr:HResult;
   i:integer;
begin
Result:='';
hr:=SHGetSpecialFolderLocation(0,nFolder,pidlItself);
if Succeeded(hr) then
 begin
  SetLength(s,MAX_PATH*10);
  if SHGetPathFromIDList(pidlItself,PChar(s)) then
   begin
    i:=Pos(#0,s);
    if i=0 then i:=Length(s);
    Result:=trim(copy(s,1,i));
   end;
 end;
end;


2. Неуверен что правильно тебя понял... но тем неменее... smile .
Прицепи к OnAddFolder вот енту процедуру...
Код
procedure TForm1.ShellListView1AddFolder(Sender: TObject;
 AFolder: TShellFolder; var CanAdd: Boolean);
var s:string;
begin
if DeskTop='' then DeskTop:=ExtractFileName(GetFolderPath(CSIDL_DESKTOP));
try
 s:=AFolder.Parent.DisplayName;
except
 s:='';
end;
if (AnsiCompareText(s,DeskTop)=0) then
 begin
  s:=AFolder.DisplayName;
  if (AnsiCompareText(s,'Корзина')=0)or(AnsiCompareText(s,'Сетевое окружение')=0) then
   CanAdd:=false else
   begin
    s:=ExtractFileName(AFolder.PathName);
    if AnsiCompareText('MPIRun.lnk',s)=0 then
     CanAdd:=false;
   end;
 end;
end;
PS: Не показываем 'Корзину', 'Сетевое окружение' и файл 'MPIRun.lnk'

Удачи.

Автор: Zero 13.11.2004, 23:25
Упс, я извеняюсь, я не заметил, что Гирдер, мне уже выслал код...Это сообщение не к месту...
Спасибо Гирдер, буду пробывать... smile

Автор: Zero 13.11.2004, 23:53
Girder, спасибо конечно за процедуры, но что-то я не совсем понял, что они делают, и идентификатор Desktop, я пологаю должен быть типа string??? А то чё-то Процедура AddFolder не компилится так.
Да кстати
Цитата
Неуверен что правильно тебя понял... но тем неменее...

На самом деле мне нужно сделать, чтобы при запуске приложения Delphi все ярлыки которые уже созданы, не отображались на ShellListView, а которые далее я создаю программным путём отображались.
Всё уже сделано кроме правильного отображения информации в ShellListView...
Пожалуйста, если знаешь как это исправить, то напиши мне ещё кусок кода, а то мне через неделю уже сдавать курсач, а у меня не сделана всего-лишь одна мелоч, но которая может существенно повлиять на оценку. smile

Автор: Zero 14.11.2004, 11:20
Ладно народ, раз уж у меня не получилось сделать тем способом, то я придумал новый, если сделать двойной щелчок мышью по компоненту ShellListView, то появится окно где путь можно поменять на не стандартный (на свой), но проблема теперь в том что на разных компьютерах он может быть разным, и мне нужно чтобы его можно было устанавливать программно, но вот это почему-то не как не получается сделать... smile
Может из вас кто-нибудь знает как это можно сделать, заранее благодарен.
Замечание: Путь содержит сво-во Root, и его-то надо програмно изменить...

Автор: Alex 14.11.2004, 11:57
Код

const
 p = 'Root:\';
begin
 ShellListView1.Root:= AnsiReplaceText(p, 'Root', 'c');

Автор: Zero 14.11.2004, 12:30
Alex, что то при компиляции выдаётся ошибка:
[Error] Work_Table.pas(151): Undeclared identifier: 'AnsiReplaceText' smile
Может здесь несоответствие типов???
И ещё здесь получается, что если путь ставить программно, то всё равно тот который стоит в константах, и получается что его нельзя будет изменять, т.е.
У меня есть строка которая определяет путь, который должен отображатся компонентом ShellListView, но никак не получается её занести в свойство Root.

Автор: Alex 14.11.2004, 12:43
Цитата(Zero @ 14.11.2004, 12:30)
Alex, что то при компиляции выдаётся ошибка:
[Error] Work_Table.pas(151): Undeclared identifier: 'AnsiReplaceText' 

У тебя Delphi какой версии?
Цитата(Zero @ 14.11.2004, 12:30)
И ещё здесь получается, что если путь ставить программно, то всё равно тот который стоит в константах, и получается что его нельзя будет изменять, т.е.

Ничего не понял

Цитата(Zero @ 14.11.2004, 12:30)
У меня есть строка которая определяет путь, который должен отображатся компонентом ShellListView, но никак не получается её занести в свойство Root.

Покажи код

Автор: Zero 14.11.2004, 12:55
Цитата
У тебя Delphi какой версии?

Delphi7
Цитата
Ничего не понял

Короче, если говорить по руски, то это можно представить так:
Код

Var
  s:string;  //Допустим у меня какая-то строка
...

Например при появлении формы, она присвоит какой-нибудь путь:
Код

procedure TForm1.FormShow(Sender: TObject);
begin
 s:='C:\...\MyDesktop'
end;

И потом неплохо было-бы если при написании такого кода компилятор мне не выдал бы сообщение об ошибке: smile
Код

ShellListView1.Root:=s;  //Но к сожалению так делать нельзя :(

Автор: Alex 14.11.2004, 13:40
100% работает:
Код

procedure TForm1.Button3Click(Sender: TObject);
var
 s: String;
begin
 s:= 'C:\';
 ShellListView1.Root:= s;
end;

Автор: p0s0l 14.11.2004, 13:49
AnsiReplaceText - в юните StrUtils, Zero, я тебе уже говорил в теме про польскую запись, как находить модуль, в котором находится стандартная функция smile

Цитата
ShellListView1.Root:=s;  //Но к сожалению так делать нельзя smile
И у меня это работает! smile

Автор: Zero 14.11.2004, 14:21
Alex и PoSol, спасибо вам большое!!! smile
Наконец, то зароботало...
Цитата
я тебе уже говорил в теме про польскую запись

А сейчас уже (когда заработало) я вспомнил, про то что надо навести курсор на слово и нажать <F1>, но доэтого когда в голове ещё то что срок через неделю, и такая мелкая ошибка с которой пол дня сижу, всё сразу вылетело. smile

Автор: p0s0l 14.11.2004, 14:31
Цитата(Zero @ 14.11.2004, 14:21)
Alex и PoSol, спасибо вам большое!!!
Как только мой ник не напишут smile
(сорри за offtopic )

Автор: Girder 14.11.2004, 17:35
Цитата(Zero @ 14.11.2004, 11:20)
Ладно народ, раз уж у меня не получилось сделать тем способом
smile Как говорится скромность - сестра таланта... smile

Цитата(Zero @ 13.11.2004, 23:53)
Girder, спасибо конечно за процедуры, но что-то я не совсем понял, что они делают,
Вот архив, там есть небольшие smile пояснения.

PS: Если хочеш добавить объект(то что в Edit-е) который не существует в файловой системе... то для ентого надо дополнительно создать его(можно виртуально), а также можно зарегистрировать для него CSIDL...

*Файл ShellCtrls.pas удалять не надо... smile и еще: при добавлении сильно(более 2) вложенно папки(для файлов все ок!)... отображается не правильное имя... хотя интерфейс соответствует(т.е. если на нее кликнуть... попадеш куда надо) smile (PS: PIDL надо подправить для исправления глюка... но мне лень... smile )

Автор: Zero 14.11.2004, 19:39
Girder, спасибо за SLV, там работает, даже более правильно чем то что я сделал у себя.
Придётся похже опять мне переделать свою прогу... smile

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