ChDir — Процедура Delphi
GetDir( 0, FSetup.PathProgram);
ChDir(FSetup.PathProgram+’\dbf\’);
GetDir( 0, FSetup.PathProgram);
dm.DsSp.DataSet:=dm.QSp;
If FileExists(fsetup.EditZatr.text+’dbf\str_podr.dbf’) Then
begin
//������ �������
with dm.QSP do
begin
DatabaseName:=’Zat1c’;
Close;
SQL.Clear;
SQL.Add(‘SELECT * FROM str_podr.dbf’);
SQL.Add(‘ORDER BY CODE,NAME’);
//ShowMessage(dm.QSp.SQL.Text);
Open;
end; //with
DBLookupComboboxEh1.ListSource:=dm.DsSp;
DBLookupComboboxEh1.ListField:=’NAME’;
DBLookupComboboxEh1.KeyField:=’CODE’;
DBLookupComboboxEh1.Text:=’01’;
end
else
begin
ShowMessage(‘��� ����� ����������� ����������� ������������� !’);
exit;
FSetup.ModalResult:=1;
end;
Scio me nihil scire
>
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 09:44����[945596] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 10:53����[945935] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 11:01����[945987] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 11:05����[946020] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 11:09����[946045] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 13:19����[946814] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] |
9 ��� 04, 13:42����[946974] �������� | ���������� �������� ���������� |
Re: ������� ������� ������� CHDIR [new] | |||||||||||||||||||||||||
Процедура: Erase(Var Vf); Модуль: System Описание: Удаляет файл, связанный с файловой переменной Vf. Vf — файловая переменная, ассоциированная с файлом любого типа. Перед удалением файл необходимо закрыть процедурой CloseFile. Пример: Процедура: 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). Файлы целочисленных и действительных типов. Если тип переменной соответствует формату числовой строки, то переменной присваивается прочитанное значение, иначе возникает ошибка ввода/вывода. Пример: Процедура: 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. Пример: Функция: 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. Пример: Функция: FileExists(const FileName: string): Boolean; Модуль: SysUtils Описание: Функция проверяет, существует ли файл с именем FileName. Если файл существует, то функция возвращает True, иначе — False. Функция: FileGetAttr(const FileName: string): Integer; Модуль: SysUtils Описание: Функция возвращает атрибуты файла, имя которого передано в параметре FileName. Атрибуты могут быть разделены с помощью оператора AND и следующих значений констант атрибутов:
В случае возникновении ошибки функция возвращает -1. Функция: FilePos(var Vf): LongInt; Модуль: System Описание: Функция возвращает текущую позицию указателя в файле (файл должен быть предварительно открыт). Параметр Vf представляет собой файловую переменную, ассоциированную с файлом. Данная функция не может быть применена к текстовым файлам. Пример: Функция: 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.
Пример:для файла устанавливаются атрибуты ‘Скрытый файл’ и ‘Только чтение’. Функция: FileSize(var Vf): Integer; Модуль: System Описание: Функция возвращает размер файла, связанного с файловой переменной Vf в байтах. Для файлов типа Record функция возвращает количество записей. Если файл не содержит данных, то функция возвращает 0. Файл должен быть обязательно открыт. Данная функция не применима к текстовым файлам. Описание: Функция находит файл с набором атрибутов Attr в каталоге и по маске, определенных константой Path. Найденное имя файла записывается в переменную F. Если указанный файл найден, то функция возвращает 0, иначе возвращается код ошибки Windows. Параметр Attr — комбинация нескольких констант атрибутов файла или их значений. Константа Path представляет собой полный путь с маской файла (например, ‘C:\MYDIR\*.ini’ ). Повторный поиск файла производится с помощью функции FindNext. По окончанию поиска необходимо высвободить память, выделенную при вызове функции FindFirst, с помощью процедуры FindClose. Значение констант атрибутов:
Описание: Функция используется в цепочке 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. Пример:
Дата добавления: 2014-01-07 ; Просмотров: 867 ; Нарушение авторских прав? ; Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет Условная компиляция в DelphiУсловная компиляция в Delphi, по сути, очень полезная и удобная возможность, которая позволяет Delphi компилировать или не компилировать код в зависимости от определенных символов условной компиляции. Говоря более простым языком (возможно и не совсем корректно), условная компиляция позволяет убрать или, наоборот, добавить часть кода исполняемого файла. Так или иначе, любой Delphi разработчик встречается с символами условной компиляции как минимум один раз за время работы над проектом. Далее я рассмотрю различные примеры использования условной компиляции, которые могут Вам пригодиться в дальнейшей работе. Для начала, рассмотрим очень простой код, который вы можете повторить в Delphi за несколько секунд: Теперь нажмите F9 и проверьте, что написано в отладчике в «Events»: Разберемся с тем, что мы только что написали. $IFDEF — это директива компилятора; DEBUG — условное определение или символ условной компиляции. Символ обязательно должен начинаться с буквы за которой может следовать любое количество букв, цифр и знаков подчеркивания, однако использоваться будут лишь первые 255 символов. Процедура отправляет строку в отладчик для отображения. Завершает условную компиляцию, инициированную последней директивой <$IFxxx>(почему не <$IFDEF>— смотрим далее). Таким образом, используя директивы и мы указали компилятору дословно следующее: если где-либо по ходу компиляции был встречено условное определение DEBUG, то надо выполнить OutputDebugString. Где определено условное определение DEBUG? Конкретно в этом случае, символ DEBUG можно найти, если зайти в настройки проекта: Project -> Options ->Delphi Compiler : Здесь же можно определить и свои собственные символы. Давайте, например, добавим свой символ условной компиляции TEST. Для этого открываем диалоговое окно редактирования символов условной компиляции (жмем кнопку «…» в строке «Conditional defines») и заносим наш символ в список: Теперь изменим наш код, приведенный в начале статьи, чтобы он работал с нашим символом условной компиляции: Теперь можете снова запустить приложения в режиме отладки и посмотреть, что в Events появится строка «TEST IS ON». Сейчас мы с вами рассмотрели самый простой способ использования условной компиляции в Delphi — использование директив и , а также определение собственного символа условной компиляции через свойства проекта. Вместе с этим, определить (включить) свой символ условной компиляции можно и в коде программы. Для этого используется директива компилятора . Воспользуемся этой директивой: Соответственно, если есть директива определения нового символа, то должна быть и директива, которая отключает символы условной компиляции — она называется . Можете написать, например, вот такой код: и убедиться, что символ DEBUG выключен, а в окне Events не появится строка «debug is on». Двигаемся далее. Что делать, если нам необходимо вывести строку не когда символ включен, а именно тогда, когда он выключен? Здесь, опять же, есть варианты. Короткий вариант — воспользоваться директивой противоположной — она называется и код между и выполняется, если символ выключен: Второй вариант — использование директивы , если в зависимости от состояния символа условной компиляции вам надо выполнять различные участки кода: Соответственно, нет необходимости далее повторять этот же участок кода с использованием — работать будет, но прямо противоположно. Также следует обратить внимание на то, что все условные символы оцениваются в Delphi, когда вы выполняете Build проекта. Справка Delphi рекомендует для надежности пользоваться командой Project -> Build All Projects, чтобы быть уверенным, что все символы условной компиляции определены верно. В Delphi также определен набор символов условной компиляции, которые вы можете использовать при работе над своим проектом. Например, символ условной компиляции VER330 определен для Delphi 10.3 Rio и с его помощью можно определить какой код должен или не должен выполняться, в случае, если версия компилятора Delphi — 33. Например, воспользуемся фичей Delphi 10.3 Rio под названием Inline Variable Declaration: Сразу может возникнуть вопрос: как сделать так, чтобы приведенный выше код сработал не только в Delphi 10.3 Rio, но и в последующих версиях? Здесь мы уже воспользовались директивой с помощью которой проверили значение константы CompilerVersion, которая находится в модуле System. Здесь же стоит обратить внимание и на окончание блока — мы использовали директиву , как того требовала Delphi до версии Delphi XE4:
В XE4 нам разрешили использовать для закрытия блоков <$IF>, и . Однако, если у вас возникают проблемы при использовании связки и , то вы можете использовать специальную директиву , чтобы потребовать использовать для именно <$IFEND>: Теперь, если в коде выше использовать директиву $ENDIF, то получим сообщение об ошибке: Директиву , кстати, можно использовать и с другими константами проекта, например, так: Так как наша константа Version содержит значение 2, то выполнится участок кода расположенный после . Можете сменить значение константы Version на 1, чтобы убедиться, что выполнится участок кода, где определена переменная s. Как я сказал выше, в Delphi есть целый набор предопределенных символов условной компиляции. Ознакомиться со всеми этими символами вы можете на этой странице справки по Delphi.
При подготовке статьи использовалась следующая информация официальной справки по Delphi: Использование процедур и функций в DelphiСкобкиДобавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными. Возможность перегрузкиВпервые концепция перегрузки процедур и функций была реализована в Delphi 4. Она позволяет иметь несколько различных процедур и функций с одинаковыми именами, но с разными списками параметров. Такие процедуры и функции должны быть описаны с применением директивы overload. procedure Test (I: integer); overload; При вызове процедуры Test, Delphi сама решит, какую из трех процедур необходимо выполнить, в зависимости от передаваемого ей параметра. Но нужно отметить, что это не самая безопасная возможность языка. Применение перегружаемых процедур и функций может стать неиссякаемым источником трудноуловимых ошибок в программе. Поэтому пользуйтесь этой возможностью осторожно. Передача параметровPascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется. Передача параметров по значениюЭтот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример: procedure Test(s: string); При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s. Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже. Передача параметров по ссылкеPascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции. procedure ChangeMe(var x: longint); Вместо создания копии переменной 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; Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений. Поскольку массив констант способен передавать данные разных типов, это может вызвать определенные затруднения при создании обрабатывающей полученные параметры функции или процедуры. В качестве примера работы с таким массивом рассмотрим реализацию процедуры WhatHaveIGot, которая просматривает элементы полученного массива параметров и выводит их тип. procedure WhatHaveIGot( A: array of const ); Значения параметров по умолчаниюВ Delphi есть одна очень полезная возможность — использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере: procedure HasDefVal( s: string; i: integer = 0 ); Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров: procedure HasDefVal( ‘Hello’, 26 ); Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию: procedure HasDefVal( ‘Hello’ ); При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах:
Одним из важных преимуществ применения значений параметров по умолчанию является простота расширения функциональных возможностей уже имеющихся процедур и функции с соблюдением обратной совместимости. Предположим, на рынок программных продуктов была выпущена программа, ключевым звеном которой является функция сложения двух целых величин: function Add( I1, I2: integer ): integer; Предположим также, что исследования показали целесообразность добавления в программу возможности сложения трех чисел. Однако замена имеющейся функции функцией сложения трех чисел приведет к тому, что вам придется переправлять немало текста, который перестанет компилироваться из-за внесения в функцию еще одного параметра. Однако при использовании значений параметров по умолчанию проблема решается легко и просто. Достаточно изменить объявление функции так, как показано ниже. function Add( I1, I2: integer; I3: integer = 0 ): integer; ДирективаДиректива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен (<$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->. В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции. Процедура и функция — это ключевые понятия в любом языке программирования, без которых не обходится ни одна серьезная программа. И поэтому очень важно иметь полное понимание о механизме их работы. Процедуры DelphiПродолжаем изучать основы основ, сегодня мы рассмотрим процедуры Delphi . Процедуры и функции Делфи очень похожи между собой. Разница заключается в том, что процедура по выполнению не возвращает никакого значения. Итак, обо все по порядку. Начнем с определения: Процедура Delphi – группа операторов объединенных вместе под одним именем. Из чего состоит процедура?
Приведу пример процедуры: Этот простейший Del p hi код принимает целочисленное значение. Если это значение равно 1, 2 или 5, то выводим соответствующее сообщение. Иначе сообщаем, что введенное число не равно ни одному из списка. Рассмотрим как нам это использовать. Создайте новый проект и разместите на нем всего одну кнопку. По клику на неё будем вызывать MyProc c параметром 5 : Код программы целиком у меня получился такой: Теперь в двух словах расскажу для чего нужны процедуры Делфи и какие плюсы от их использования. Если мы часто повторяющиеся фрагменты кода выделим в процедуру и дадим ей информативное имя – получим следующие преимущества:
Я рекомендую Вам использовать процедуры Delphi. ChDir — Процедура DelphiТеперь рассмотрим две самые распространенные операции, выполняемые при работе с файлами. Это чтение и запись. Для их осуществления применяются специальные функции файлового ввода/вывода. Итак, для выполнения операции чтения или записи необходимо произвести следующие действия: 1. Объявить файловую переменную необходимого типа. 2. При помощи функции AssignFile связать эту переменную с требуемым файлом. 3. Открыть файл при помощи функций Append, Reset, Rewrite. 4. Выполнить операции чтения или записи. При этом, в зависимости от сложности задачи и структуры данных, может использоваться целый ряд вспомогательных функций. 5. Закрыть файл при помощи функции CloseFile .
В качестве примера рассмотрим небольшой фрагмент исходного кода. then AssignFiie(F, OpenDlg.FileName) else Exit; Reset(F); while Not EOF(F) do Если в диалоге открытия файла OpenDlg был выбран файл, то его имя связывается с файловой переменной F при помощи процедуры AssignFiie . В качестве имени файла рекомендуется всегда передавать полное имя файла (включая его маршрут). Как раз в таком виде возвращают результат выбора файла диалоги работы с файлами TOpenDialog, TOpenPictureDiaiog . Затем при помощи процедуры Reset этот файл открывается для чтения и записи. В цикле выполняется чтение из файла текстовых строк и запись их в компонент TMemo . Процедура Readin осуществляет чтение текущей строки файла и переходит на следующую строку. Цикл выполняется, пока функция EOF не сообщит о достижении конца файла. После завершения чтения файл закрывается. Такой же исходный код можно использовать и для записи данных в файл. Необходимо только заменить процедуру чтения на процедуру записи. Теперь остановимся подробнее на назначении используемых для файлового ввода/вывода функций. Открытие файла может осуществляться тремя процедурами — в зависимости от типа его дальнейшего использования.
открывает существующий файл для чтения и записи, текущая позиция устанавливается на первой строке файла. открывает файл для записи информации после его последней строки, текущая позиция устанавливается на конец файла.
создает новый файл и открывает его, текущая позиция устанавливается в начало файла. Если файл с таким именем уже существует, то он перезаписывается. Переменная RecSize используется только при работе с нетипизированными файлами и определяет размер одной записи для операции передачи данных. Если этот параметр опущен, то по умолчанию RecSize равно 128 байт. Чтение данных из типизированных и текстовых файлов выполняют процедуры Read И Readin. Процедура Read имеет различное объявление для текстовых и других типизированных файлов:
При одном вызове процедуры можно читать данные в произвольное число переменных. Естественно, что тип переменных должен совпадать с типом файла. При чтении в очередную переменную читается ровно столько байтов из файла, сколько занимает тип данных. В следующую переменную читается столько же байтов, расположенных следом. После выполнения процедуры текущая позиция устанавливается на первом непрочитанном байте. Аналогично работают несколько процедур Read для одной переменной, выполненных подряд.
считывает одну строку текстового файла и устанавливает текущую позицию на следующей строке. Если использовать процедуру без переменных vi. .vn, то она просто передвигает текущую позицию на очередную строку файла. Процедуры для записи в файл write и writein описаны аналогично:
Параметры P1, P2, . Pn могут быть одним из целых или вещественных типов, одним из строковых типов или логическим типом. Но у них есть возможность дополнительного форматирования при выводе. Каждый параметр записи может иметь форму: Р n — выводимая переменная или выражение; MinWidth — минимальная ширина поля в символах, которая должна быть больше 0; DecPlaces — содержит количество десятичных символов после запятой при отображении вещественных чисел с фиксированной точкой. Обратите внимание, что для текстовых файлов в функциях Read и write файловая переменная F может быть опущена. В этом случае чтение и запись осуществляются в стандартные файлы ввода/вывода. Когда программа компилируется как консольное приложение (флаг <$APPTYPE CONSOLE>), Delphi автоматически связывает входной и выходной файлы с окном консоли. Для контроля за текущей позицией в файле применяются две основные функции. Функция EOF (F) возвращает значение True , если достигнут конец файла. Функция EOLN(F) аналогично сигнализирует о достижении конца строки. Естественно, в качестве параметра в функции необходимо передавать файловую переменную. обеспечивает смещение текущей позиции на N элементов. Размер одного элемента в байтах зависит от типа данных файла (от типизированной переменной). Рассмотрим теперь режим блочного ввода/вывода данных между файлом и областью адресного пространства (буфером). Этот режим отличается значительной скоростью передачи данных, причем скорость пропорциональна размеру одного передаваемого блока — чем больше блок, тем больше скорость. Для реализации этого режима необходимо использовать только нетипизированные файловые переменные. Размер блока определяется в процедуре открытия файла ( Reset, Rewrite ). Непосредственно для выполнения операций используются процедуры BlockRead и BlockWrite .
[; var AmtTransferred: Integer]); выполняет запись блока из файла в буфер. Параметр F ссылается на нетипизированную файловую переменную, связанную с нужным файлом. Параметр Buf определяет любую переменную (число, строку, массив, структуру), в которую читаются байты из файла. Параметр Count содержит число считываемых блоков. Наконец, необязательный параметр AmtTransferred возвращает число реально считанных блоков. При использовании блочного чтения или записи размер блока необходимо выбирать таким образом, чтобы он был кратен размеру одного значения того типа, который хранится в файле. Например, если в файле хранятся значения типа Double (8 байт), то размер блока может быть равен 8, 16, 24, 32 и т. д. Фрагмент исходного кода блочного чтения при этом выглядит следующим образом: DoubleArray: array [0..255] of Double; if OpenDlg.Execute then AssignFile(F, OpenDlg.FileName) else Exit; BlockRead(F, DoubleArray, 32, Transferee!); ShowMessage(‘Считано ‘+IntToStr(Transfered)+’ блоков’); Как видно из примера, размер блока установлен в процедуре Reset и кратен размеру элемента массива DoubleArray , в который считываются данные. В переменной Transfered возвращается число считанных блоков. Если размер файла меньше заданного в процедуре BlockRead числа блоков, ошибка не возникает, а в переменной Transfered передается число реально считанных блоков.
[; var AmtTransferred: Integer]); Оставшиеся функции ввода/вывода, работающие с файловыми переменными, подробно описаны в табл. 9.1. Таблица 9.1. Процедуры и функции для работы с файлом function ChangeFileExt (const FileName, Extension: string): string; Функция позволяет изменить расширение файла. При этом сам файл не переименовывается procedure ChDir(S: string); Процедура изменяет текущий каталог на другой, путь к которому описан в строке s procedure CloseFile (var F) ; Вызов процедуры разрывает связь между файловой переменной и файлом на диске. Имя этой процедуры изменено из-за конфликта имен в Delphi (в Borland Pascal используется процедура Close ) function DeleteFile (const FileName: string): Boolean; Функция производит удаление файла FileName с диска и возвращает значение False , если файл удалить не удалось или файл не существует function ExtractFileExt (const FileName: string): string; Функция возвращает расширение файла function ExtractFileName (const FileName: string) : string; Извлекает имя и расширение файла, содержащегося в параметре FileName function ExtractFilePath( const FileName: string): string; Функция возвращает полный путь к файлу procedure Erase (var F); Удаляет файл, связанный с файловой переменной F function FileSearch (const Name, DirList: string) : string; Данная процедура производит поиск в каталогах DirList файла Name . Если в процессе выполнения FileSearch обнаруживается искомое имя файла, то функция возвращает в строке типа string полный путь к найденному файлу. Если файл не найден, то возвращается пустая строка function FileSetAttr (const FileName: string; Attr: Integer): Integer; Присваивает файлу с именем FileName атрибуты Attr. Функция возвращает 0, если присвоение атрибутов прошло успешно. В противном случае возвращается код ошибки function FilePos (var F): Longint; Возвращает текущую позицию файла. Функция используется для нетекстовых файлов. Перед вызовом FilePos файл должен быть открыт function FileSize (var F): Integer; FileSize возвращает размер файла в байтах или количество записей в файле, содержащем записи. Перед вызовом данной функции файл должен быть открыт. Для текстовых файлов функция FileSize не используется procedure Flush (var F: Text); Процедура очищает буфер текстового файла, открытого для записи. F— файловая переменная. Когда текстовый файл открыт для записи с использованием функции Rewrite или Append, Flush очищает выходной буфер, связанный с файлом. После выполнения данной процедуры все символы, которые направлены для записи в файл, будут гарантированно записаны в нем procedure GetDir(D: Byte; var S: string); Возвращает число, соответствующее диску, на котором содержится текущий каталог s. о может принимать одно из следующих значений: 0 — по умолчанию (текущий); Процедура не генерирует код ошибки. Если имя диска в D оказывается ошибочным, то в строке S возвращается значение Х:\, как если бы текущая папка была на этом ошибочно указанном диске function lOResult: Integer; Функция возвращает статус последней произведенной операции ввода/вывода, если контроль ошибок выключен procedure MkDir(S: string); Процедура создает новый каталог, который описывается в строке S procedure Rename (var F; NewName: string) ; Процедура изменяет имя файла, связанного с файловой переменной F. Переменная NewName является строкой типа string или PChar (если включена поддержка расширенного синтаксиса) procedure RmDir(S: string); Процедура удаляет пустой каталог, путь к которому задается в строке S. Если указанный каталог не существует или он не пустой, то возникает сообщение об ошибке ввода/вывода procedure Seek (var F; N: Longint) ; Перемещает текущую позицию курсора на N позиций. Данная процедура используется только для открытых типизированных или нетипизированных файлов для проведения чтения/записи с нужной позиции файла. Началу файла соответствует нулевой номер позиции. Для добавления новой информации в конец существующего файла необходимо установить указатель на символ, следующий за последним. Для этого можно использовать выражение Seek (F, FileSize(F)) function SeekEof[(var F: Text) ] : Boolean; Возвращает значение True , если указатель текущей позиции находится на символе конца файла. SeekEof может быть использован только с открытым текстовым файлом function SeekEoln[ (var F: Text) ] : Boolean; Возвращает значение True , если указатель текущей позиции находится на символе конца строки. SeekEoln может быть использован только с открытым текстовым файлом procedure SetTextBuf (var F: Text; var Buf [; Size: Integer] ); Связывает с текстовым файлом буфер ввода/вывода. F — файловая переменная текстового типа. Каждая файловая переменная текстового типа имеет внутренний буфер емкостью 128 байт, в котором накапливаются данные при чтении и записи. Такой буфер пригоден для большинства операций. Однако при выполнении программ с интенсивным вводом/выводом буфер может переполниться, что приведет к записи операций ввода/вывода на диск и, как следствие, к существенному замедлению работы приложения. SetTextBuf позволяет помещать в текстовый файл F информацию об операциях ввода/вывода вместо ее размещения в буфере. Size указывает размер буфера в байтах. Если этот параметр опускается, то полагается размер, равный SizeOf (Buf). Новый буфер действует до тех пор, пока F не будет связана с новым файлом процедурой AssignFile Удаляет все позиции, следующие после текущей позиции в файле. А текущая позиция становится концом файла. С переменной F может быть связан файл любого типа за исключением текстового
интервью Раввина Борода https://cursorinfo.co.il/all-news/rav. [b]Мой комментарий: [center][Youtube]CLegyQkMkyw[/Youtube][/center] Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ): Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором) [center][b]Сон разума народа России [/center] [center][Youtube]CLegyQkMkyw[/Youtube][/center] Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ): Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором) [center][b]Сон разума народа России [/center] Файловые функции DELPHI. Файловые операции средствами ShellApi.В Delphi существует понятие — подпрограммы управления файлами ( category File management routines). Процедуры и функции входящие в эту категорию находятся в модулях System, SysUtils (каталог Source\Rtl\Sys) и FileCtrl (каталог Source\Vcl). Модуль FileCtrl содержит только две функции из категории подпрограмм управления файлами — это DirectoryExists и ForceDirectories. Местонахождение остальных процедур и функций определяется следующим образом. Если в подпрограмме используется файловая переменная, то она входит в модуль System. Если дескриптор или имя файла в виде строки, то в модуль SysUtils. Правда есть исключения (интуитивно понятные) ChDir входит в System. Также в System входят MkDir, RmDir из категории ввода/вывода ( I/O routines). Надо отметить, что все подпрограммы, отнесенные к категориям ввода/вывода и текстовых файлов ( Text file routines) находятся в модуле System (исключая процедуру AssignPrn входящую в модуль Printers каталог Source\Vcl). Вот список подпрограмм отсортирован по категориям и по алфавиту. File management routines — подпрограммы управления файлами S ystem procedure AssignFile(var F; FileName: string); Связывает файловую переменную с именем файла I/O routines — подпрограммы ввода/вывода Модуль Подпрограмма Text file routines — подпрограммы текстовых файлов Модуль Подпрограмма Проверяем наличие файла и записываем его procedure NAME; Перепишем файл a.dat в файл b.dat, удалив признаки конца файла: Proedure MyWrite; Файл записей. Пишем и читаем любую: Procedure MyBook; Файловые операции средствами ShellAPI.
Автор: Владимир ТатарчевскийРассмотрим применение функции SHFileOperation. Функция имеет единственный аргумент — структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные. Эта структура выглядит следующим образом: _SHFILEOPSTRUCTA = packed record Поля структуры имеют следующее назначение: FO_COPY Копирует файлы, указанные в pFrom в папку, указанную в pTo. pTo — аналогично pFrom, но содержит путь к директории — адресату, в которую производится копирование или перемещение файлов. Также может fFlags — управляющие флаги. hNameMappings — дескриптор объекта отображения имени файла, который содержит массив структур SHNAMEMAPPING. Каждая структура содержит старые и новые имена пути для каждого файла, который перемещался, был скопирован, или переименован. Этот элемент используется только, если установлен флаг FOF_WANTMAPPINGHANDLE. lpszProgressTitle — указатель на строку, используемую как заголовок для диалогового окна прогресса. Этот элемент используется только, если установлен флаг FOF_SIMPLEPROGRESS. Примечание. Если pFrom или pTo не указаны, берутся файлы из текущей директории. Текущую директорию можно установить с помощью функции Добавьте в секцию uses модуль ShellAPI, в котором определена функция SHFileOperation. procedure TForm1.Button1Click(Sender: TObject); Ни один из флагов не установлен. Если вы хотите не просто удалить файлы, а переместить их в корзину, должен быть Напишем функцию, создающую из массива строк буфер для передачи его в качестве параметра pFrom. После procedure CreateBuffer( Names : array of string; var P : TBuffer ); Функция, удаляющая файлы, переданные ей в списке Names. Параметр ToRecycle определяет, будут ли файлы перемещены в корзину или удалены. Функция возвращает 0, если операция выполнена успешно, и ненулевое значение, если функции переданы имена несуществующих файлов. Освобождаем буфер Src простым присваиванием значения nil. Потери памяти при этом не происходит, происходит корректное уничтожение динамического массива. Проверяем : Файлы ‘Test1’ и ‘Test2’ удаляются совсем, без помещения в корзину, несмотря на установленный флаг FOF_ALLOWUNDO. При использовании функции SHFileOperation используйте полные пути, когда это возможно. Копирование и перемещение. Функция перемещает файлы указанные в списке Src в директорию Dest. Параметр Move определяет, будут ли файлы перемещаться или копироваться. Параметр AutoRename указывает, переименовывать ли файлы в случае конфликта имен. Выполнение: Переименование. procedure TForm1.Button1Click(Sender: TObject); Delphi.FireDAC. Выполнение хранимых процедур и функцийДанная статья посвящена выполнению хранимых процедур в FireDAC. Основой для данной статьи стала официальная документация. Класс TFDStoredProc может быть использован как designtime так и в runtime. TFDStoredProc генерирует SQL команду для вызова хранимой процедуры, базирующейся на свойствах TFDStoredProc. Перед исполнением, FireDAC отправляет значения параметров к DBMS, и после этого исполняет хранимую процедуру и получает output параметры. Замечание. FireDAC не поддерживает параметры со значениями по умолчанию. Настройка хранимых процедур в Design TimeЧтобы выполнить хранимую процедуру, необходимо бросить компонент TFDStoredProc на форму. Свойство TFDStoredProc.Connection будет автоматически настроено, если на форме есть FDConnection. Опционально можно установить CatalogName, SchemaName, и PackageName или выбрать их значения из выпадающего списка. После установки StoredProcName и когда fiMeta включено в FetchOptions.Items, коллекция параметров заполняется автоматически. Чтобы унифицировать имена параметров, можно установить ResourceOptions.UnifyParams в True. Например, это исключит префикс ‘@’ из имен параметров SQL сервера. Настройка хранимых процедур в RunTimeАналогично design-time можно использовать следующий код для run-time |