Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 06:59   #1
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию форимрование списка ссылок

Delphi 7

в папке D:\LNK\ лежат ярлыки exe программ (name.lnk, name1.lnk, name-n...-.lnk,)
они могут туда добавляться и удаляться оттуда (пользователем)

при запуске разрабатываемой программы должен формироваться и выдаваться на экран список из названий этих ярлыков, сортироваться по алфавиту, при клике по одному из элементов этого списка - должен запускаться соответствующий ему ярлык.
GROMOZEKA82 вне форума Ответить с цитированием
Старый 14.08.2013, 07:53   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

задача делится на
1. Сканирование папки D:\LNK\*.lnk
2. Для каждого найденного файла вытаскиваем имя и путь до целевого файла.

второй пункт или чтение пути из ярлыка
Код:
uses comObj, activeX,shlObj;
...var
  Link: IUnknown;
  ShellLink: IShellLink;
  pfd: TWin32FindData;
  fFlags: DWORD;
  s:string;
begin
  Link := CreateComObject(CLSID_SHELLLINK);
  OleCheck(IPersistFile(Link as IPersistFile).Load(PWChar(WideString('d:\Heart3.exe.lnk')),0));

  ShellLink := Link as IShellLink;
  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetPath(PChar(s),length(s),pfd,fFlags));
  s:=StrPas(PChar(s));
  Memo1.Lines.Add(s);

  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetDescription(PChar(s),length(s)));
  s:=StrPas(PChar(s));
  Memo1.Lines.Add(s);
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2013 в 07:56.
Slym вне форума Ответить с цитированием
Старый 14.08.2013, 08:02   #3
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию

Код:
отказывается запускаться, форма пустая, без кнопок
п.с.
(я новичок, только недавно с паскаля переходить начал, прошу понять и простить за глупые вопросы )

Последний раз редактировалось GROMOZEKA82; 14.08.2013 в 09:38.
GROMOZEKA82 вне форума Ответить с цитированием
Старый 14.08.2013, 08:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

uses comObj, activeX,shlObj; разве в паскале пишется внутри кода?
Цитата:
отказывается запускаться
Какой тип проекта ты выбрал?
Цитата:
форма пустая, без кнопок
procedure TForm1.FormCreate(Sender: TObject); говорит о том что код будет запускаться при создании формы. Кинь на нее ListBox и замени указанное в коде Memo1 на него.
И не забудь указать эту процедуру в списке событий формы для OnCreate.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2013, 08:42   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

1. у тебя есть такой файл? d:\Heart3.exe.lnk
2. на форме должен быть мемо чтоб сработал Memo1.Lines.Add(s);
3. с такими знаниями во фриланс...
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2013 в 08:46.
Slym вне форума Ответить с цитированием
Старый 14.08.2013, 08:43   #6
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure Memo1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses comObj, activeX,shlObj;
procedure TForm1.Memo1Change(Sender: TObject);

var
  Link: IUnknown;
  ShellLink: IShellLink;
  pfd: TWin32FindData;
  fFlags: DWORD;
  s:string;
begin
  Link := CreateComObject(CLSID_SHELLLINK);
  OleCheck(IPersistFile(Link as IPersistFile).Load(PWChar(WideString('D:\LNK\*.lnk')),0));

  ShellLink := Link as IShellLink;
  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetPath(PChar(s),length(s),pfd,fFlags));
  s:=StrPas(PChar(s));
  Memo1.Lines.Add(s);

  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetDescription(PChar(s),length(s)));
  s:=StrPas(PChar(s));
  Memo1.Lines.Add(s);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Perform(LB_SETHORIZONTALEXTENT, 1000, Longint(0));
end;

end.

Последний раз редактировалось GROMOZEKA82; 14.08.2013 в 09:38.
GROMOZEKA82 вне форума Ответить с цитированием
Старый 14.08.2013, 09:42   #7
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию

вот так заработало без ошибок
но при запуске появляется окно Form1с белым полем, на котором надпись Memo1
и мигающим курсором
при нажатии ентер - курсор переходит стролчкой ниже, и программа завершается с ошибкой
GROMOZEKA82 вне форума Ответить с цитированием
Старый 14.08.2013, 09:56   #8
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TMemo;
    procedure ListBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses comObj, activeX,shlObj;
procedure TForm1.ListBox1Change(Sender: TObject);

var
  Link: IUnknown;
  ShellLink: IShellLink;
  pfd: TWin32FindData;
  fFlags: DWORD;
  s:string;
begin
  Link := CreateComObject(CLSID_SHELLLINK);
  OleCheck(IPersistFile(Link as IPersistFile).Load(PWChar(WideString('D:\LNK\*.lnk')),0));

  ShellLink := Link as IShellLink;
  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetPath(PChar(s),length(s),pfd,fFlags));
  s:=StrPas(PChar(s));
  ListBox1.Lines.Add(s);

  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetDescription(PChar(s),length(s)));
  s:=StrPas(PChar(s));
  ListBox1.Lines.Add(s);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Perform(LB_SETHORIZONTALEXTENT, 1000, Longint(0));
end;

end.
Form1 и ListBox, ошибок нет , но и список не выводится
GROMOZEKA82 вне форума Ответить с цитированием
Старый 14.08.2013, 13:59   #9
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

так не канает!
нужно ручками искать а не D:\LNK\*.lnk
поиск файлов FindFirstFile+FindNextFile

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormShow(Sender: TObject);
  private
    procedure ProcessFile(const FileName:WideString);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses comObj, activeX,shlObj;
procedure TForm1.ProcessFile(const FileName:WideString);
var
  Link: IUnknown;
  ShellLink: IShellLink;
  pfd: TWin32FindData;
  fFlags: DWORD;
  s:string;
begin
  Link := CreateComObject(CLSID_SHELLLINK);
  OleCheck(IPersistFile(Link as IPersistFile).Load(PWChar(FileName),0));
  ShellLink := Link as IShellLink;
  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetPath(PChar(s),length(s),pfd,fFlags));
  s:=StrPas(PChar(s));
  ListBox1.Items.Add(s);

  SetLength(s,MAX_PATH);
  OleCheck(ShellLink.GetDescription(PChar(s),length(s)));
  s:=StrPas(PChar(s));
  ListBox1.Items.Add(s);
end;

procedure TForm1.FormShow(Sender: TObject);
var
  FD:TWin32FindData;
  hSearch:DWORD;
begin
  hSearch:=FindFirstFile(PChar('D:\LNK\*.lnk'),FD);
  if hSearch<>INVALID_HANDLE_VALUE then
  try
    repeat
      if (FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=0 then
        ProcessFile('D:\LNK\'+FD.cFileName);
    until not FindNextFile(hSearch,FD);
  finally
    Windows.FindClose(hSearch);
  end;
end;

end.
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2013 в 14:08.
Slym вне форума Ответить с цитированием
Старый 14.08.2013, 14:19   #10
GROMOZEKA82
Новичок
Джуниор
 
Регистрация: 14.08.2013
Сообщений: 12
По умолчанию

поиск я сделал проще

Код:
TForm1.FormCreate(Sender: TObject); 
var
tsr : tsearchrec;
begin
if FindFirst('D:\LNK\*.lnk', faAnyFile,tsr) = 0 then
repeat
ListBox1.Items.Add(tsr.name);
until FindNext(tsr) <> 0;
FindClose(tsr);
end;
end.
но есть небольшая проблемка
список выводится так
file1.lnk
file2.lnk
file3.lnk
file4.lnk
file5.lnk

а хотелось бы
file1
file2
file3
file4
file5
т.е. без отображения расширения
GROMOZEKA82 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки + составление списка ссылок Lardes Общие вопросы Delphi 2 24.11.2012 14:26
как по вводу первых букв слова из списка подхватывать возможные вариации из списка 7EBEP Microsoft Office Excel 2 05.03.2012 11:11
preg_match? парсинг и вывод списка ссылок? taurii PHP 1 07.02.2012 16:16
Использование вэб-запроса для списка ссылок Anna1 Microsoft Office Excel 10 30.11.2010 14:00
получение списка ссылок на подпапки файлы однойпапки i777 Microsoft Office Excel 3 06.10.2010 23:30