ReadLn — Процедура Delphi

Содержание

ReadLn — Процедура Delphi

В данный момент переписываю DOS-программу с Turbo Pascal на DELPHI 5.
Существует ли в Delphi какой-либо аналог процедуры Readkey, Readln.
То есть в процессе выполнения одной процедуры нужно остановить выполнение программы на каком-то операторе, передать управление на консоль, считать значение параметра и продолжить вычисления с места остановки.
Например
begin
x:=2;
Readkey(y);
z:=x+y;
end;

В свойствах:
KeyPreview:=True

И обрабатываешь событие:
OnKeyPress
OnKeyDown
OnKeyUp

Это я понимаю, но
begin
x:=2;
Form2.Show;<форма,где я по идее должен обрабатывать OnKeyPress
показываеться, а выполнение операторов продолжается
то есть ползователь ничего не успевает ввести как
уже пошло дальше z:=x+y; а Form2 висит на экране >
z:=x+y;
end

А если Form2.ShowModal то нельзя будет вводить в Combobox, Edit -поля свои данные нужные для дальнейших рассчетов.

Возьми хорошую толстую книжку по основам Delphi и внимательно ее прочитай !

если combobox и edit на form2, то вводить можно
в модуле form1 uses form2

и после showmodal
param1:=form2.edit1.text;

Если нельзя по другому, то после Form2.Show крутись в цикле ожидания до того момента пока, специально отведенная для этого, глобальная переменная не примет нужное значение. А это самое значение присваивай ей в нужный момент из Form2. Только не забудь в теле цикла вписать Application.ProcessMessages, а то подвесишь свое приложение. Но этот вариант, мягко говоря, не лучший.

Зачем в консольной программе плодить форму, если надо всего лишь считать значение параметра?

ReadLn в Delphi есть, его и используйте.

Вероятно речь идет не о консольном приложении, иначе и вопрос бы не возник, а упоминание слова «консоль» в исходном вопросе только запутывает. Опять проблемы с терминологией :)

Сорри,
вариант с Form2.ShowModal работает — я почему-то решил(склероз), что Form2.ShowModal переводит форму Form2 в состояние Enabled=false(и поэтому я не смогу редактировать Edit1,Edit2),
но на практике проверил — работает.
2 Юрий Зотов речь идет не о консольном приложении

Как заменить ReadLn с буферной версией потоковой ReadLn?

Я прочитал содержание UTF8 из XML — файлов , а затем нужно сохранить и повторно нагрузки по требованию. Я конвертирование из AssignFile / Writeln / ReadLn для буферизации потоков Дэвида Heffernan: буферизованные файлы (для более быстрого доступа к диску)

У меня есть новый простой WriteLn и процедура ReadLn, WriteLn работает, но я не могу сделать ReadLn работы.

Моя концепция ReadLn это процесс:

  1. буфер считывания
  2. Найти разрыв строки
  3. Получить текст из PrevPos в CurrPos-1
  4. Сохранить остальной буфер, чтобы добавить к первой строке следующего буфера чтения

Новая процедура WriteLn:

Но есть проблемы с Read , поскольку она не читать в буфер из файла. Ошибка возникает в Read функции TReadOnlyCachedFileStream:

И вот моя ReadLn процедуры — не работает, как я не могу получить через ошибку:

RTL имеет свой собственный TStreamReader и TStreamWriter классы в System.Classes блоке, вы должны позволить им делать тяжелую работу за вас, например:

Если вы хотите использовать классы буфера Давида (обратите внимание , что Delphi 10,1 Berlin добавляет новый TBufferedFileStream класс), вы можете сделать это , а также, например:

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Файлы в Delphi: Чтение данных из файла

Чтение из файла выполняется при помощи инструкций read и readln, которые в общем виде записываются следующим образом:

  • ФайловаяПеременная — переменная типа Textfile;
  • списокпеременных — имена переменных, разделенные запятыми.

Закажи видеокурс по Delphi прямо сейчас и получи 106 видеоуроков:

ЗАКАЗАТЬ

Посмотрите подробный видеоурок по работе с файлами в Delphi

Скачайте больше видеоуроков по Delphi бесплатно прямо сейчас — скачать.

Чтение чисел

Следует понимать, что в текстовом файле находятся не числа, а их изображения. Действие, выполняемое инструкциями read или readin, фактически состоит из двух: сначала из файла читаются символы до появления разделителя (пробела или конца строки), затем прочитанные символы, являющиеся изображением числа, преобразуются в число, и полученное значение присваивается переменной, имя которой указано в качестве параметра инструкции read ИЛИ readln.

Например, если текстовый файл a:\data.txt содержит следующие строки:

то в результате выполнения инструкций:

AssignFile(f, ‘c:\data.txt’ );
Reset(f); // открыть для чтения
readln(f, a);
readln(f, b);
readln(f, с);
readln(f, d);

значения переменных будут следующими: а = 23, b = 15, с = 45, d = 23.

Отличие инструкции readin от read состоит в том, что после считывания из файла очередного числа и присвоения полученного значения переменной, имя которой стоит последним в списке параметров инструкции readin, указатель чтения из файла автоматически перемешается в начало следующей строки файла, даже в том случае, если за прочитанным числом есть еше числа.

Поэтому в результате выполнения инструкций

AssignFile (f, ‘a: \data. txt’ );
Reset(f);
readln(f, a);
readln(f, b, c);
readln (f, d) ;

значения переменных будут следующими: а = 23, b = 45, с = 28, d = 56.

Если при чтении значения численной переменной в файле вместо изображения числа будет какая-то другая последовательность символов, то произойдет ошибка.

Чтение строк

В программе строковая переменная может быть объявлена с указанием длины или без нее.

При чтении из файла значения строковой переменной, длина которой явно задана в ее объявлении, считывается столько символов, сколько указано в объявлении, но не больше, чем в текущей строке.

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

мер, двух переменных, то первая переменная будет содержать столько символов, сколько указано в ее объявлении или, если длина не указана, всю строку файла. Вторая переменная будет содержать оставшиеся символы текущей строки или, если таких символов нет, не будет содержать ни одного символа (длина строки равна нулю).

Пусть, например, текстовый файл freinds.txt содержит строки:

Конец файла

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

У функции EOF один параметр — файловая переменная. Значение функции EOF равно False, если прочитанный элемент данных не является последним в файле, т. е. возможно дальнейшее чтение. Если прочитанный элемент данных является последним, то значение EOF равно True.

Значение функции EOF можно проверить сразу после открытия файла. Если при этом оно окажется равным True, то это значит, что файл не содержит ни одного элемента данных, т. е. является пустым (размер такого файла равен нулю).

В листинге 7.5 приведена процедура, которая выполняет поставленную задачу. Она читает строки из файла, имя которого ввел пользователь во время работы программы, и выводит эти строки в поле Memo. Окно программы приведено на рис. 7.6.

Листинг 7.5. Чтение из файла

Для организации обработки файла использована инструкция цикла while, которая обеспечивает проверку значения функции EOF перед каждым чтением, в том числе и перед первым.

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

Добавление очередной прочитанной из файла строки в поле Memo выполняется применением метода Add к свойству Lines.

Почему ReadLn не присваивает значения всем моим переменным в Delphi?

При использовании Delphi ReadLn для чтения значений из файла с разделителями табуляции в ряд переменных, почему некоторые переменные не получают назначенное соответствующее значение при переходе через отладчик?

Только y имеет значение, x и z равны 0.

Примечание: Это было отредактировано после того, как Mason Wheeler полностью вернул ответ

Это симптом более общей ошибки, в частности, попытка отладки значений неиспользуемых переменных.

Вкратце: По умолчанию компилятор оптимизирует неиспользуемые переменные

Если при написании кода постепенно, вы решили отлаживать и обнаруживать, скажем, что процедура ReadLn читается в переменных правильно, вы можете обнаружить, что значения пустые или 0. Если переменные не используются позже, код — что может быть не так, если вы отлаживаете, когда пишете каждую строку — компилятор, похоже, оптимизирует их.

Я использовал ReadLn в этом примере, так как вполне возможно, что вы хотите использовать данные во втором столбце файла csv и поэтому должны создавать различные переменные throwaway, которые не используются. При проверке значений переменных throwaway вы обнаружите, что они не содержат того, что вы ожидаете!

В приведенном выше примере вы можете заставить отладчик загружать vlaues, просто «используя» переменные позже в коде, т.е.

Теперь mousover покажет значения y и z , а также

ReadLn — Процедура Delphi

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

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

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

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

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

В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип 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, 1);
Reset(SaveF, 1);

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

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

При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором 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 Следующий урок

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.

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

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

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

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);

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

// Получаем дату и время начала и окончания тестирвоания
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) + ‘ мин.’;

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

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

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

ProtocolName:=ProtocolName + StDate + ‘ ‘ + STtime;

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

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

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

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

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

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

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

Далее прибавляйте само имя файла, и сохраняете. Добавлю, что само имя файла (без пути) получается как 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 это вряд ли пройдёт. Для запуска программ из вашего приложения есть функция например. Ваша программа должна анализировать наличие этих программ, и при их отсутствии просить вставить установочный диск и запускать установку указанной функцией. Жека, добавлено 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:

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

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

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

Кстати, Memo сохраняет именно в .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;

Процедуры и функции работы с файлами

Procedure AssignFile(var F; FileName: String);

Для избежания конфликтов, AssignFile заменяет стандартную процедуру Assign в Delphi. Однако для обратной совместимости вы можете использовать Assign. Процедура AssignFile сопоставляет имя внешнего файла с файловой переменной.

F — файловая переменная любого файлового типа, FileName — выражение типа String или выражение типа PChar, если допускается расширенный синтаксис. Все дальнейшие операции с F производятся с внешним файлом.

Не используйте AssignFile с уже открытой файловой переменной.

Procedure CloseFile(var F);

Из-за конфликтов наименования, процедура CloseFile заменяет стандартную процедуру Close из Borland Pascal. Используйте CloseFile чтобы разорвать связь между файловой переменной и внешним дисковым файлом и закрыть файл.

F — файловая переменная любого файлового типа, открытая процедурами Reset, Rewrite или Append. Внешний файл, связанный с F, полностью модифицируется и затем закрывается, освобождая дескриптор файла для повторного использования.

Директива <$I+>позволяет вам обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций.

При выключенной директиве <$I->, вы должны использовать IOResult для проверки ошибок ввода — вывода.

Function Eof(var F): Boolean;

(типизированные или нетипизированные файлы)

Function Eof[(var F: Text)]: Boolean;

Проверяет, является или нет текущая позиция файла концом файла.

Eof(F) возвращает True, если текущая позиция файла находится за последним символом файла или если файл пуст; иначе, Eof (F) возвращает False.

Директива <$I+>позволяет вам обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций.

При выключенной директиве <$I->, вы должны использовать IOResult для проверки ошибок ввода — вывода.

Procedure Erase(var F);

Удаляет внешний файл, связанный с F.

F — файловая переменная любого файлового типа.

Перед вызовом процедуры Erase, файл необходимо закрыть.

Директива <$I+>позволяет вам обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций.

При выключенной директиве <$I->, вы должны использовать IOResult для проверки ошибок ввода — вывода.

Function FileSize(var F): Integer;

Возвращает размер в байтах файла F. Однако, если F — типизированный файл, FileSize возвратит число записей в файле.

Перед использованием функции FileSize, файл должен быть открыт.

Если файл пуст, FileSize(F) возвращает 0.

F — переменная любого файлового типа.

Function FilePos(var F): LongInt;

Возвращает текущую позицию файла внутри файла.

Перед использованием функции FilePos, файл должен быть открыт. Функция FilePos не используется с текстовыми файлами.

F — переменная любого файлового типа, кроме типа Text.

Procedure Reset(var F [: File; RecSize: Word]);

Открывает существующий файл.

F — переменная любого файлового типа, связанного с внешним файлом с помощью AssignFile. RecSize — необязательное выражение, которое используется, если F — нетипизированный файл. Если F — нетипизированный файл, RecSize определяет размер записи, который используется при передаче данных. Если RecSize опущен, заданный по умолчанию размер записи равен 128 байт.

Процедура Reset открывает существующий внешний файл, ассоциированный с файловой переменной F. Если внешнего файла с таким именем нет, возникает ошибка времени выполнения. Если файл, связанный с F уже открыт, он сначала закрывается и затем вновь открывается. Текущая позиция файла устанавливается к началу файла.

Procedure Rewrite(var F: File [; Recsize: Word]);

Создает и открывает новый файл.

F — переменная любого файлового типа, связанного с внешним файлом с использованием AssignFile.RecSize — необязательное выражение, которое используется, если F — нетипизированный файл. Если F — нетипизирован-ный файл, RecSize определяет размер записи, который используется при пе-редаче данных. Если RecSize опущен, заданный по умолчанию размер запи-си равен 128 байт.

Процедура Rewrite создает новый внешний файл с именем, связанным с F.

Если внешний файл с тем же самым именем уже существует, он удаляется, и создается новый пустой файл.

Procedure Seek(var F; N: LongInt);

Перемещает текущую позицию файла к определенному компоненту. Вы можете использовать процедуру только с открытыми типизированными или нетипизированными файлами.

Текущая позиция файла F перемещается к номеру N. Номер первого компонента файла — 0.

Инструкция Seek(F, FileSize(F)) перемещает текущую позицию файла в конец файла.

Procedure Append(var F: Text);

Открывает существующий текстовый файл для добавления информации в конец файла (дозаписи).

Если внешнего файла с данным именем не существует, происходит ошибка времени выполнения.

Если файл F уже открыт, он закрывается и вновь открывается. Текущая позиция файла устанавливается к концу файла.

Function Eoln[(var F: Text)]: Boolean;

Проверяет, является ли текущая позиция файла концом строки текстового файла.

Eoln(F) возвращает True, если текущая позиция файла — в конце строки или файла; иначе Eoln(F) возвращает False.

Procedure Read(F, V1 [, V2, . Vn]);

(типизированные и нетипизированные файлы)

Procedure Read([var F: Text;] V1 [, V2, . Vn]);

Для типизированных файлов процедура читает компонент файла в переменную. При каждом считывании текущая позиция в файле продвигается к следующему элементу.

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

С переменными типа String Read считывает все символы вплоть до следующей метки конца строки (но не включая ее), или пока функция Eof(F) не примет значение True. Переменной присваивается получившаяся в ре-зультате символьная строка.

В случае переменной целого или вещественного типа процедура ожидает поступления последовательности символов, образующих число по правилам синтаксиса языка Object Pascal. Считывание прекращается при обнаружении первого пробела, символа табуляции или метки конца строки, или в том случае, если функция Eof(F) принимает значение True. Если чи-словая строка не соответствует ожидаемому формату, то происходит ошибка ввода-вывода.

Procedure Readln([var F: Text;] V1 [, V2, . Vn]);

Является расширением процедуры Read и определена для текстовых файлов. Считывает строку символов в файле (включая маркер конца строки) и переходит к началу следующей строки. Вызов функции Readln(F) без па-раметров приводит к перемещению текущей позиции файла на начало сле-дующей строки, если она имеется, в противном случае происходит переход к концу файла.

Function SeekEof[(var F: Text)]: Boolean;

Возвращает признак конца файла и может использоваться только для открытых текстовых файлов. Обычно применяется для считывания числовых значений из текстовых файлов.

Function SeekEoln[(var F: Text)]: Boolean;

Возвращает признак конца строки в файле и может использоваться только для открытых текстовых файлов. Обычно применяется для считывания числовых значений из текстовых файлов.

Procedure Write([var F: Text;] P1 [, P2, . Pn]);

Записывает одну или более величин в текстовый файл.

Каждый параметр записи должен иметь тип Char, один из целочисленных типов (Byte, ShortInt, Word, LongInt, Cardinal), один из типов с плавающей запятой (Single, Real, Double, Extended, Currency), один из строковых типов (PChar, AnsiString, ShortString), или одного из логических типов (Boolean, Bool).

Procedure Write(F, V1, . Vn);

Записывает переменную в компонент файла. Переменные V1. Vn должны быть того же типа, что и элементы файла. При каждой записи переменной текущая позиция в файле передвигается к следующему элементу.

Procedure Writeln([var F: Text;] P1 [, P2, . Pn]);

Выполняет операцию Write, затем помещает метку конца строки в файл.

Вызов Writeln(F) без параметров записывает в файл маркер конца строки.

ReadLn — Процедура Delphi

writeln(f, ‘Прювет!’); // записать и перейти на нов строчку

CloseFile(f); // записать на диск и закрыть

AssignFile(f, ‘c:\temp\1.txt’); // ассигновать файловую пременную f
Reset(f); // открыть для чтения и установить курсор на начало

if not EoF(f) // конец файла не достигнут
then
readln(f, S); // прочитать строку и записать ее в S, перейти на следующую строку

CloseFile(f); // закрыть
end. Всего записей: 59 | Зарегистр. 05-06-2004 | Отправлено: 01:58 12-06-2004

Arion

Full Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

а сайта приличного по Делфи 7 найти очень трудно

А чем delphikingdom.net не устраивает?

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 08:25 12-06-2004
Maxer

Gold Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору enon
Спасибо
Всего записей: 5224 | Зарегистр. 04-05-2004 | Отправлено: 12:51 12-06-2004
enon

Junior Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Arion

Цитата:

А чем delphikingdom.net не устраивает?

Opera говорит : Невозможно найти удаленный сервер!

Maxer
Есть www.creativeport.ru, в нем куча ссылок, искать замучаешься,
если занялся Delphi надолго лучше купи книгу. Конкретный сайт посоветовать не могу.

Всего записей: 59 | Зарегистр. 05-06-2004 | Отправлено: 13:55 12-06-2004
krast

Full Member

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору enon

Цитата:

Opera говорит : Невозможно найти удаленный сервер!

и она права, так как Королевство Delphi обитает по адресу http://www.delphikingdom.com

зы. Там даже есть раздел _Лицей_ — для новичков: обо всем и доходичиво

Delphi in a Nutshell by Ray Lischner

Stay ahead with the world’s most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to v > Start Free Trial

No credit card required

Syntax

Description

ReadLn is just like Read , but after it finishes reading into all the Variable s, ReadLn skips the rest of the line and prepares to read the next line. Without any Variable arguments, ReadLn skips the rest of the line.

ReadLn cannot read a binary file. It is not a real procedure.

Tips and Tricks

To ReadLn , a line ends when it reads a carriage return ( #13 ) or reaches the end of file. The carriage return can optionally be followed by a linefeed ( #10 ) or end of file.

When reading strings, you almost certainly want to use ReadLn instead of Read . Calling Read to read a long string reads everything up to but not including the line ending. If you call Read again to read a string, it will read everything up to but not including the line ending, which means it reads an empty string. ReadLn reads the string and then skips the line ending, so you can read the next line of text into the next string.

Without a TextFile as the first argument, ReadLn reads from Input .

Процедуры и функции для работы с файлами в Delphi

Читайте также:

  1. Cущность банковского процента, его функции и роль.
  2. I. Функции времени в спутниковых технологиях.
  3. I. Экстремумы функции двух переменных
  4. II. Основные направления социально-медицинской работы с семьями детей ограниченными возможностями
  5. III. Лекционный материал по теме: ПРАВИЛА РАБОТЫ НА ЛЕКЦИИ
  6. IV. Функции
  7. IX. Лекционный материал: ОРГАНИЗАЦИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
  8. N В условиях интенсивной мышечной работы, при гипоксии (например, интенсивный бег на 200м в течении 30 с) распад углеводов временно протекает в анаэробных условиях
  9. N Выполняет функции гормона
  10. N Особенности структуры и функции обуславливают особенности в метаболизме клеток
  11. TCR. Функции Т-лимфоцитов
  12. VIII. Принципы работы вычислительной системы

Основные процедуры и функции:

Процедура: AssignFile(var Vf; FileName: string);Модуль: System

Описание: Процедура устанавливает ассоциативную связь между файловой переменной Vf и внешним файлом, имя которого определено параметром FileName. Все операции, производимые с файловой переменной, будут производиться со связанным с ней файлом. FileName — выражение типа string или PChar (если допускается расширенный синтаксис). Если в качестве имени файла указать пустую строку, то файловая переменная будет ассоциирована со стандартным файлом ввода (когда после AssignFile следует процедура Reset) или вывода (когда после следует процедура Rewrite).

Пример:
var Vf : file of Integer;
begin
.
AssignFile(Vf,'work.dat'); //инициализирует файловую переменную
Rewrite(Vf); //создает файл 'work.dat'
CloseFile(Vf); //закрывает файл
.
end;

Процедура: BlockRead(var Vf: file; var Buf; Count: Integer [;var AmtTransferred: Integer]); Модуль: System

Описание: Процедура читает одну или большее количество записей из открытого файла, связанного с файловой переменной Vf, в переменную Buf. Параметр Count определяет количество записей, которое необходимо прочитать из файла. В параметре AmtTransferred возвращается фактическое количество прочитанных записей, которое может быть меньше Count (например, когда размер последнего блока данных в файле меньше заданного размера записи). Максимальный размер прочитанного блока равен Count*RecSize байт. RecSize — размер записи, определенный, во время открытия файла (если размер записи не был задан, то используется значение по умолчанию — 128 байт). Параметр AmtTransferred является необязательным. Но если данный параметр опущен, а количество прочитанных записей меньше Count, то возникнет ошибка ввода/вывода (исключение EInOutError).

Пример:
var
Vf1, Vf2: file; NRead, NWrite: Integer;
Buf: array[1..1024] of Char;
begin
AssignFile(Vf1, 'read.txt');
Reset(Vf1, 1); //Устан-ет размер записи входного файла = 1
AssignFile(Vf2, 'write.txt');
Rewrite(Vf2, 1); //Устан-ет размер записи выходного файла = 1
repeat
BlockRead(Vf1, Buf, SizeOf(Buf), NRead); //читает данные
BlockWrite(Vf2, Buf, NRead, NWrite); //записывает данные
until (NRead = 0) or (NWrite <> NRead);
CloseFile(Vf1);
CloseFile(Vf2);
end;

Процедура: BlockWrite(var Vf: file; var Buf, Count: Integer [;var AmtTransferred: Integer]); Модуль: System

Описание: Процедура записывает одну или несколько записей из переменной Buf во внешний файл, связанный с файловой переменной Vf. Параметр Count определяет количество записей, которое необходимо записать в файл. В параметре AmtTransferred возвращается фактическое количество скопированных записей, которое может быть меньше Count (например, когда место на диске закончилось до окончания записи в файл). Максимальный размер записываемого блока равен Count*RecSize байт, где RecSize — размер записи, определенный, во время открытия файла или 128 байт, если размер записи не был определен. Параметр AmtTransferred является необязательным. Но если данный параметр опущен, и количество прочитанных записей будет меньше Count, то возникнет ошибка ввода/вывода (исключение EinOutError).

Пример:
var
Vf1, Vf2: file;
NRead, NWrite: Integer;
Buf: array[1..1024] of Char;
begin
AssignFile(Vf1, 'read.txt');
Reset(Vf1, 1); //Устан-ет размер записи входного файла = 1
AssignFile(Vf2, 'write.txt');
Rewrite(Vf2, 1); //Устан-ет размер записи выходного файла = 1
repeat
BlockRead(Vf1, Buf, SizeOf(Buf), NRead); //читает данные
BlockWrite(Vf2, Buf, NRead, NWrite); //записывает данные
until (NRead = 0) or (NWrite <> NRead);
CloseFile(Vf1);
CloseFile(Vf2);
end;

Процедура: CloseFile(var Vf); Модуль: System

Описание: Процедура разрывает ассоциативную связь между файловой переменной и внешним файлом, при этом, файл обновляется и закрывается. Механизм обработки ошибок ввода/вывода с помощью обработчиков исключений включается директивой компилятора <$I+>. При использовании директивы <$I->информацию об ошибках можно получить с помощью функции IOResult.

Пример:
var
Vf: file of Integer;
begin
.
AssignFile(Vf, 'work.dat'); //инициализирует файловую переменную
Rewrite(Vf); //создает файл 'work.dat'
CloseFile(Vf); //закрывает файл
.
end;

Процедура: Erase(Var Vf); Модуль: System

Описание: Удаляет файл, связанный с файловой переменной Vf. Vf — файловая переменная, ассоциированная с файлом любого типа. Перед удалением файл необходимо закрыть процедурой CloseFile.

Пример:
var
Vf: file;
begin
AssignFile(Vf, 'C:\WINDOWS\TEMP\tmpfile.tmp');
Rewrite(Vf); //создает временный файл 'tmpfile.tmp'
.
CloseFile(Vf); //закрывает файл
Erase(Vf); //удаляет файл
end;

Процедура: FindClose(var F: TSearchRec); Модуль: SysUtils

Описание: Процедура завершает последовательность вызовов функций FindFirst — FindNext и высвобождает память, выделенную при вызове функции FindFirst.

Процедура: Read(Vf, V1 [, V2, . Vn ]); Модуль: System

Описание: Процедура читает информацию из файла, ассоциированного с файловой переменной Vf, в переменную(ые) Vn.

Типизированные файлы. Читает запись (компонент) из файла в переменную. Файлы строкового типа. Читает все символы до маркера конца строки, не включая его или пока значение Eof(Vf) не будет равно True. Если размер прочитанной строки больше, чем размер строковой переменной, то строка усекается. После прочтения строки, каждый последующий вызов данной процедуры будет возвращать пустую строку, т.к. процедура Read не переводит указатель на новую строку. Если необходимо прочитать более одной записи из файла, то используйте процедуру ReadLn. Файлы символьного типа. Читает символ из файла. Если достигнут конец файла (т.е. Eof(Vf)=True), то процедура возвращает символ ‘Ctrl+Z’ (ASCII код 26).

Файлы целочисленных и действительных типов. Если тип переменной соответствует формату числовой строки, то переменной присваивается прочитанное значение, иначе возникает ошибка ввода/вывода.

Пример:
var
Vf1,Vf2: TextFile;
FileName1, FileName2: string;
C: Char;
begin
FileName1:='read.txt'; //подразумевается, что файл существует
FileName2:='write.txt';
AssignFile(Vf1, FileName1);
Reset(Vf1); //открывает файл 'read.txt'
AssignFile(Vf2, FileName2);
Rewrite(Vf2); //создает файл 'write.txt'
while not Eof(Vf1) do //повтор, пока не достигнут конец файла
begin
Read(Vf1, C); //читает символ из файла 'read.txt'
Write(Vf2, C); //записывает символ в файл 'write.txt'
end;
CloseFile(Vf2);
CloseFile(Vf1);
end;

Процедура: Rename(var Vf; NewName); Модуль: System

Описание: Процедура переименовывает файл, связанный с файловой переменной Vf. Новое имя файла указывается в параметре NewName. NewName — переменная типа string или PChar (если допускается расширенный синтаксис). После выполнения данной процедуры все операции c файловой переменной Vf будут производиться над переименованным файлом.

Процедура: Reset(var Vf: File [;RecSize: Word]); Модуль: System

Описание: Процедура открывает существующий файл и устанавливает указатель в начало файла. Vf — файловая переменная, ассоциированная с файлом любого типа при помощи процедуры AssignFile. RecSize — необязательный параметр, указывающий размер записи файла. Когда параметр RecSize опущен, размер записи принимается по умолчанию 128 байт. Если файл, связанный с файловой переменной Vf, не существует, то при вызове процедуры Reset возникнет ошибка. Если файл уже открыт, то при вызове данной процедуры он сначала закрывается, а затем снова открывается. Если с файловой переменной Vf связан текстовый файл, то он открывается только для чтения.

Процедура: Rewrite(var Vf: File [; Recsize: Word]); Модуль: System

Описание: Процедура создает новый файл и открывает его. Параметр Vf определяет файловую переменную, связанную с любым типом файлов при помощи процедуры AssignFile. RecSize — необязательный параметр, указывающий размер записи файла. Когда параметр RecSize опущен, размер записи принимается по умолчанию 128 байт. Если файл с заданным именем уже существует, то процедура удаляет старый файл и создает новый пустой файл. Если файл существует и открыт, то функция перед удалением старого файла сначала закрывает его. Если файловая переменная Vf связана с текстовым файлом, то он открывается только для записи. После вызова данной процедуры Eof(Vf)=True.

Процедура: Seek(var Vf; N: Longint); Модуль: System

Описание: Устанавливает файловый указатель в заданную позицию файла. Параметр Vf представляет собой файловую переменную, ассоциированную с типизированным или нетипизированным файлом. Для успешного выполнения процедуры файл должен быть открыт. Индекс позиции, в которую будет установлен указатель, определяется параметром N. Первая позиция в файле имеет индекс 0. Если необходимо добавить данные в конец файла, то поставить указатель в конец файла Vf можно следующим образом: Seek(Vf, FileSize(Vf)).

Процедура: Truncate(var Vf); Модуль: System

Описание: Процедура удаляет все записи в файле, находящиеся после текущей позиции (текущая позиция становится концом файла). Параметр Vf представляет собой файловую переменную, связанную с файлом любого типа, кроме текстовых (данная процедура не работает с текстовыми файлами). При вызове процедуры файл должен быть открыт.

Процедура: Write(Vf, V1. Vn); (для типизированных файлов) Модуль: System

Описание: Процедура записывает данные в типизированный файл. Параметр Vf представляет собой файловую переменную, связанную с типизированным файлом. Тип переменных V1 . Vn должен соответствовать типу фала. При записи в файл очередного компонента, указатель текущей позиции файла передвигается на следующий компонент. Если перед вызовом данной процедуры указатель стоит в конце файла (Eof(Vf)=True), то записываемые данные будут добавлены в конец файла (размер файла соответственно увеличится).

Функция: DeleteFile(const FileName: string): Boolean; Модуль: SysUtils

Описание: Функция удаляет файл с диска. При успешном выполнении возвращает True, а если файл не существует, или не может быть удален, то — False.

Пример:
var
FileName: string;
begin
.
if DeleteFile(FileName) then
MessageDlg('Файла успешно удален', mtInformation, [mbOk], 0)
else
MessageDlg('Ошибка удаления файла', mtInformation, [mbOk], 0);
.
end;

Функция: DiskFree(Drive: Byte): Int64; Модуль: SysUtils

Описание: Функция возвращает количество свободного места на диске, указанном в параметре Drive, в байтах. Диск определяется следующим образом: 0 — текущий, 1 — ‘A’, 2 — ‘B’, 3 — ‘С’, и т.д. Если указанный диск не существует, или недоступен, то функция возвращает -1.

Функция: DiskSize(Drive: Byte): Int64; Модуль: SysUtils

Описание: Функция возвращает размер диска Drive в байтах. Диск определяется следующим образом: 0 — текущий, 1 — ‘A’, 2 — ‘B’, 3 — ‘С’, и т.д. Если указанный диск не существует, или недоступен, то функция возвращает -1.

Функция: Eof(var Vf ): Boolean; Модуль: System

Описание: Функция определяет, стоит ли указатель текущей позиции в конце файла Vf (Vf — файловая переменная). Если указатель стоит на последнем символе файла, или файл не содержит данных, то функция возвращает True, а иначе — False.

Пример:
var
Vf1,Vf2: TextFile;
FileName1, FileName2: string;
C: Char;
begin
FileName1:='read.txt'; //подразумевается, что файл существует
FileName2:='write.txt';
AssignFile(Vf1, FileName1);
Reset(Vf1); //открывает файл 'read.txt'
AssignFile(Vf2, FileName2);
Rewrite(Vf2); //создает файл 'write.txt'
while not Eof(Vf1) do //повтор, пока не достигнут конец файла
begin
Read(Vf1, C); //читает символ из файла 'read.txt'
Write(Vf2, C); //записывает символ в файл 'write.txt'
end;
CloseFile(Vf2);
CloseFile(Vf1);
end;

Функция: FileExists(const FileName: string): Boolean; Модуль: SysUtils

Описание: Функция проверяет, существует ли файл с именем FileName. Если файл существует, то функция возвращает True, иначе — False.

Функция: FileGetAttr(const FileName: string): Integer; Модуль: SysUtils

Описание: Функция возвращает атрибуты файла, имя которого передано в параметре FileName. Атрибуты могут быть разделены с помощью оператора AND и следующих значений констант атрибутов:

Константа Значение Описание
faReadOnly faHidden faSysFile faVolumeID faDirectory faArchive faAnyFile $00000001 $00000002 $00000004 $00000008 $00000010 $00000020 $00000003F Только чтение Скрытый файл Системный файл Идентификатор тома Каталог Архивный файл Произвольный файл

В случае возникновении ошибки функция возвращает -1.

Функция: FilePos(var Vf): LongInt; Модуль: System

Описание: Функция возвращает текущую позицию указателя в файле (файл должен быть предварительно открыт). Параметр Vf представляет собой файловую переменную, ассоциированную с файлом. Данная функция не может быть применена к текстовым файлам.

Пример:
var
Vf: File of Byte;
S : string;
Size, I: Integer;
begin
Randomize; AssignFile(Vf, 'work.dat');
Rewrite(Vf); //создает файл work.dat
for I:= 0 to 100 do
begin
Seek(Vf, I);
Write(Vf, I); //записывает в файл послед. чисел от 1 до 100
end;
Size:= FileSize(Vf); //определяет размер файла
Seek(Vf, random(Size)); //устанавливает указатель в произвольную позицию
MessageDlg('Позиция указателя: ' + IntToStr(FilePos(Vf)), mtInformation, [mbOk], 0);
.
CloseFile(Vf);
end;

Функция: FileSearch(const FileName, DirList: string): string; Модуль: SysUtils

Описание: Функция осуществляет поиск файла FileName в каталогах, указанных в параметре DirList. Имя файла должно быть представлено в DOS-формате. Список каталогов DirList представляет собой строку, содержащую наименования каталогов, разделенных точками с запятой (например, ‘C:\;C:\WINDOWS; C:\WINDOWS\TEMP’). Если файл найден, то функция возвращает полный путь к файлу, а иначе возвращается пустая строка.

Функция: FileSetAttr(const FileName: string): Integer; Модуль: SysUtils

Описание: Функция устанавливает атрибуты файла, имя которого передано в параметре FileName. Атрибуты перечисляются в параметре Attr с помощью оператора OR. В случае успешного выполнения функция возвращает 0, а иначе возвращается код ошибки Windows.
Значение констант атрибутов:

Константа Значение Описание
faReadOnly faHidden faSysFile faVolumeID faDirectory faArchive faAnyFile $00000001 $00000002 $00000004 $00000008 $00000010 $00000020 $00000003F Только чтение Скрытый файл Системный файл Идентификатор тома Каталог Архивный файл Произвольный файл

Пример:для файла устанавливаются атрибуты ‘Скрытый файл’ и ‘Только чтение’.
FileSetAttr('MyFile.zzz', faReadOnly or faHidden);

Функция: FileSize(var Vf): Integer; Модуль: System

Описание: Функция возвращает размер файла, связанного с файловой переменной Vf в байтах. Для файлов типа Record функция возвращает количество записей. Если файл не содержит данных, то функция возвращает 0. Файл должен быть обязательно открыт. Данная функция не применима к текстовым файлам.

Описание: Функция находит файл с набором атрибутов Attr в каталоге и по маске, определенных константой Path. Найденное имя файла записывается в переменную F. Если указанный файл найден, то функция возвращает 0, иначе возвращается код ошибки Windows. Параметр Attr — комбинация нескольких констант атрибутов файла или их значений. Константа Path представляет собой полный путь с маской файла (например, ‘C:\MYDIR\*.ini’ ). Повторный поиск файла производится с помощью функции FindNext. По окончанию поиска необходимо высвободить память, выделенную при вызове функции FindFirst, с помощью процедуры FindClose. Значение констант атрибутов:

Константа Значение Описание
faReadOnly faHidden faSysFile faVolumeID faDirectory faArchive faAnyFile $00000001 $00000002 $00000004 $00000008 $00000010 $00000020 $00000003F Только чтение Скрытый файл Системный файл Идентификатор тома Каталог Архивный файл Произвольный файл

Описание: Функция используется в цепочке FindFirst - FindNext - FindClose для повторного поиска файла. Первый поиск осуществляется с помощью функции FindFirst. Функция FindNext возвращает следующий найденный файл, удовлетворяющий условиям поиска определенным при вызове функции FindFirst. В случае успешного выполнения, функция FindNext возвращает 0, а в случае возникновения ошибки — код ошибки Windows. По окончанию поиска необходимо высвободить память с помощью функции FindClose.

Функция: IOResult: Integer; Модуль: System

Описание: Функция возвращает статус ошибки последней выполненной операции ввода/вывода. Использование данной функции возможно только при отключенной проверке ошибок директивой компилятора <$I->. При возникновении ошибки ввода/вывода, все последующие операции ввода/вывода будут игнорироваться до тех пор, пока не будет сделано обращение к функции IOResult. Вызов IOResult очищает внутренний флаг ошибки. Альтернативным способом обработки ошибок ввода/вывода является использование механизма обработки исключительных ситуаций, который включается директивой компилятора <$I+>.

Функция: RenameFile(const OldName, NewName: string): Boolean; Модуль: SysUtils

Описание: Функция переименовывает файл OldName в NewName. При успешном выполнении возвращает True, а в случае ошибки False.

Пример:
begin
if RenameFile('OLD.TXT', 'NEW.TXT') then
MessageDlg(Файл переименован!', mtInformation, [mbOk], 0)
else
ErrorMsg('Невозможно переименовать файл!');
end;

| следующая лекция ==>
Современные способы и средства тушения пожаров | Работа с текстовыми файлами

Дата добавления: 2014-01-07 ; Просмотров: 883 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Использование процедур и функций в Delphi

Скобки

Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.

Возможность перегрузки

Впервые концепция перегрузки процедур и функций была реализована в Delphi 4. Она позволяет иметь несколько различных процедур и функций с одинаковыми именами, но с разными списками параметров. Такие процедуры и функции должны быть описаны с применением директивы overload.

procedure Test (I: integer); overload;
procedure Test (S: string); overload;
procedure Test (D: double); overload;

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

Передача параметров

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

Передача параметров по значению

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

procedure Test(s: string);

При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже.

Передача параметров по ссылке

Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции.

procedure ChangeMe(var x: longint);
begin
x := 2; // Параметр х изменен вызванной процедурой
end;

Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

Передача параметров констант

Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметра-константы:

procedure Test(const s: string );

Передача открытых массивов

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

function AddEmUp(A: array of integer): integer;

В открытом массиве можно передавать переменные, константы или выражения из констант.

Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf.

Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

procedure WhatHaveIGot( A: array of const );

Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

procedure WhatHaveIGot( [‘Text’, 10, 5.5, @WhatHaveIGot, 3.14, true, ‘c’] );

При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

PVarRec = ^TVarRec;
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений.

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

procedure WhatHaveIGot( A: array of const );
var
i: integer;
TypeStr: string;
begin
for i := Low(A) to High(A) do
begin
case A[i].VType of
vtInteger : TypeStr := ‘Integer’;
vtBoolean : TypeStr := ‘Boolean’;
vtChar : TypeStr := ‘Char’;
vtExtended : TypeStr := ‘Extended’;
vtString : TypeStr := ‘String’;
vtPointer : TypeStr := ‘Pointer’;
vtPChar : TypeStr := ‘PChar’;
vtObject : TypeStr := ‘Object’;
vt ;
vtW ;
vtPW ;
vtAnsiString : TypeStr := ‘AnsiString’;
vtCurrency : TypeStr := ‘Currency’;
vtVariant : TypeStr := ‘Variant’;
vtInterface : TypeStr := ‘Interface’;
vtW ;
vtInt64 : TypeStr := ‘Int64’;
end;
ShowMessage( Format( ‘Array item %d is a %s’, [i, TypeStr] ) );
end;
end;

Значения параметров по умолчанию

В Delphi есть одна очень полезная возможность — использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:

procedure HasDefVal( s: string; i: integer = 0 );

Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров:

procedure HasDefVal( ‘Hello’, 26 );

Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:

procedure HasDefVal( ‘Hello’ );

При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах:

  • Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию.
  • Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам.
  • Значение по умолчанию может передаваться только по значению либо с модификатором const. Оно не может быть ссылкой или нетипизированным параметром.

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

function Add( I1, I2: integer ): integer;
begin
Result := I1 + I2;
end;

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

function Add( I1, I2: integer; I3: integer = 0 ): integer;
begin
Result := I1 + I2 + I3;
end;

Директива

Директива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен (<$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->.

В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.

Процедура и функция — это ключевые понятия в любом языке программирования, без которых не обходится ни одна серьезная программа. И поэтому очень важно иметь полное понимание о механизме их работы.

Илон Маск рекомендует:  Что такое код sin sinh
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL