Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 13.05.2010
Сообщений: 5
1

Сохранение списка документов в текстовый файл

13.05.2010, 17:12. Показов 3459. Ответов 9
Метки нет (Все метки)

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

Код целиком:

Код
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.
До этих пор все работает, выводит список файлов. К коду прошу не передраться, возможно можно было сделать все проще, но мне нужно делать именно так, по выданному примеру.

Ну а дальше у меня ступор, как собственно все это дело сохранить в текстовый файл... Вот выложу кое-какие попытки это осуществить:
Код
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(Template, 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;
Мне хотя бы все это дело научить сохраняться в простой текстовый файл, ну или может кто выяснит почему несохраняет в вордовский. Надеюсь на вашу помощь...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2010, 17:12
Ответы с готовыми решениями:

УНФ для Украины 1.6. Сохранение\Восстановление настроек отбора списка документов
1С:Підприємство 8.3 (8.3.6.2449) УНФ для Украины, редакция 1.6 (1.6.2.1) Управляемые формы. ...

Сохранение в текстовый файл
Проблема сохранения текста в файл, использую Tkinter Вот так сохраняю: def...

Сохранение в текстовый файл
Хочу написать програму каторая сохраняет например жывотных в текстовый файл(сохраняет информацию о...

Сохранение в текстовый файл
Есть вот такой примерный код проги, которая должна считать значение ф-ции с определённым шагом(не...

9
87 / 66 / 8
Регистрация: 29.09.2009
Сообщений: 425
13.05.2010, 19:55 2
Выложи лучше весь проект а там видно будет
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
13.05.2010, 21:23 3
Насчет
if SaveDialog.Execute then begin
FileListView.Items.SaveToFile(SaveDialog.FileName);
То в FileListView(TListView) SaveToFile такого метода просто нет.
Используй tstringlist
не вникая в код, а так как пример
Delphi
1
2
3
4
5
6
7
8
var
i:integer;
sl:tstringlist;
begin
sl:=tstringlist.Create;
  for I := 0 to ListView1.Items.Count- 1 do
  sl.Add(ListView1.Items[i].Caption);
sl.SaveToFile('pathtofile');
1
0 / 0 / 0
Регистрация: 13.05.2010
Сообщений: 5
13.05.2010, 22:35  [ТС] 4
Цитата Сообщение от turboq Посмотреть сообщение
Насчет
if SaveDialog.Execute then begin
FileListView.Items.SaveToFile(SaveDialog.FileName);
То в FileListView(TListView) SaveToFile такого метода просто нет.
Используй tstringlist
не вникая в код, а так как пример
Delphi
1
2
3
4
5
6
7
8
var
i:integer;
sl:tstringlist;
begin
sl:=tstringlist.Create;
  for I := 0 to ListView1.Items.Count- 1 do
  sl.Add(ListView1.Items[i].Caption);
sl.SaveToFile('pathtofile');
Большое спасибо! Разобрался. Появился еще один вопрос: в этом списке у меня выводит - имя файла, его размер, дату последнего изменения. Но мне еще нужно чтобы выводило "первые N непустых строк документа", т.е первые пару слов текстового документа, типа превью. Как это сделать ума не приложу... Кто что посоветует?
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
14.05.2010, 09:36 5
В листвью выводило пару строк, это будет некрасиво, а пару слов можно.
sl.LoadToFile('pathtofile'); у tstringlist есть сво string{} получишь строки и сво text получишь сразу весь текст, а там выризай скока надо. Но если файл большой тогда открывай его как текстовый файл.
Добавить вроде можно так
Delphi
1
2
3
4
5
6
7
8
 
s:='Твой текст'; 
NewItem.SubItems.Add(FloatToStrF(FileSize, ffNumber, 18, 0));
NewItem.SubItems.Add(FileDateTime);
//Вот здесь
NewItem.SubItems.Add(s);
//
Application.ProcessMessages;
Как я понимаю листвью делится на колонки и надо добавить для текста еще одну(как не помню), а может этот кусок специально для него.
Delphi
1
2
3
  begin
    NewItem.SubItems.Add('');
  end;
Я не проверял тк исходника твоего нет
1
0 / 0 / 0
Регистрация: 13.05.2010
Сообщений: 5
15.05.2010, 15:05  [ТС] 6
Цитата Сообщение от turboq Посмотреть сообщение
В листвью выводило пару строк, это будет некрасиво, а пару слов можно.
sl.LoadToFile('pathtofile'); у tstringlist есть сво string{} получишь строки и сво text получишь сразу весь текст, а там выризай скока надо. Но если файл большой тогда открывай его как текстовый файл.
Добавить вроде можно так
Delphi
1
2
3
4
5
6
7
8
 
s:='Твой текст'; 
NewItem.SubItems.Add(FloatToStrF(FileSize, ffNumber, 18, 0));
NewItem.SubItems.Add(FileDateTime);
//Вот здесь
NewItem.SubItems.Add(s);
//
Application.ProcessMessages;
Как я понимаю листвью делится на колонки и надо добавить для текста еще одну(как не помню), а может этот кусок специально для него.
Delphi
1
2
3
  begin
    NewItem.SubItems.Add('');
  end;
Я не проверял тк исходника твоего нет
Блин, что-то так и не сообразил как сделать... Выкладываю проект, попробуй ты, если поможеш буду оч. благодарен.
Вложения
Тип файла: rar ListBuilder.rar (212.5 Кб, 43 просмотров)
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
15.05.2010, 17:06 7
Вроде работает, читай коменты внутри.
На пустоту не проверяет, но первую строку выводит.
тхт и rtf обрабатывает, doc как открыть не знаю.
Если что пиши.
Вложения
Тип файла: rar ListBuilder 15.05.2010.rar (26.0 Кб, 68 просмотров)
1
0 / 0 / 0
Регистрация: 13.05.2010
Сообщений: 5
15.05.2010, 17:26  [ТС] 8
Добавлено через 1 минуту
Цитата Сообщение от turboq Посмотреть сообщение
Вроде работает, читай коменты внутри.
На пустоту не проверяет, но первую строку выводит.
тхт и rtf обрабатывает, doc как открыть не знаю.
Если что пиши.
Большое спасибо! Но есть небольшая проблема, содержание он выводит только для файлов, расположенных в папке с приложением. Если же выбрать другую папку, где его нет, то выскакивает ошибка.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
15.05.2010, 22:19 9
Не дотестировал.
Исправь получение пути в процедуре TListBuilderForm.AddFile
Delphi
1
2
3
4
  
NewItem.SubItems.Add(GetComentFile(GetFullFileName(DirectoryEdit.Text, FileName)));//тут была ошибка
//NewItem.SubItems.Add('');
Application.ProcessMessages;
1
0 / 0 / 0
Регистрация: 13.05.2010
Сообщений: 5
16.05.2010, 22:37  [ТС] 10
Спасибо за помощь! Завтра буду защищать эту курсовую
0
16.05.2010, 22:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2010, 22:37
Помогаю со студенческими работами здесь

сохранение в текстовый файл
Здравствуйте, сделал программу, нужно сделать сохранение в текстовый файл. Не знаю как сделать...

Сохранение в текстовый файл
Доброй вечер всем. Начал осваивать Visual Studio 2010 да и c++ буквально на днях и возник вопрос:...

Сохранение в текстовый файл
Добрый вечер! Мне надо введенные данные сохранить в текстовый файл - этот способ сохраняет данные...

Сохранение информации в текстовый файл
Прошу помочь с решением задачи: написать программу, в которой описывается массив записей,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru