Как в делфи открыть файл
классика Pascal. Работа с типизированными файлами в Delphi – Delphi в Internet
Удивительно, но факт – запрос “delphi файлы” в Яндексе – это один из самых популярных запросов, касающихся Delphi. Популярнее только “delphi скачать” – видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос – должен быть и ответ. Посмотрим, что получится в итоге.
Содержание статьи
Классика работы с файлами в Delphi – ключевое слово File
Этот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе.
Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например:
type TPerson = record Name: string[20]; Family: string[20]; end; var UntypedFile: File; //нетипизированный двоичный файл TypedFile: File of TPerson;//типизированный файл
Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы:
IntFile: File of integer; StringFile: file of single; ShortStringFile: file of ShortString;
Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы:
type TIntArr = array of integer; var StrFile: file of string; //недопустимо - размер string заранее не известен ArrFile: file of TIntArr;//недопустимо - размер динамического массива заранее неизвестен
Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее:
[dcc32 Error] E2155 Type ‘string’ needs finalization – not allowed in file type
Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:
- Ассоциировать файловую переменную с файлом на диске
- Открыть файл
- Записать/Прочитать файл
- Закрыть файл
При этом, для типизированных и не типизированных файлов работа в части чтения/записи несколько различается в плане используемых методов.
Работа с типизированными файлами в Delphi
Рассмотрим несколько примеров работы с типизированными файлами в Delphi.
Для начала, рассмотрим вариант работы с типизированным файлом, например, представленном выше:
type TPerson = record Name: string[20]; Family: string[20]; end; var TypedFile: File of TPerson;
Пример №1. Запись данных в типизированный файл Delphi
Запишем в наш файл две записи:
program example_1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TPerson = record Name: string[20]; Family: string[20]; end; var TypedFile: File of TPerson; Person: TPerson; begin //связываем файловую переменную с файлом на диске AssignFile(TypedFile,'MyFile.txt'); //открываем файл для записи Rewrite(TypedFile); //задаем имя/фамилию человека Person.Name:='Иван'; Person.Family:='Иванов'; //добавляем запись в файл Write(TypedFile, Person); //задаем имя/фамилию второго человека Person.Name:='Петр'; Person.Family:='Петров'; //записываем в файл Write(TypedFile, Person); //закрываем файл CloseFile(TypedFile); Readln; end.
Рассмотрим методы, используемые в этом примере:
function AssignFile(var F: File; FileName: String): Integer;
Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом.
procedure Rewrite(var F: File; [ RecSize: Integer]);
Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла.
F – это переменная, связанная с внешним файлом с использованием AssignFile. RecSize – это необязательное выражение, которое можно указывать, только если F является нетипизированным файлом (об этом ниже).
procedure Write([var F: File]; P1; [ ..., PN]); overload;
Используется для записи в типизированный файл. F – файловая переменная, P1..PN – это переменная того же типа, что и тип файла F.
procedure CloseFile(var F: File);
Прекращает связь между файловой переменной и файлом внешнего диска. F – это файловая переменная любого типа. Внешний файл, связанный с F, полностью обновляется, а затем закрывается, освобождая дескриптор файла для повторного использования.
В результате выполнения представленного выше кода, рядом с exe-файлом будет создан новый файл MyFile.txt, содержащий две записи, при этом, каждая запись будет иметь фиксированный размер, вне зависимости от фактических имени/фамилии.
Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi.
Пример №2. Добавление записей в типизированный файл Delphi
Рассмотрим такой пример Delphi:
program example_2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TPerson = record Name: string[20]; Family: string[20]; Age: integer; end; procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end; procedure AppendTypedFile; var F: file of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); // открываем файл для записи Reset(F); Seek(F, FileSize(F)); // задаем имя/фамилию человека Writeln('Введите имя: '); Readln(Person.Name); Writeln('Введите фамилию: '); Readln(Person.Family); Writeln('Введите возраст: '); Readln(Person.Age); // добавляем запись в файл Write(F, Person); // закрываем файл CloseFile(F); end; var TypedFile: File of TPerson; Person: TPerson; DoAppend: integer; begin if not FileExists('MyFile.txt') then begin AssignFile(TypedFile, 'MyFile.txt'); // открываем файл для записи Rewrite(TypedFile); // закрываем файл CloseFile(TypedFile); end; // связываем файловую переменную с файлом на диске repeat Writeln('Добавить в файл запись: 1 - Да; 2 - Нет'); Readln(DoAppend); case DoAppend of 1: AppendTypedFile; 2: break; end; until DoAppend = 0; //читаем все записи из типизированного файла ReadTypedFile; Readln; end.
Разберемся с тем, что здесь делается. Во-первых, условие:
if not FileExists('MyFile.txt') then
проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание:
function FileExists(const FileName: string; FollowLink: Boolean = True): Boolean;
FileName – имя файла, существование которого необходимо проверить. Второй параметр – FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию).
Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл:
repeat Writeln('Добавить в файл запись: 1 - Да; 2 - Нет'); Readln(DoAppend); case DoAppend of 1: AppendTypedFile; 2: break; end; until DoAppend = 0;
В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись:
procedure AppendTypedFile; var F: file of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); // открываем файл для записи Reset(F); //смещаемся в конец файла Seek(F, FileSize(F)); // задаем имя/фамилию человека Writeln('Введите имя: '); Readln(Person.Name); Writeln('Введите фамилию: '); Readln(Person.Family); Writeln('Введите возраст: '); Readln(Person.Age); // добавляем запись в файл Write(F, Person); // закрываем файл CloseFile(F); end;
Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре.
Метод Reset не воссоздает файл снова, как Rewrite, а открывает его для чтения/записи (в случае двоичных файлов). Что касается метода Seek, то он имеет следующее описание:
procedure Seek(var F: File; N: Integer);
F – файловая переменная, ассоциированная с файлом на диске, N – номер записи в файле (первый номер – 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов:
где FileSize – это метод Delphi имеющий следующее описание:
function FileSize(var F: File): Integer;
В случае использования типизированных файлов эта функция возвращает количество записей в файле.
После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile – чтение всех записей из файла:
procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end;
Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi:
function Eof([var F: File]): Boolean; overload;
Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False.
По аналогии с методом Write, метод Read производит чтение очередной записи из файла и имеет следующее описание:
procedure Read(var F: File; V1; [ ..., VN]);
Результат работы нашего примера может быть следующим:
Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate:
procedure Truncate(var F: File);
Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true).
Рассмотрим пример использования этой процедуры.
Пример №3. Удаление последних записей типизированного файла в Delphi
Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи:
program example_3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TPerson = record Name: string[20]; Family: string[20]; Age: integer; end; procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end; var TypedFile: File of TPerson; Person: TPerson; Count: integer; DoErase: integer; begin AssignFile(TypedFile,'MyFile.txt'); Reset(TypedFile); Count:=FileSize(TypedFile); if Count<2 then begin Writeln('Количество записей в файле меньше двух. Стереть все записи? 1 - Да; 2 - Нет'); Readln(DoErase); if DoErase=1 then Truncate(TypedFile); end else begin Seek(TypedFile, Count-2); Truncate(TypedFile); end; //читаем все записи из типизированного файла ReadTypedFile; Readln; end.
В этом примере мы делаем следующее:
- Открываем файл существующий AssignFile/Reset
- Определяем количество записей в файле (Count:=FileSize(TypedFile))
- Если количество записей меньше двух, то спрашиваем у пользователя стереть ли все записи и, в случае положительного ответа, вызываем метод Tuncate
- Если количество записей в файле больше двух, то смещаемся на нужную нам позицию в файле (Seek(TypedFile, Count-2)) и затираем две последние записи методом Truncate.
Подведем итог
Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:
- Определить тип записей в файле – это могут быть стандартные типы данных Delphi с фиксированным размером: ShortString, integer, single и так далее или собственные типы данных, например, записи (record), но, в этом случае, главное условие – размер записи должен быть фиксированным.
- В коде Delphi/Pascal определить файловую переменную, используя ключевое слово file и, указав тип записей файла, определенный в пункте 1.
- Ассоциировать файловую переменную с внешним файлом на диске, используя метод AssignFile.
- Открыть файл для чтения/записи, используя методы Rewrite/Reset.
- Чтобы сделать в файл очередную запись используем метод Write, для чтения очередной записи из файла – используем метод Read.
- Закрыть файл методом CloseFile.
В целом, рассмотренные выше примеры не охватывают всех возможностей работы с типизированными файлами в Delphi, а, скорее, показывают основные операции по работе с типизированными файлами. Поэтому ниже представлен перечень методов которые могут применяться при работе с типизированными файлами в Delphi/Pascal.
Функции и процедуры для работы с типизированными файлами в Delphi/Pascal
Метод | Краткое описание |
procedure AssignFile(var F: File; FileName: String) | Ассоциирует файловую переменную F с внешним файлом FileName. Переменная FileName может быть как именем файла, так и содержать полный путь к файлу на диске. |
procedure CloseFile(var F: File); | Закрывает файл, ассоциированный с переменной F и освобождает переменную для дальнейшего использования. |
function Eof(var F: File): Boolean; | Проверяет конец файла и возвращает True, если файловый указатель стоит в конце файла. В случае записи True означает, что очередной компонент будет добавлен в конец файла, при чтении – что файл прочтен полностью. |
procedure Erase(var F: File); | Удаляет внешний файл, связанный с файловой переменной F. Перед удалением файла его необходимо закрыть методом CloseFile. |
function FilePos(var F: File): Integer; | Возвращает текущую позицию в файле. В коде Delphi используйте FilePos для файловой переменной открытого файла, чтобы определить текущую позицию в файле. Если текущая позиция в файле находится в начале, FilePos возвращает 0. |
function FileSize(var F: File): Integer;
| Для типизированных файлов возвращает количество записей в файле. |
procedure Read(var F: File; V1; [ ..., VN]); | Считывает из типизированного файла одну или несколько записей |
procedure Rename(var F: File; Newname: String); | Переименовывает файл, ассоциированный с переменной F |
procedure Reset(var F: File; [ RecSize: Integer]); | Открывает файл для чтения. Второй параметр RecSize указывается в случае использования нетипизированных файлов и указывает размер записи в файле в байтах |
procedure Rewrite(var F: File; [ RecSize: Integer]); | Воссоздает файл. Если файл существует, то Rewrite его удалит, а затем создаст снова. RecSize используется для нетипизированных файлов |
procedure Seek(var F: File; N: Integer); | Перемещает текущую позицию в файле к записи N (первая запись имеет номер 0) |
procedure Truncate(var F: File); | Стирает из файла данные, расположенные за текущей позицией |
procedure Write([var F: File]; P1; [ ..., PN]); | Записывает в файл F одну или несколько записей |
0 0 голос
Рейтинг статьи
Как создать и открыть Excel - файл в Delphi
Открываем Excel в Delphi
Для этого, в раздел Uses программы, необходимо включить модуль ComObj.
Далее поместим на форму компонент TButton и в обработчике событий OnClick запишем следующий код:
procedure TForm1.Button1Click(Sender: TObject); var XL: Variant; begin XL := CreateOLEObject('Excel.Application'); // Создание OLE объекта XL.WorkBooks.add; // Создание новой рабочей книги XL.visible := true; end; |
Результатом выполнения станет запуск программы Microsoft Excel и открытие нового листа.
Для открытия уже существующего документа Excel следует воспользоваться методом Open:
XL.WorkBooks.Open('c:\example.xls'); |
Если необходимо открыть документ Excel только для чтения, пишем следующее:
XL.Workbooks.Open['c:\example.xls', 0, True]; |
Для закрытия документа Excel:
Если Вам необходимо при открытии файла использовать не абсолютный, а относительный путь, то необходимо предварительно воспользоваться функцией GetDir, рассмотрим пример ниже:
procedure TForm1.Button1Click(Sender: TObject); var XL: Variant; AppLocation:string; begin try XL := CreateOLEObject('Excel.Application'); // Создание OLE объекта except ShowMessage('Cannot start MS Excel.'); end;
GetDir(0,AppLocation); // Возвращает текущий каталог диска XL.WorkBooks.Open(AppLocation +'\filename.xlsx'); XL.visible := true; end; |
Вконтакте
Google+
Одноклассники
Мой мир
Лабораторная работа “Вывод текста из файла” – Delphi в Internet
Текст задания звучит следующим образом: вывести на экран текст из файла text.txt. Это задание базируется на выполнении предыдущего – запись текста в файл. Вывод текста из файла на экран в Pascal/Delphi осуществляется с помощью двух процедур: readln() и writeln(). Рассмотрим подробное решение этой задачи. Лабораторная работа выполняется в Delphi 10.3 Rio.
Анализ задачи
На данном этапе предполагается, что у нас имеется файл text.txt, который содержит некоторое количество строк текста или же файл пуст. Наша задача сводится к следующим шагам:
- Получить доступ к файлу
- Считывать из файла строки до тех пор, пока не будет достигнут конец файла
- Закрыть файл
Решение задачи
Создаем новое консольное приложение в Delphi. Как это сделать – смотри в предыдущей лабораторной работе.
Пишем следующий код:
program ReadTextFile; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var F: TextFile; s: string; begin AssignFile(F,'text.txt'); Reset(F); while not Eof(F) do begin readln(F,s); Writeln(s); end; CloseFile(F); readln; end.
Рассмотрим алгоритм решения этой задачи подробно:
1. Определяем переменные в разделе var
– это файловая переменная для работы с текстовым файлом
– это переменная для хранения строки, полученной из текстового файла в delphi
2. Ассоциируем файловую переменную с внешним файлом на диске:
AssignFile(F, 'text.txt');
Более подробно об этой процедуре – см. здесь.
3. После того, как файловая переменная ассоциирована с внешним файлом, открываем текстовый файл, используя метод Reset.
Для открытия текстового файла в Pascal/Delphi могут использоваться три метода – Rewrite, Reset и Append. Однако, так как в тексте задачи указано, что необходимо читать данные из файла, то мы используем метод Reset(), который открывает файл, ассоциированный с переменной F для чтения/записи, не создавая заново и не затирая данные.
4. В цикле с предусловием while..do считываем строки из файла и выводим их на экран:
while not Eof(F) do begin readln(F,s); Writeln(s); end;
Для условия выхода из цикла мы использовали метод Eof():
Метод Eof() возвращает True (истину), если достигнут конец файл. Таким образом, наше условие выхода из цикла читается как “пока не достигнут конец файла“.
Цикл с постусловием repeat..until в этой задаче лучше не использовать, несмотря на то, что программа не выдаст при этом никаких ошибок. Дело в том, что, если использовать цикл с постусловием, то программа хотя бы один раз попытается считать строку из файла и, если файл окажется пустым, то на экран будет выведена пустая строка – программа сработает “вхолостую”.
5. Закрываем файл и ожидаем пока пользователь не нажмет Enter:
Улучшение программы
Несмотря на то, что программа будет работать, в представленном выше коде есть несколько “тонких” мест. Во-первых, это использование строковой константы (имени файла) непосредственно в коде программы, чего необходимо избегать, так как затрудняется внесение изменений в код программы, если таких констант у вас будет много. Во-вторых, если при запуске программы рядом с exe-файлом не будет обнаружен файл text.txt, то программа вызовет исключение при попытке открыть файл методом reset(). Текст ошибки при этом будет следующим:
—————————
Debugger Exception Notification
—————————
Project ReadTextFile.exe raised exception class EInOutError with message ‘File not found’.
—————————
Break Continue Help
—————————
Улучшим код нашей программы следующим образом:
program ReadTextFile; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; const cFileName = 'text.txt'; сFileNotFound = 'Файл %s не найден!'; var F: TextFile; s: string; begin if FileExists(cFileName) then begin AssignFile(F, cFileName); Reset(F); while not Eof(F) do begin readln(F, s); Writeln(s); end; CloseFile(F); end else Write(Format(сFileNotFound,[cFileName])); readln; end.
В этом коде мы вынесли все строковые константы в секцию const, а в самом коде программы добавили условие:
if FileExists(cFileName) then begin //здесь происходит чтение файла end else Write(Format(сFileNotFound,[cFileName]));
Функция FileExists() проверяет наличие файла на диске и возвращает True, если файл найден.
Функция Format() форматирует строку. В качестве первого аргумента этой функции выступает константа сFileNotFound, содержащая символ форматирования %s, который заменяется, в нашем случае, на имя файла (см. второй аргумент функции).
Таким образом, если рядом с exe-файлом не будет обнаружено необходимого файла, то вместо ошибки будет выведено следующее сообщение:
Подобное улучшение кода делает программу более гибкой к изменению и позволяет избежать лишних проблем в случае, если файл не будет найден.
Файлы для загрузки
Скачать файлы лабораторной работы вы можете со страницы исходников:
0 0 голос
Рейтинг статьи
Работа с Excel в Delphi. Основы основ. – Delphi в Internet
Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) – это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше – это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.
Введение
Итак, цель сегодняшней статьи – поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного – программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно – начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.
Отсюда можно сделать простой и однозначный вывод – заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.
Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.
1. Как проверить установлен ли Excel на компьютере пользователя?
Создаем новый модуль (unit) и подключаем в uses следующие модули:
uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;
теперь объявляем глобальную переменную:
Одну константу (для удобства):
const ExcelApp = 'Excel.Application';
И пишем простенькую функцию:
function CheckExcelInstall:boolean; var ClassID: TCLSID; Rez : HRESULT; begin // Ищем CLSID OLE-объекта Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID); if Rez = S_OK then // Объект найден Result := true else Result := false; end;
Или ещё короче:
function CheckExcelInstall: boolean; var ClassID: TCLSID; begin Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK; end;
Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно – Excel установлен.
Но проверка на наличие установленного Excel – это только часть необходимых операций перед началом работы. Другой немаловажной проверкой является проверка на наличие уже запущенного экземпляра Excel. Если этого не делать, то может случиться такая нехорошая ситуация, когда в системе будет зарегистрировано …дцать процессов Excel и все оперативная память волшебным образом утекает “в трубу” – за такое могут и по ушам надавать. Но мы-то свои уши бережем. Пишем вторую функцию проверки.
2. Определяем запущен ли Excel
function CheckExcelRun: boolean; begin try MyExcel:=GetActiveOleObject(ExcelApp); Result:=True; except Result:=false; end; end;
Думаю тут лишних объяснений не потребуется? Всё предельно просто – если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное – не забыть проверить – может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.
3. Как запустить Excel?
Одно дело, когда мы получаем в распоряжение уже запущенный Excel, другое – когда Excel требуется запустить из Delphi. Напишем функцию запуска Excel:
function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean; begin try {проверяем установлен ли Excel} if CheckExcelInstall then begin MyExcel:=CreateOleObject(ExcelApp); //показывать/не показывать системные сообщения Excel (лучше не показывать) MyExcel.Application.EnableEvents:=DisableAlerts; MyExcel.Visible:=Visible; Result:=true; end else begin MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR); Result:=false; end; except Result:=false; end; end;
Здесь мы в начале проверяем, установлен ли Excel в принципе и, если он все же установлен, запускам. При этом мы можем сразу показать окно Excel пользователю – для этого необходимо выставить параметр Visible в значение True.
Также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel – пользователь может занервничать.
Переходим к следующему этапу работы – созданию рабочей книги.
4. Создаем пустую рабочую книгу Excel
Для создания пустой рабочей книги я обычно использую вот такую функцию:
function AddWorkBook(AutoRun:boolean=true):boolean; begin if CheckExcelRun then begin MyExcel.WorkBooks.Add; Result:=true; end else if AutoRun then begin RunExcel; MyExcel.WorkBooks.Add; Result:=true; end else Result:=false; end;
Второй вариант (более лаконичный):
function AddWorkBook(AutoRun: boolean = true): boolean; begin Result := CheckExcelRun; if (not Result) and (AutoRun) then begin RunExcel; Result := CheckExcelRun; end; if Result then MyExcel.WorkBooks.Add; end;
То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу – всё зависит от ситуации.
Здесь, думаю, следует напомнить, что, если вы выполните эту функцию, например пять раз, то получите пять открытых рабочих книг и работать с ними как Вам захочется. Главное при этом правильно обратиться к необходимой книге, а для этого можно использовать вот такую функцию:
function GetAllWorkBooks:TStringList; var i:integer; begin try Result:=TStringList.Create; for i:=1 to MyExcel.WorkBooks.Count do Result.Add(MyExcel.WorkBooks.Item[i].FullName) except MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR); end; end;
Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.
Ну, и наконец, после того, как поработали с книгами – их требуется закрыть. Точнее сохранить, а потом уж закрыть.
5. Сохраняем рабочую книгу и закрываем Excel
Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:
function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean; begin try MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName); if MyExcel.WorkBooks.Item[WBIndex].Saved then Result:=true else Result:=false; except Result:=false; end; end;
Если у Вас открыто 10 книг – просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.
А закрывается Excel вот так:
function StopExcel:boolean; begin try if MyExcel.Visible then MyExcel.Visible:=false; MyExcel.Quit; MyExcel:=Unassigned; Result:=True; except Result:=false; end; end;
Вот набор тех основных функций с которых начинается вся интеграция Excel в приложения написанные на Delphi. В следующий раз займемся работой с конкретной книгой – научимся записывать и читать данные из книг.
Книжная полка
Автор: Юрий Магда Название:Разработка приложений Microsoft Office 2007 в Delphi Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi. |
5 1 голос
Рейтинг статьи
Командная строка- Как открыть несколько файлов с помощью программы Delphi, вызываемой через оболочку open
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
Проверка открытия файла в Delphi
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
vcl - Как выбрать файл в Delphi
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
delphi - Запустить открытый файл с помощью Opendialog и выполнить его
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
Как можно импортировать файл wsdl в Delphi в автономном режиме?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических талантов и
DELPHI Как скопировать .txt файл и переименовать
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Рекламная