Урок Delphi 7
Работа с файлами в Delphi

Классическая работа с файлами в Delphi


Компоненты работающие с файлами
Классическая работа с файлами
Диалоги выбора файлов
Определение размера файла
Поиск файлов
Таблица функций






Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Технология работы с файлами в системе Delphi требует определённого порядка действий:

  1. Прежде всего файл должен быть открыт. Система следит, чтобы другие приложения не мешали работе с файлом. При этом определяется, в каком режиме открывается файл - для изменения или только считывания информации. После открытия файла в программу возвращается его идентификатор, который будет использоваться для указания на этот файл во всех процедурах обработки.
  2. Начинается работа с файлом. Это могут быть запись, считывание, поиск и другие операции.
  3. Файл закрывается. Теперь он опять доступен другим приложениям без ограничений. Закрытие файла гарантирует, что все внесённые изменения будут сохранены, так как для увеличения скорости работы изменения предварительно сохраняются в специальных буферах операционной системы.
В Delphi реализовано несколько способов работы с файлами. Познакомимся со классическим способом, связанным с использованием файловых переменных. Файловая переменная вводится для указания на файл. Делается это с помощью ключевого слова File :

   var F:  File ;

Описанная таким образом файловая переменная считается нетипизированной, и позволяет работать с файлами с неизвестной структурой. Данные считываются и записываются побайтно блоками, размер которых указывается при открытии файла, вплоть от 1 байт.

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

   var F:  File of тип_записи ;

В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип String в чистом виде применяться не может, а только в виде String[N], как указывалось в уроке Delphi 5.

Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая. Поэтому сначала в программе лично я описываю нужный тип, а затем ввожу две переменные этого типа - файловую и обычную:

Описание файловой переменной

   Для текстовых файлов отдельно укажу, что тип файловой переменной в этом случае TextFile, а тип обычной - String.

   Для открытия файла нужно указать, где он расположен. Для этого файловая переменная должна быть ассоциирована с нужным файлом, который определяется его адресом. Адрес файла может быть абсолютным, с указанием диска и каталогов ('C:\Мои документы\Мои рисунки\FileName.ini'), или относительным, тогда он создаётся в папке с .exe файлом программы. Для задания относительного адреса достаточно указать имя файла с нужным расширением. Делается это оператором AssignFile :

   AssignFile(SaveF, 'C:\Мои документы\Мои рисунки\FileName.ini');
   AssignFile(SaveF, 'FileName.ini');

Теперь файл должен быть открыт.
   Открытие файла оператором Rewrite приведёт воссозданию файла заново, т.е. существующий файл будет без предупреждения уничтожен, и на его месте будет создан новый пустой файл заданного типа, готовый к записи данных. Если же файла не было, то он будет создан.
   Открытие файла оператором Reset откроет существующий файл к считыванию или записи данных, и его указатель будет установлен на начало файла :

   Rewrite(SaveF);
   Reset(SaveF);

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

   Rewrite(SaveF, 1);
   Reset(SaveF, 1);

Чтение файла производится оператором Read :

   Read(SaveF, SaveV);

Запись в файл производится оператором Write :

   Write(SaveF, SaveV);

При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором FileExists :

   if FileExists('FileName.ini')
      then Read(SaveF, SaveV);

Принудительно установить указатель на нужную запись можно оператором Seek(SaveF, N), где N - номер нужной записи, который, как и почти всё в программировании, отсчитывается от нуля:

   Seek(SaveF, 49); - установка указателя на 50-ю запись.

При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура End Of File), который равен true, если прочитана последняя запись и указатель находится в конце файла:

   while (not EOF(SaveF)) do
      Read(SaveF, SaveV);

   Для текстовых файлов вместо Read и Write используются операторы Readln и Writeln, умеющие определять конец строки. В коментариях приведена процедура чтения текстового файла.

Оператор Truncate(SaveF) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла.

В конце работы с файлом его необходимо закрыть. Это делается оператором CloseFile(SaveF) ;

   Теперь можно изменить программу из первой части урока, запоминающую своё положение на экране. Описание переменных опускаю, оно приведено на рисунке выше.

  Создаём обработчик события Формы OnCreate со следующим содержимым:

procedure TForm1.FormCreate(Sender: TObject) ;
begin
   AssignFile(SaveF, 'Init.ini') ;
   if FileExists('Init.ini') then
      begin
         Reset(SaveF) ;
         Read(SaveF, SaveV) ;
         Form1.Left := SaveV.X ;
         Form1.Top := SaveV.Y ;
         Form1.Caption:=SaveV.Caption ;      //Наши переменные дополнительно сохраняют заголовок Формы!
      end ;
end ;

Теперь необходимо создать обработчик события OnClose :

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction) ;
begin
   Rewrite(SaveF) ;      //Нет необходимости проверять наличие файла, создадим его заново!
   SaveV.X := Form1.Left ;
   SaveV.Y := Form1.Top ;
   SaveV.Caption := Form1.Caption ;
   Write(SaveF, SaveV) ;
   CloseFile(SaveF) ;
end ;

В данном случае файл считывается и записывается туда, куда мы ему указали. Но необходимо также уметь выбрать нужный файл в работающей программе. Описание этого - в заключительной части урока.


Вверх

Предыдущий урок           В начало урока 7          Следующий урок  

Уроки Delphi начинающим



Вопросы и комментарии (53)      Решение задач в Delphi

Newsman, добавлено 8.05.10, 07:37:33 
А как работать с текстовыми файлами?
Автор, добавлено 8.05.10, 07:43:24 
Я предпочитаю работать с текстовыми файлами с помощью компонентов, имеющих встроенные функции по чтению и записи текстовых файлов, например, TMemo, TListBox, TComboBox. Но, конечно, существование файла нужно, как и всегда, проверять функцией FileExists.
Михаил , добавлено 22.05.10, 13:19:20 
Народ , написалконсольную прогу по записям , но
чтото не пашит.
type
mytype = record
name:string[20];
password:string[20];
end;
var f:file of mytype;
a:mytype;
begin

Assign(f,\'file1.txt\');
reset(f);
Read(f,a);
WriteLn(a.name);
Rewrite(f);
read(a.name);
read(a.password);
Write(f,a);
CloseFile(f);
end.
выдаёт ошибку EInOutError . Чё делать?
Михаил, добавлено 22.05.10, 16:32:31 
Всё помощь отменяется...разобрался.../
registr = record
name,password:string[20];
end;
var
fil:file of registr;
fils: registr;
b,c:string;
begin assignfile(fil,\'file1.txt\');
Reset(fil);
Read(fil,fils);
writeLn(fils.name);
writeLn(fils.password);
AssignFile(fil,\'file1.txt\');
Rewrite(fil);
readLn(b);
readLn(c);
fils.name:=b;
fils.password:=c;
Write(fil,fils);
CloseFile(fil);
WriteLn(fils.name);
WriteLn(fils.password);
end.
Александр, добавлено 8.06.10, 16:41:24 
А как открыть файл с расширением .html в обычном режиме?
Автор, добавлено 8.06.10, 18:28:16 
HTML-файл по своей это сути обычный текстовый файл. Для текстовых файлов вместо Read, Write применяются операторы Readln, Writeln. А так всё то же самое. Файловая переменная создаётся типа TextFile, обычная - типа String. Вот например процедура открытия текстового файла:

procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
    V: String;
begin
with OpenDialog1 do
  if Execute then
    begin
      AssignFile(F, FileName);
      Reset(F);
      while (not EOF(F)) do
        begin
          Readln(F, V);
          Memo1.Lines.Add(V);
        end;
    end;
end;

Текст помещён в Memo для наглядности.
Андрей, добавлено 21.07.10, 10:33:29 
Есть несколько текстовах файлов. Например:

Тип компьютера Многопроцессорный компьютер с ACPI
Операционная система Microsoft Windows XP Professional
Пакет обновления Service Pack 3.
Необходимо чтобы осуществлялся поиск по строкам (пакет обновления,Операционная система... )и в другую форму происходила запись строк:Service Pack 3,Microsoft Windows XP Professional.
Как это реализовать?
Заранее Спасибо!
Автор, добавлено 21.07.10, 13:36:17 
Извини, Андрей, за задержку - работа.
Этот вопрос больше относится к теме работа со строками. Есть функция поиска pos(Substr, Str) - возвращает позицию подстроки Substr в строке Str. Если подстрока не найдена, возвращается 0. Поэтому загружаем файл в Memo, и ищем построчно

pos('Операционная система', Memo1.Lines[i])
pos('Пакет обновления', Memo1.Lines[i]) и т.д.

Если подстрока найдена, берём её, удаляем первые символы, соответствующие длине подстроки (например, Операционная система - длина 20 символов) оператором copy, и записываем куда надо.
Андрей, добавлено 22.07.10, 10:26:15 
Спасибо!!!
Николай, добавлено 29.07.10, 10:54:48 
with OpenDialog1 do
if Execute then
Memo1.Lines.LoadFromFile(\'ASHARAP.txt\');

end;
А если у меня около 50 файлов(все файлы текстовые), как написать код, чтобы не прописывать само название файла?
Автор, добавлено 29.07.10, 12:00:17 
Если Вы знаете их имена, то составьте массив из названий, и в цикле сохраняйте по номеру индекса массива. Если это папка с файлами, то, к сожалению, пока методы поиска файлов у меня не описаны, но планирую. Тогда этими методами ищутся все файлы, их имена сохраняются в массив - и т. д.
Ольга, добавлено 17.12.10, 09:48:08 
Большое спасибо, я разобралась!)))
Вадим Мошев, добавлено 9.01.11, 16:54:27 
Здравствуйте.

У меня возникла следующая проблема и, следовательно, вопрос по её решению.

У меня есть форма (1), при открытии которой у меня появляется ещё одна (2) модальная. Она нужна мне ТОЛЬКО для того, чтобы получить имя файла (имя файла я получаю при помощи OpenDialog1.FileName – это имя файла я присвоил глобальной переменной модуля 2 PathToFile), который я буду использовать в форме 1, а также для ввода строки, которая будет частью имени сохраняемого файла в форме 1.

После получения имени файла и ввода необходимой строки, , которая будет частью имени сохраняемого файла в форме 1, модальная форма 2 закрывается.

Форма 1 должна сохранять файл с именем, которое формируется в программе. Файл должен сохраняться в папку вместе с EXE файлом (вместе с программой), однако вместо этого файл сохранятся в ту же директорию, откуда был получен файл для работы в форме 1.

Прошу помощи.

Код прилагается.

Модуль «формы 1»:

unit Test;

//.............

Procedure SaveProtocol(Reason: Tstring);
// Сохранить протокол тестирования в файл в директорию с программой
var ProtocolName: string;
  P: TextFile;

  j, c, g, m, h: byte;

  STdate, STtime, TimeForTestString, STm, STh: String[12];
  STStartDate, STfinishdate: string[19]; // дата и время начала и конца тестирования
begin


  ProtocolName:='';

  // Расчтитываем число полученных и верных ответов

  c:=0; g:=0;

  for j:=1 to N do if Question[j].Answered then inc(g);

  for j:=1 to N do if Question[j].Right then inc(c);


  // Получаем дату и время сохранения протокола


  STDate:=DateToStr(NOW);
  STtime:=TimeToStr(NOW);

  // Получаем дату и время начала и окончания тестирвоания
  STStartDate:=DateToStr(StartDate) + ' ' + TimeToStr(StartDate);
  StFinishDate:=DateToStr(FinishDate) + ' ' + TimeToStr(FinishDate);



  STm:=''; STh:='';
  // Выделяем минуты, часы из переменной TimeFortest
 h := TimeForTest DIV 3600;
 m := (TimeForTest - h*3600) DIV 60 ;

  if TimeForTest = 0 then StM:='НЕОГРАНИЧЕНО'; // часы = минуты = 0

  If H > 0 then StH:=IntToStr(H) + ' ч. ';

  If M > 0 then StM:=IntToStr(M) + ' мин.';

  TimeForTestString:=STh + STm;

 

  // Производим замену некоторых символов в строках даты и времени

  StDate[3]:='-';
  StDate[6]:='-';

  STtime[3]:='-';
  STtime[6]:='-';


  // надо составить имя протокола

  ProtocolName:=BeforeTest.UserName + ' - ' + Discipline + ' - ';

// Переменная Username в модуле BeforeTest получается так:
// UserName:=Edit1.Text;
 // UserName:=TrimRight(UserName);
// В edit1 не могут содержаться только одни пробелы

  ProtocolName:=ProtocolName + StDate + ' ' + STtime;


  {Имя протокола имеет вид:
  <Имя пользователя> - <Дисциплина> - <Дата и время сохранения протокола dd-mm-yyyy hh-mm-ss>}

  // Создаём файл, начинаем сохранение
  AssignFile(P, ProtocolName + '.txt');
  ReWrite(P);


____________________________________

Модуль «формы 2» (модальной)

unit BeforeTest;

//...............

procedure TForm5.Button1Click(Sender: TObject);
// Нажата кнопка выбора вопросов
var F: textFile;
  hours, minutes, N: byte;
  Dis: String[60];
  Time: Word;
  StH, StM: String[13];

begin



  if OpenDialog1.Execute then
  begin
  AssignFile(F, OpenDialog1.FileName);
  PathToFile := OpenDialog1.FileName;
  Reset(F);

  ReadLn(f, Dis);
  ReadLn(F, N);
  ReadLn(F, Time);

  CloseFile(F);

  end;

//.....................



Автор, добавлено 9.01.11, 17:40:27 
Вадим, завтра утром приеду, разберусь.
Автор, добавлено 10.01.11, 10:22:00 
Вадим, извашего текста неясно использование переменной PathToFile, вы её только вычисляете, но не используете. Если она используется в адресе сохранения, то сохранение, естественно, будет туда, куда она указывает, а именно как вы и пишете, в папку, откуда получен файл для работы. Ну это просто к слову.

Вот как можно найти папку, где находится EXE-файл программы:

Path:=ExtractFilePath(Application.ExeName);

Далее прибавляйте само имя файла, и сохраняете. Добавлю, что само имя файла (без пути) получается как ExtractFileName(OpenDialog1.FileName)
Вадим Мошев, добавлено 10.01.11, 21:44:10 
Да, спасибо большое, всё работает.
До моего сведения довели, что Диалоги (Save/open dialog и др) изменяют текущий каталог...
Автор, добавлено 11.01.11, 12:08:30 
У меня другое мнение, что диалоги как раз ничего не делают, просто предоставляют пользователю сделать выбор, и всё. И плохо было бы, если бы они своевольничали. А каталог, который откроется, задаётся свойством диалогов InitialDir.
Антон, добавлено 1.02.11, 21:08:20 
Вопрос: оператор Reset (или Rewrite) открывает файл в отдельном окне, или же он открывает его толь для программы и работать с ним может только программма? Если верен последний вариант, тогда ка можно открыть файл в отдельном окне так. что бы пользователь мог так же работать с ним?
Автор, добавлено 1.02.11, 21:36:26 
Антон, я едва понял ваш вопрос!

Не нужно путать! Открыть новое окно в программе и открыть файл операторами reset или rewrite - не одно и то же.
Открыть файл операторами reset или rewrite значит подготовить его для работы с ним, т.е. чтения или записи.

Чтобы пользователь мог работать с файлом, нужно сначала его открыть в программе, считать, поместить содержимое в какой-нибудь компонент, например, в текстовый редактор или таблицу или ещё в какой (ну, смотря какова структура файла), затем только пользователь сможет с ним работать.

Сам компонент можно и в новое окно поместить, чтобы в основной программе не мешался, если вам так хочется.
Аноним, добавлено 2.02.11, 21:08:08 
Нет, я имел ввиду не то.
Могу ли я сделать так, что бы по нажатию на кнопку поя программа запускала файл через ту программу из которой он был создан.
Проще говоря: у меня есть некая книга excel, я запускаю свою программу, делаю в ней, что необходимо, и моя программа запускает excel, а в нем ту самую книгу. Т. е. открытое окно к написанной мной программе уже никакого отношения не имеет. Такое возможно?
Автор, добавлено 3.02.11, 09:24:01 
А, вот вы о чём... Конечно, есть функция, открывающая любые документы ассоциированными с ними приложениями. То есть, чтобы запустить, например, Excel с загруженным в него документом, нужно:

  ShellExecute(Handle, nil, 'адрес_документа.xls', nil, nil, SW_RESTORE);

Для работы этой функции нужно добавить в uses модуль ShellAPI. Вообще говоря, функция возвращает значение дескриптора открытого приложения. И если значение меньше или равно 32, то значит произошла некая ошибка. Но можно её вызывать и непосредственно, как выше.

Естественно, для использования с OpenDialog 'адрес_документа.xls' заменяется на OpenDialog1.FileName.

Первый nil означает операцию, которую нужно проделать с файлом. Например, 'print' распечатает текстовый файл или файл Word. Просто nil эквивалентно 'open', файл просто откроется в своей програме.

Нужно добавить вот что: адрес документа д.б. типа PAnsiChar. И если записать его в переменную adres типа String, то нужно её предварительно преобразовать: PAnsiChar(adres). Это касается и OpenDialog1.FileName.
Аноним, добавлено 3.02.11, 20:33:36 
Ооооооочень помогли, только единственный вопрос куда добавлять адрес документа типа PAnsiChar? Как я понял в параметры функции.
Автор, добавлено 3.02.11, 21:14:21 
Смысл вот в чём: если адрес пишется вручную, то достаточно заключить его в кавычки, правильно? Но тогда его пользователь не сможет изменить. Чтобы его можно было менять, нужно его присвоить переменной. Но у нас переменные, том числе и OpenDialog1.FileName - типа String, а функция работает с параметром типа PChar:

  ShellExecute(Handle, nil, PAnsiChar(OpenDialog1.FileName), nil, nil, SW_RESTORE);
Антон, добавлено 5.02.11, 11:15:37 
Все, сообразил. Премногоблагодарен)))))
Назия, добавлено 22.04.11, 14:14:40 
Здравствуйте! Подскажите,пожалуйста,что я делаю не так?
На форму поместила TSQLConnection. В инспекторе объектов не удается установить значение TRUE на вкладке Database->Connected.
Пишет,что связь установить не возможно,хотя сервер запущен. Пользователя и пароль указываю. Может быть причина в том,что в списке для выбора ConnectionName нет RSQL? Как его туда добавить?


Автор, добавлено 22.04.11, 21:35:45 
Назия, извините, я затрудняюсь ответить на ваш вопрос. Я не имею сейчас задач с серверами баз данных... Так что советую вам обратиться к тем, кто сходу может ответить на ваш специализированный вопрос, я лично сам так делаю: programmersforum.ru. Там есть ветка про базы данных.
Приятный собеседник добавлено 17.06.11, 05:43:36 
не хера не пойму. не пашет.
Автор, добавлено 17.06.11, 05:48:21 
Тисните текст программы, посмотрим что не так
Сергей, добавлено 17.10.11, 13:41:57 
Можно ли сделать так, чтобы программа собирала несколько файлов в один? Всмысле, есть, допустим 3 файла .doc, которые надо записать в один. По порядку.
Автор, добавлено 17.10.11, 15:38:50 
Да, это можно. Но для этого нужно освоить работу с компонентами палитры Servers или с объектами COM. То есть, найдя документ, его нужно загрузить в Word (пусть невидимый), добавить следующий и так далее. А затем сохранить результирующий документ.
Антон, добавлено 18.10.11, 10:13:43 
Такой вопрос : Если я хочу что бы в моей программе были кнопки запускающие другие программы. Возможно ли сделать так что бы другие программы устанавливались вместе с моей программой. Где почитать как это сделать
З.Ы. Прошу по голове не бить... В программировании новичок
Антон, добавлено 18.10.11, 10:18:22 
Другие программы, к примеру AutoCAD, Word, InternetExplorer
Автор, добавлено 18.10.11, 10:21:50 
Встречный вопрос: а как вы собираетесь устанавливать собственную программу? Готовый проект работает без установки. А для собственно установки есть программа, по-моему InstallShild называется, она даже в поставку Delphi входит, возможно не во всякую. Там можно задать что именно будет устанавливаться. Всё это будет запихано в дистрибутив, и впоследствии будет установлено. Но вот с такими пакетами как Autocad или Office это вряд ли пройдёт. Для запуска программ из вашего приложения есть функция WinExec('file.exe', SW_RESTORE) например. Ваша программа должна анализировать наличие этих программ, и при их отсутствии просить вставить установочный диск и запускать установку указанной функцией.
Жека, добавлено 18.11.11, 16:21:41 
Подскажите пожалуйста как открыть созданный в Дельфи exe фаил, если исходник утерян????
Автор, добавлено 18.11.11, 17:26:44 
Вам, видимо, нужно восстановить исходник, а не открыть exe-файл? Программы, которые помогают частично восстановить исходник, называются декомпиляторы. Поищите в Гугле "восстановить исходник по exe файлу delphi". Или уточните ваш вопрос.
Жека, добавлено 20.11.11, 08:13:59 
Спасибо за подсказку!!!!
Сергей, добавлено 24.03.12, 18:08:27 
Добрый день. Спасибо Вам за столь информативный сайт. Я только начинаю работать с Delphi 7, и на первых же порах не смог разобраться с построчным чтением из текстового документа. Задача: в коде программы указать путь к текстовому документу в котором построчно написаны номера телефонов, эти номера нужно вывести по одному в форму с добавлением строки "добавлен". Заранее спасибо.
Автор, добавлено 24.03.12, 18:44:13 
Что значит вывести в форму? Другое дело в компонент, обычно в Memo. Можно считать из файла весь документ, и затем обработать, добавить или изменить что-то. Я пишу с телефона, код будет в строку. Считать: Memo.Lines.LoadFromFile('ИмяФайла'); Добавить в каждой строке: for i:=0 to Memo.Lines.ColCount-1 do Memo.Lines[i]:=Memo.Lines[i]+' то-что-нужно';
Сергей, добавлено 24.03.12, 19:03:56 
Спасибо. Буду разбираться с MEMO)) Немного не точно выразился, но Вы сами прекрасно все поняли и объяснили то что нужно) Еще раз спасибо, и процветания Вашему проекту!
Сергей, добавлено 24.03.12, 20:17:47 
С МЕМО разобрался, получилось так как и было запланировано. Теперь второй вопрос. Полученные построчно записи нужно изменить по порядку. Вопрос: Как дополнительно в коде видоизменять построчные данные? Т.е у меня есть массив 123123,1233333,3123123,4121412 нужно что бы каждая запись участвовала в дополнительной программе. Я понимаю что через While должно делаться но не могу понять как скомповать эту функцию с for.
Сергей , добавлено 24.03.12, 23:42:24 
Спасибо. Вопрос снят с повестки) Разобрался)) Просто после for i:=0 to Memo.Lines.ColCount-1 do нужно было набрать begin и далее программу)) Еще раз спасибо)
Елена, добавлено 6.04.12, 12:21:28 
Здравствуйте, уважаемый Автор! Понравились ваши уроки и ваши толковые ответы.
Помогите, пожалуйста, в решении производственной задачи.
Раньше работала такая схема: подготовка файлов DBF в программе Clipper и их закачка в БД Oracle программой DELPHI с использованием BDE.
Теперь, после сокращения оператора, данные из подразделений приходят в WORD (предприятия раскиданы по республике).
Сейчас мы их преобразовываем: DOC->TXT->формирование DBF программой Clipper (там есть такая возможность).
Структура файла WORD:
(заголовок пачки 1)
(строка 1 пачки 1)
(строка 2 пачки 1)

(заголовок пачки 2)
(строка 1 пачки 2)
(строка 2 пачки 2)

END
Строки и заголовки по тексту отличить можно. Все заголовки начинаются так '(701 ', а строки так '(1 '. Заголовки и строки заключены в скобки. Текст 'END' -конец файла.
Цель: DOC преобразовать в DBF-файлы средствами DELPHI для последующей закачки в БД. Для этого надо сформировать файлы заголовков пачек и файлы содержимого пачек. Имена файлов должны содержать номера пачек.
Выбрать Документ и поместить его в RICHEDIT для просмотра получилось, а как работать с его содержимым по строкам, причем последовательно, не могу придумать, совсем нет опыта работы с документами. Вывести записи в DBF и отобразить результаты на экране тоже смогу.
Спасибо.
Автор, добавлено 6.04.12, 13:47:58 
Посмотрите эту статью: Компонент Memo

Все основные методы одинаковы и для RichEdit. А если будут особенности, пишите, а то я сам всех ваших требований угадать не смогу. Кстати, возможно просто перенести весь документ в Memo:

Memo1.Lines:=RichEdit1.Lines;

Конечно, элементы форматирования исчезнут, т.к. Memo их не поддерживает. Но если нужен только текст...

Ну, по-быстрому, содержание строки с индексом i (отсчитывается от нуля) равно:

S:=Memo1.Lines[i];

Символ с номером n (отсчитывается от 1) от начала строки:

S:=S[n];

Ну или сразу

S:=Memo1.Lines[i][n];

Кстати, Memo сохраняет именно в .txt формат файла:

Memo1.Lines.SaveToFile(FileName+'.txt');

Расширение конечно может быть любым, но формат всё равно - .txt
Елена, добавлено 6.04.12, 15:45:42 
Спасибо за быстрый ответ.
Чтобы решить проблему, надо поделиться ей с другом))).
Уже начала работать через ListBox.
ListBox1.Items:= RichEdit1.Lines; (можно и Memo.Lines) - потом построчный анализ и т.д.
От txt как раз хотим освободиться.
Всего хорошего!
Аноним, добавлено 31.12.13, 02:57:24 
SaveV.X := Form1.Left ;
  SaveV.Y := Form1.Top ;

что значат буквы X и Y ? после SaveV ?
Руслан, добавлено 31.12.13, 02:58:13 
SaveV.X := Form1.Left ;
  SaveV.Y := Form1.Top ;

что значат буквы X и Y после SaveV ?
Автор, добавлено 31.12.13, 05:36:06 
Это программа из первой части урока про файлы, там есть ссылка на него. Вообще, мы запоминаем координаты. SaveV - это переменная, описанная как запись с полями X и Y - для сохранения координат по X и по Y, доступ к полям записи осуществляется через точку.
Петр, добавлено 7.02.14, 11:45:20 
Здравствуйте, Автор! Большая польза почитать Ваши уроки. Спасибо. Но не нашел у Вас следующего (или прозевал): как красиво создать в Делфи таблицу, заполнить ее и отослать в Word для дальнейшего редактирования и т.д.? Туда же и графику Image.
Так возможно? Спасибо.
Автор, добавлено 7.02.14, 13:25:18 
Вам придётся создавать в Word таблицу и переписывать в неё данные из вашего delphi-проекта. Я этого никогда не делал, и на сайте не описывал. Сейчас посмотрел, есть ответы в сети, как это можно сделать.
Петр, добавлено 7.02.14, 13:48:57 
Спасибо, я буду искать. А принцип создания файла Word и передачи в него графики Image можете привести?
Автор, добавлено 7.02.14, 14:43:01 
Вот так создаются и Word и Excel:

var
  Form1: TForm1;
  Word: Variant;

implementation

{$R *.dfm}

uses ComObj, JPEG;

procedure TForm1.Button1Click(Sender: TObject);
begin
Word:=CreateOleObject('Word.Application');
Word.Documents.Add;
Word.DisplayAlerts:=False;
Word.Visible:=True;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
 Word.Quit;
 Word.Unassigned;
except

end;
end;

Как работать в Word с графикой, учить не имею полного права - никогда этим не занимался. Но вот метод как добавить картинку в место расположения курсора, с одного сайта "срисовал", и исправил ошибки:

var FileName: String;
begin
with OpenPictureDialog1 do
  if Execute then
  Word.ActiveDocument.InLineShapes.AddPicture(FileName, False, True);
end;

Можно и без диалога, тогда нужно определить переменную FileName, вставить нужный адрес файла.
Петр, добавлено 7.02.14, 19:08:56 
Большое спасибо.
Оставить комментарий:

Имя  

Текст комментария

  





Интернет-магазин электрооборудования