Перечисление файлов в каталоге на TListView - PullRequest
3 голосов
/ 07 января 2010

Я строю программу, которая должна быть на Form_Create, заполняю TListView с именем FileList, каталог, который я хочу заполнить, это где скомпилированная программа + \Files, так как я никогда не использовал TListView Я хочу знать, как это сделать?

Ответы [ 3 ]

15 голосов
/ 07 января 2010

Ваш вопрос состоит из нескольких частей. Я предоставлю обзор здесь. Если вам нужна помощь по какому-либо конкретному этапу, пожалуйста, оставьте более конкретный дополнительный вопрос.

  1. Определите, к чему относится «где находится скомпилированная программа».

    Чтобы получить полный путь к файлу EXE, вызовите ParamStr(0). Чтобы удалить имя файла EXE из этой строки, чтобы у вас была только часть каталога, вызовите ExtractFilePath. Убедитесь, что он заканчивается обратной косой чертой (IncludeTrailingPathDelimiter), а затем добавьте каталог «Файлы».

  2. Получить список файлов.

    Используйте FindFirst и FindNext, чтобы создать цикл, который просматривает все файлы. Имена будут включать "." и ".." относительные имена каталогов, так что вы можете исключить их. Помните, что файлы не перечислены в каком-либо определенном порядке. Например, если вам нужно отсортировать их по алфавиту, вам придется сделать это самостоятельно. (Они могут казаться в алфавитном порядке в ваших тестах, но это не всегда так.)

    var
      Rec: TSearchRec;
    begin
      if FindFirst(path + '\*', faAnyFile, Rec) = 0 then try
        repeat
          if (Rec.Name = '.') or (Rec.Name = '..') then
            continue;
          if (Rec.Attr and faVolumeID) = faVolumeID then
            continue; // nothing useful to do with volume IDs
          if (Rec.Attr and faHidden) = faHidden then
            continue; // honor the OS "hidden" setting
          if (Rec.Attr and faDirectory) = faDirectory then
            ; // This is a directory. Might want to do something special.
          DoSomethingWithFile(Rec.Name);
        until FindNext(Rec) <> 0;
      finally
        SysUtils.FindClose(Rec);
      end;
    end;
    
  3. Добавить узлы в элемент управления для представления файлов.

    Возможно, вы захотите сделать это в гипотетической функции DoSomethingWithFile, о которой я упоминал выше. Используйте свойство Items представления списка для работы с элементами, например, для добавления новых.

    var
      Item: TListItem;
    begin
      Item := ListView.Items.Add;
      Item.Caption := FileName;
    end;
    

    TListItem имеет дополнительные свойства; проверьте документацию для деталей. Свойство SubItems полезно, если вы отображаете представление списка в режиме «отчет», где для одного узла может быть несколько столбцов.

  4. Свяжите изображения с элементами.

    Изображения узлов в виде списка поступают из связанных списков изображений, LargeImages и SmallImages. Они относятся к одному или нескольким TImageList компонентам в вашей форме. Поместите туда свои изображения значков, а затем присвойте элементам свойства ImageIndex соответствующим номерам.

В зависимости от того, насколько сложной вы хотите, чтобы ваша программа была, вы можете использовать TShellListView элемент управления Delphi вместо выполнения всей вышеперечисленной работы самостоятельно.

2 голосов
/ 07 января 2010

Если вы уроните TImagelist в форму с двумя изображениями (один для файлов вперед и для каталогов), а затем назначите TImagelist свойству LargeImages TListviews, вы можете использовать приведенный ниже код.

procedure TForm2.Button1Click(Sender: TObject);
    var li:TListItem;
    SR: TSearchRec;
begin
    FileList.Items.BeginUpdate;
    try
        FileList.Items.Clear;

        FindFirst(ExtractFilePath(Application.ExeName) +'*.*', faAnyFile, SR);
        try
            repeat
                li :=  FileList.Items.Add;
                li.Caption := SR.Name;

                if ((SR.Attr and faDirectory) <> 0)  then li.ImageIndex := 1
                else li.ImageIndex := 0;

            until (FindNext(SR) <> 0);
        finally
            FindClose(SR);
        end;
    finally
        FileList.Items.EndUpdate;
    end;
end;

Затем вы можете построить это, добавив разные изображения в TImageList для разных типов файлов и используя ExtractFileExt (SR.Name), чтобы получить расширение файла

if ((SR.Attr and faDirectory) <> 0)  then li.ImageIndex := 1
else if lowercase(ExtractFileExt(SR.Name)) = '.png' then li.ImageIndex := 2
else if lowercase(ExtractFileExt(SR.Name)) = '.pdf' then li.ImageIndex := 3
else li.ImageIndex := 0;
1 голос
/ 07 января 2010

Вам нужно будет показывать изображения при рисовании строк.

Это должно дать вам представление: http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp.htm

Разница лишь в том, что вы нарисуете значок / изображение. Здесь вы узнаете, как это сделать в сетке: http://delphi.about.com/library/weekly/aa032205a.htm Так что из обоих вы можете получить идею.

...