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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2012, 23:42   #1
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
Восклицание Отображение файлов в TreeView или ListView...

1.
а). В папке с программой, находится папка "reports".
б). Содержимое этой папки отображаем в TreeView.
в). Если в папке "reports" пользователь создал ещё одну папку, куда положил свой отчёт (*.fr3), отображаем и их. (сами файлы отображаются без расширения)

Пример (что должно получиться в итоге):


г). Если пользователь создал в папке reports новую папку, создаём ей индекс изображения 0 (из ImageList1).
д). Если пользователь создал отчёт (*.fr3) в какой либо папке, присваиваем ему индекс изображения 1 (из того же ImageList1).

2.
а). Выбираем отчёт из списка и нажимаем "Просмотр" - отчёт открывается на просмотр. (frxReport1.ShowReport; )
б). Выбираем отчёт и нажимаем на "Редактор" - отчёт открывается в редакторе отчётов. (frxReport1.DesignReport; )

Очень надеюсь на Вашу помощь. Спасибо.

P.S.
Используется Delphi XE2 upd3 + FastReport VCL 4 Standard Edition
Для тех - кто выложит полностью готовое решение, просьба написать мне в скайп и сообщить номер счёта "Яндекс.Деньги".

Project1.rar

Последний раз редактировалось tim21701; 17.01.2012 в 21:44. Причина: Добавил файл проекта. (как пример)
tim21701 вне форума Ответить с цитированием
Старый 17.01.2012, 01:29   #2
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

А в чем вопрос?

Добавляйте узел при создании файла, после чего указывайте значение его ImageIndex, как вариант. Если за папкой Reports закреплена конкретная папка на компьютере то сканируйте файлы появляющиеся и исчезающие в ней.

Вторую часть вопроса просто анализируйте значение ImageIndex (как и ровно любое другое значение, которое может отвечать за различие типов узлов):
Код:
case treeview.Selected.ImageIndex of
0: ShowMessage('Some action with folder');
1: ShowMessage('Some action with file');
end;
kettanaito вне форума Ответить с цитированием
Старый 17.01.2012, 02:13   #3
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
По умолчанию

kettanaito Это немного не то, но спасибо.
Кстати, "report" расположена в папке с программой, и прописать к ней путь не получится, так как не известно - где вообще пользователь будет хранить папку с программой. Может в Program Files, а может и в C:\MyProgram.

Господа форумчане, помогите создать/написать такую программу!
В долгу не останусь...
tim21701 вне форума Ответить с цитированием
Старый 17.01.2012, 07:24   #4
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
Восклицание

Провозился столько времени, так и не нИАсилил... В итоге, решил сделать немного "попроще"...
Отказался от использования TreeView. Перешел на более простой ListView.

Вот что получилось:



Код:
unit Unit9;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, ShellApi, Vcl.ImgList,
  Vcl.Menus, frxClass;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure LV_InsertFiles(strPath: string; ListView: TListView; ImageList: TImageList);
 var
   i: Integer;
   Icon: TIcon;
   SearchRec: TSearchRec;
   ListItem: TListItem;
   FileInfo: SHFILEINFO;
 begin
   // Создаём временную иконку:
  Icon := TIcon.Create;
   ListView.Items.BeginUpdate; // Можно и без этого, но, пусть будет на "всякий"...
   try
     // Поиск файлов (с расширением *.fr3):
    i := FindFirst(strPath + '*.fr3*', faAnyFile, SearchRec);
     while i = 0 do
     begin
       with ListView do
       begin
         // Просматриваем директорию:
        if ((SearchRec.Attr and FaDirectory <> FaDirectory) and
           (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
         begin
           ListItem := ListView.Items.Add;
           //Отображаем имя файла:
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_DISPLAYNAME);
           Listitem.Caption := FileInfo.szDisplayName;
           // Получаме информацию о файлах:
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_TYPENAME);
           ListItem.SubItems.Add(FileInfo.szTypeName);
           //Получаем иконку для файлов в списке:
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
           icon.Handle := FileInfo.hIcon;
           ListItem.ImageIndex := 1; // Указываем какую иконку использовать.
           // Уничтожаем
          DestroyIcon(FileInfo.hIcon);
         end;
       end;
       i := FindNext(SearchRec); 
     end;
   finally

     ListView.Items.EndUpdate; // Пусть будет...
   end;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   // Устанавливаем Imagelist для ListView:
  ListView1.SmallImages := ImageList1;
   // Устанавливаем свойство ViewStyle в "vsReport":
  ListView1.ViewStyle := vsReport;
  LV_InsertFiles('.\reports\', ListView1, ImageList1); //Наша папка с отчётами.
 end;

end.
Остались вопросы и прибавились новые:

1). Как спрятать расширение файлов?
2). Как во втором столбике вывести дату создания отчёта?
3). Как по дабл-клик открыть отчёт???


Исходники и экзешник внутри: Project9.rar

ПОМОГИТЕ ПОЖАЛУЙСТА!

Последний раз редактировалось tim21701; 17.01.2012 в 21:46. Причина: Добавил архив...
tim21701 вне форума Ответить с цитированием
Старый 17.01.2012, 15:49   #5
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Получить путь программы всегда можно с помощью ExtractFilePath(Application.ExeName ) - на заметку Отсюда получаем и путь к папке Reports. Далее просто следим за директорией отображая ее содержимое в древе (циклом можно загружать найденные файлы).

1. Как спрятать расширение файлов:
Просто скопируй строку без расширения
Код:
Listitem.Caption := Copy(FileInfo.szDisplayName,0,length(FileInfo.szDisplayName)-4);
Тем более если оно у тебя одно для всех существующих в программе файлов. Далее при открытии ты просто будешь добавлять расширение к строке и запускать файл как нужно.

2. Сортировка.
В свойствах компонента есть пункт Sort.

4. Опиши событие onDblClick у компонента TreeView.

Последний раз редактировалось kettanaito; 17.01.2012 в 15:58.
kettanaito вне форума Ответить с цитированием
Старый 17.01.2012, 21:41   #6
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
По умолчанию

kettanaito Спасибо за ответ...

Цитата:
ExtractFilePath(Application.ExeName )
ясно, возьму на заметку Вот только я до конца не понимаю, зачем её использовать, если можно прописать "относительный" путь? В моём случае, это '.\reports\'.

Цитата:
Listitem.Caption := Copy(FileInfo.szDisplayName,0,lengt h(FileInfo.szDisplayName)-4);
Про это я знаю. Пробовал так сделать ещё в самом начале, но это почему то не работает... Поэтом, вместо неё, использую Listitem.Caption := FileInfo.szDisplayName;. Я поэтому и спросил КАК, может кто знает ещё вариант. Возьмите мой исходник - попробуйте сами, нонсонс...

Цитата:
Опиши событие onDblClick у компонента TreeView
frxReport1.ShowReport;
tim21701 вне форума Ответить с цитированием
Старый 18.01.2012, 11:08   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure LV_InsertFiles(strPath: string; ListView: TListView; ImageList: TImageList);
 var
   i, f: Integer;
   Icon: TIcon;
   SR: TSearchRec;
   ListItem: TListItem;
   FileInfo: SHFILEINFO;
   D : TDateTime;
 begin
   // Создаём временную иконку:
  Icon := TIcon.Create;
  ListView.Items.BeginUpdate; // Можно и без этого, но, пусть будет на "всякий"...
  try
     // Поиск файлов (с расширением *.fr3):
    i := FindFirst(strPath + '*.fr3*', faAnyFile, SR);
    while i = 0 do begin
      with ListView do begin
           // Просматриваем директорию:
        if ((SR.Attr and FaDirectory <> FaDirectory) and
             (SR.Attr and FaVolumeId <> FaVolumeID)) then
        begin
          ListItem := ListView.Items.Add;
             //Отображаем имя файла...
          Listitem.Caption := SR.Name;
          F := Pos('.', SR.Name);
          if F > 0 then
            Listitem.Caption := Copy(SR.Name, 1, F-1);

          ListItem.SubItems.Add(DateToStr(FileDateToDateTime(SR.Time)));

           //Получаем иконку для файлов в списке:
          SHGetFileInfo(PChar(strPath + SR.Name), 0, FileInfo,
                     SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
          icon.Handle := FileInfo.hIcon;
          ListItem.ImageIndex := 1; // Указываем какую иконку использовать.
             // Уничтожаем:
          DestroyIcon(FileInfo.hIcon);
        end;
      end;
      i := FindNext(SR);
    end;
  finally
    ListView.Items.EndUpdate; // Пусть будет...
  end;
end;
Изображения
Тип файла: gif 001.gif (11.1 Кб, 204 просмотров)
Прик вне форума Ответить с цитированием
Старый 18.01.2012, 14:52   #8
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

К предыдущему коду могу посоветовать все же
Код:
Listitem.Caption := Copy(SR.Name, 0, length(SR.Name)-4);
Вместо:
Код:
Listitem.Caption := Copy(SR.Name, 1, F-1);
Потому как точки в именах файлов использовать можно и в случае их наличия более чем одной код выдаст не совсем желаемый результат Или флипнуть строку (ReverseString) и сделать Ваш код, несомненно.
kettanaito вне форума Ответить с цитированием
Старый 18.01.2012, 15:30   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

kettanaito, пожалуйста, не путайте людей.
Ваш совет
Код:
Listitem.Caption := Copy(SR.Name, 0, length(SR.Name)-4)
не выдерживает никакой критики. Попробуйте предложенное реализовать в коде.
И не забывайте две вещи: значение переменной F где-то присваивается и индексация символов в строке начинается с 1, не с 0.
Прик вне форума Ответить с цитированием
Старый 19.01.2012, 01:29   #10
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
По умолчанию

Прик Спасибо Вам огромное!
Вот бы ещё кто помог последние два вопроса решить... Сортировка по щелчку заголовка и открытие по дабл-клик
tim21701 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование файлов и TreeView apromix Общие вопросы Delphi 0 27.05.2011 11:55
отображение файлов mojohead Помощь студентам 2 02.05.2011 13:25
Как в TreeView сделать отображение только определённого формата Waqq Компоненты Delphi 0 02.12.2010 11:22
Отображение скрытых файлов и папок и отображение розширения всех файлов beegl Общие вопросы Delphi 10 14.12.2008 22:02
Открытие файлов через TreeView Xardas Общие вопросы Delphi 12 29.03.2008 11:30