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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2010, 16:37   #1
twist
 
Регистрация: 13.05.2010
Сообщений: 3
Вопрос Сохранение списка документов в текстовый файл

Привет! Пишу программку вывода списка документов в выбранной папке. Список в самой программке выводит, но еще нужно сделать чтобы она этот список сохраняла в текстовый файл. Как это сделать толком незнаю, т.к в дельфи новичек, надеюсь на вашу помощь.

Код целиком:

Код:
unit ListBuilderUnit;

//Построитель списка документов
//Главная форма

interface

uses
  FileCtrl, ShellAPI,
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtDlgs, StdCtrls, ComCtrls, ImgList, ExtCtrls, OleServer;

type
  TListBuilderForm = class(TForm)
    DirectorySelectButton: TButton;
    DirectoryEdit: TEdit;
    FileListView: TListView;
    IconImageList: TImageList;
    SaveDialog: TSaveDialog;
    Button1: TButton;
    procedure DirectorySelectButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AddFiles(Extension: string);
    procedure AddFile(FileName: string; FileSize: integer;
                      FileDateTime, Extension: string);
  public
    { Public declarations }
  end;

var
  ListBuilderForm: TListBuilderForm;

implementation

{$R *.DFM}

//Получить полное имя файла из пути к каталогу Dir и имени Name
function GetFullFileName(Dir, Name: string): string;
begin
  Result := ExcludeTrailingBackslash(Dir) + '\' + Name;
end;

//Добавить в список файл с
//именем FileName, размером FileSize, временем изменения FileDateTime,
//расширением Extension
procedure TListBuilderForm.AddFile(FileName: string; FileSize: integer;
  FileDateTime, Extension: string);
var
  NewItem: TListItem;
  FileInfo: TSHFileInfo;
begin
  Newitem := FileListView.Items.Add;
  NewItem.Caption := FileName;
  if SHGetFileInfo(PChar(GetFullFileName(DirectoryEdit.Text, FileName)), 0,
      FileInfo, sizeof(TSHFileInfo),
      SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then begin
    NewItem.ImageIndex := FileInfo.IIcon
  end else
    NewItem.ImageIndex := 0;
  NewItem.SubItems.Add(FloatToStrF(FileSize, ffNumber, 18, 0));
  NewItem.SubItems.Add(FileDateTime);
  begin
    NewItem.SubItems.Add('');
  end;
  Application.ProcessMessages;
end;

//Найти все файлы с расширением Extension и добавить их в список
procedure TListBuilderForm.AddFiles(Extension: string);
var
  SearchRec: TSearchRec;
begin
  if FindFirst(GetFullFileName(DirectoryEdit.Text, '*.' + Extension),
               faAnyFile - faDirectory, SearchRec) = 0 then begin
    AddFile(SearchRec.Name, SearchRec.Size,
            FormatDateTime('dd.mm.yy hh:nn:ss',
                           FileDateToDateTime(SearchRec.Time)), Extension);
    while FindNext(SearchRec) = 0 do begin
      AddFile(SearchRec.Name, SearchRec.Size,
              FormatDateTime('dd.mm.yy hh:nn:ss',
                             FileDateToDateTime(SearchRec.Time)), Extension);
    end;
  end;
  FindClose(SearchRec);
end;

//По созданию формы заменить обработчик ощибок
//и найти список системных иконок
procedure TListBuilderForm.FormCreate(Sender: TObject);
var
  FileInfo: TSHFileInfo;
begin
  IconImageList.Handle := SHGetFileInfo(PChar(''), 0,
    FileInfo, SizeOf(TSHFileInfo), SHGFI_SMALLICON or SHGFI_SYSICONINDEX);
end;

//По нажатию кнопки DirectorySelectButton выбрать папку
//и построить список ее файлов
procedure TListBuilderForm.DirectorySelectButtonClick(Sender: TObject);
var
  Dir: string;
begin
  if SelectDirectory('Выберите папку с документами',
                     '', Dir) then begin
    DirectoryEdit.Text := Dir;
    FileListView.Items.Clear;
    AddFiles('txt');
    AddFiles('rtf');
    AddFiles('doc');
  end;
end;

end.
До этих пор все работает, выводит список файлов. К коду прошу не передраться, возможно можно было сделать все проще, но мне нужно делать именно так, по выданному примеру.

Последний раз редактировалось twist; 13.05.2010 в 17:15.
twist вне форума Ответить с цитированием
Старый 13.05.2010, 16:38   #2
twist
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию

Ну а дальше у меня ступор, как собственно все это дело сохранить в текстовый файл... Вот выложу кое-какие попытки это осуществить:
Код:
procedure TListBuilderForm.SaveDialog(Sender: TObject);
begin

if DirectoryEdit.Text <> '' then begin  //Диалог задания имени документа
    SaveDialog.InitialDir := DirectoryEdit.Text
  end else begin
    SaveDialog.InitialDir := '.';
  end;
  SaveDialog.DefaultExt := 'txt';
  SaveDialog.Filter := '*.txt|*.txt';
  SaveDialog.FileName := 'Unknown.txt';

  if SaveDialog.Execute then begin
        FileListView.Items.SaveToFile(SaveDialog.FileName);
end;end;

end.
А вот как это было в примере, в нем список сохраняется в вордовский файл, но он почемуто не работает.(Ошибка в: "WordApplication.Documents.Add(Temp late, NewTemplate);" )
Код:
//По нажатию кнопки WordExportButton сохранить список
//в документ DOC Microsoft Word 
procedure TListBuilderForm.WordExportButtonClick(Sender: TObject);
var
  Template, NewTemplate, ItemIndex,
  WordFileName, AlignTab, TabLeader: OleVariant;
  k: Integer;
  WordString: string;
begin
  if DirectoryEdit.Text <> '' then begin  //Диалог задания имени документа
    SaveDialog.InitialDir := DirectoryEdit.Text
  end else begin
    SaveDialog.InitialDir := '.';
  end;
  SaveDialog.DefaultExt := 'doc';
  SaveDialog.Filter := '*.doc|*.doc';
  SaveDialog.FileName := 'Unknown.doc';
  if SaveDialog.Execute then begin
    if SaveDialog.FileName <> '' then begin
      try
        WordApplication.Connect;     //Запустить Word
        Template := 'EmptyParam';
        NewTemplate := false;
        WordApplication.Documents.Add(Template, NewTemplate);
        ItemIndex := 1;
        WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));
                          //Абзац без отступа с одинарным интервалом строк
        WordApplication.Selection.ParagraphFormat.LineSpacingRule :=
          wdLineSpaceSingle;
        WordApplication.Selection.ParagraphFormat.FirstLineIndent := 0;
                                     //Табуляции и размер шрифта
        TabLeader := wdTabLeaderSpaces;
        AlignTab := wdAlignTabRight;
        WordApplication.Selection.ParagraphFormat.TabStops.Add(
          WordApplication.CentimetersToPoints(10) ,AlignTab ,TabLeader);
        AlignTab := wdAlignTabLeft;
        WordApplication.Selection.ParagraphFormat.TabStops.Add(
          WordApplication.CentimetersToPoints(10.3) ,AlignTab ,TabLeader);
        AlignTab := wdAlignTabRight;
        WordApplication.Selection.ParagraphFormat.TabStops.Add(
          WordApplication.CentimetersToPoints(17.7) ,AlignTab ,TabLeader);
        WordApplication.Selection.Font.Size := 8;
                                     //Путь к папке
        WordString := SaveDialog.InitialDir;
        WordApplication.Selection.TypeText(WordString);
        WordApplication.Selection.TypeParagraph;
        WordApplication.Selection.TypeParagraph;
        if FileListView.Items.Count > 0 then begin
                                     //Заголовок списка
          WordString := 'Имя' + Chr(9) + 'Размер, байт' + Chr(9) +
                        'Изменен' + Chr(9) + 'Параметры';
          WordApplication.Selection.TypeText(WordString);
          WordApplication.Selection.TypeParagraph;
          WordString := '---------------------------------------------------------------------------------------------------------';
          WordApplication.Selection.TypeText(WordString);
          WordApplication.Selection.TypeParagraph;
                                     //Текст списка
          for k := 0 to FileListView.Items.Count - 1 do begin
            WordString := FileListView.Items.Item[k].Caption + Chr(9) +
                          FileListView.Items.Item[k].SubItems[0] + Chr(9) +
                          FileListView.Items.Item[k].SubItems[1] + Chr(9) +
                          FileListView.Items.Item[k].SubItems[2];
            WordApplication.Selection.TypeText(WordString);
            WordApplication.Selection.TypeParagraph;
          end;
        end;
                                     //Сохранить документ и закрыть Word
        WordFileName := SaveDialog.FileName;
        WordDocument.SaveAs(WordFileName);
        WordApplication.Quit;
        WordApplication.Disconnect;
      except
        MessageDlg('Ошибка. Возможно, Word не установлен.',
                   mtError, [mbOk], 0);
      end;
    end;
  end;
end;
Мне хотя бы все это дело научить сохраняться в простой текстовый файл, ну или может кто выяснит почему несохраняет в вордовский. Надеюсь на вашу помощь...
twist вне форума Ответить с цитированием
Старый 13.05.2010, 22:45   #3
twist
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию

Вобщем с сохранением разобрался, но появился еще один вопрос: в этом списке у меня выводит - имя файла, его размер, дату последнего изменения. Но мне еще нужно чтобы выводило "первые N непустых строк документа", т.е первые пару слов текстового документа, типа превью. Как это сделать ума не приложу... Кто что посоветует?
twist вне форума Ответить с цитированием
Старый 14.05.2010, 00:09   #4
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Для вывода первых нескольких строк из документа нужно файл сначала открыть (причем методы открытия для .doc и .txt документов будут серьезно отличаться).
С txt все просто - создаем поток (TFileStream), затем считываем сколько нужно, игнорируя пустые строки, записываем куда нужно и осбождаем этот поток (метод free).
С doc сложнее. Если в папке будет несколько десятков таких документов, то приложение будет долго создавать/уничтожать серверы автоматизации. Тут, как мне кажется, желательно использовать стороние библиотеки по работе с doc форматом, которые гораздо быстрее выполняют считывание инфы из doc файла и не требуют того, чтобы у юзера был инсталлирован Ворд.
Но я с такими не работал поэтому конкретнее сказать не могу.

А насчет TFileStream и его методов - поисчите в поисковике.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение в текстовый файл Lisёноk Помощь студентам 4 01.05.2010 23:16
Сохранение ValueListEditor в файл (текстовый) Vol666 Общие вопросы Delphi 21 12.09.2009 11:50
Сохранение документов Word artemavd Общие вопросы Delphi 0 08.08.2009 10:37
Сохранение в текстовый файл Askat Общие вопросы Delphi 11 26.02.2008 14:47
Консольная программа на Си: ввод, вывод, сортировка, сохранение в текстовый файл. zerg Помощь студентам 8 16.11.2007 12:57