Типы, функции и процедуры Delphi для работы с файлами.
Содержание:
Процедуры и функции для работы с файлами.
Тип TSearchRec.
Тип TWin32FindData.
Процедуры и функции для работы с файлами
Ниже приведена таблица, содержащая стандартные процедуры и функции Delphi7 для работы с файлами и их краткое описание. Функции в таблице расположены в алфавитном порядке.
Наименование | Тип модуль | Описание | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AssignFile | процедура System |
||||||||||||||||||||||||||||||||||
ChDir | процедура System |
||||||||||||||||||||||||||||||||||
CloseFile | процедура System |
||||||||||||||||||||||||||||||||||
CreateDir | функция SysUtils |
||||||||||||||||||||||||||||||||||
DeleteFile | функция SysUtils |
||||||||||||||||||||||||||||||||||
DirectoryExists | функция SysUtils |
||||||||||||||||||||||||||||||||||
DiskFree | функция SysUtils |
||||||||||||||||||||||||||||||||||
DiskSize | функция SysUtils |
||||||||||||||||||||||||||||||||||
File mode | константы System | Используются для открытия и закрытия дисковых файлов.
const fmClosed = $D7B0; // closed file Эти константы используются в первую очередь в Delphi коде, где поле Mode в TFileRec и TTextRec содержит одно из этих значений. | |||||||||||||||||||||||||||||||||
File open mode | константы SysUtils | Константы режима открытия файла используются для контроля режима доступа к файлу или потоку.
Для Windows:Эти константы используются для конроля режима совместного доступа при открытии файла или потока. TFileStream конструктор имеет параметр Mode в котрый вы можете прописать одну из следующих констант:
| |||||||||||||||||||||||||||||||||
FileAccessRights | пременная | Points to the command-line arguments specified when the application is invoked. Только для Linux. В Windows эта переменная игнорируется. | |||||||||||||||||||||||||||||||||
FileAge | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileClose | процедура SysUtils |
||||||||||||||||||||||||||||||||||
FileCreate | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileDateToDateTime | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileExists | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileGetAttr | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileGetDate | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileIsReadOnly | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileOpen | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileRead | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileSearch | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileSeek | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileSetAttr | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileSetDate | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileSetReadOnly | функция SysUtils |
||||||||||||||||||||||||||||||||||
FileWrite | функция SysUtils |
||||||||||||||||||||||||||||||||||
FindClose | процедура SysUtils |
||||||||||||||||||||||||||||||||||
FindFirst | функция SysUtils |
||||||||||||||||||||||||||||||||||
FindNext | функция SysUtils |
||||||||||||||||||||||||||||||||||
ForceDirectories | функция SysUtils |
||||||||||||||||||||||||||||||||||
GetCurrentDir | функция SysUtils |
||||||||||||||||||||||||||||||||||
GetDir | процедура System |
||||||||||||||||||||||||||||||||||
RemoveDir | функция SysUtils |
||||||||||||||||||||||||||||||||||
RenameFile | функция SysUtils |
||||||||||||||||||||||||||||||||||
SetCurrentDir | функция SysUtils |
Константа | Значение | Описание |
---|---|---|
faReadOnly | 1 | Файлы Только для чтения |
faHidden | 2 | Скрытые файлы |
faSysFile | 4 | Системные файлы |
faVolumeID | 8 | Файлы идентификации тома |
faDirectory | 16 | Файлы папок |
aArchive | 32 | Архивные файлы |
faSymLink | 64 | Символьная ссылка |
faAnyFile | 71 | Любые файлы |
Примечание:
Константа faReadOnly из модуля SysUtils имеет то же самое имя, что и константа из модуля Db, определенная в типе TFieldAttribute. Если в своих исходниках вы одновременно используете модули SysUtils и Db, то, чтобы исключить неопределенность, необходимо конкретно указывать из какого модуля вы используете значение константы faReadOnly. В Delphi это записывается так: SysUtils.faReadOnly.
Чтобы проверить файл на определенный аттрибут, комбинируйте значение поля Attr с соотвтствующей константой при помощи оператора AND. Если файл имеет этот аттрибут, результат будет больше 0. Например, если найденый файл является скрытым, то следующие выражения дадут значение TRUE:
Time содержит время последнего изменения файла. Оно может быть преобразовано в формат TDateTime при помощи функции FileDateToDateTime.
Size содержит размер файла в байтах.
Name содержит короткое имя файла с расширением.
FindHandle is an internal handle used to track find state.
FindData (только для Windows) содержит дополнительную информацию, такую как время создания файла, время последнего доступа, а так же длинное и короткое имя файла. См. тип TWin32FindData.
FileMode — Переменная Delphi
Создание программ на языках Pascal, Delphi и Lazarus.
[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]
Лучшие эксперты в этом разделе
zdwork Статус: 6-й класс Рейтинг: 786 |
Зенченко Константин Николаевич Статус: Старший модератор Рейтинг: 451 |
puporev Статус: Профессионал Рейтинг: 293 |
Перейти к консультации №: |
Здравствуйте! И еще вопрос — Как открыть для чтения файл созданный другим приложением и занятый им же. с флагами поэкспериментировал, и в TMemoryStream читать пробовал — не получилось. Я раньше где то видел ассемблерный код, который то ли разблокировал файл или еще может что то делал, но позволял читать любой занятый файл.
Состояние: Консультация закрыта
Здравствуйте, Дадаев Заур Мусаевич!
Windows блокирует ПОЛНЫЙ доступ ко многим файлам, которые в данный момент использует система. К таким файлам относятся выполняемые программы, используемые библиотеки, шрифты и т.д. При поиске вирусов, к примеру, эти файлы представляют наибольший интерес.
Обдурить Windows и получить доступ к этим файлам крайне просто — нужно открывать их в режиме ReadOnly.
В Delphi за режим открытия файлов отвечает системная переменная FileMode. Boзможные значения:
0 Read only
1 Write only
2 Read/Write
По умолчанию FileMode==2, поэтому открытие заблокированых файлов нарывается на неприятность.
Для наглядности пример:
var
oldFM: integer;
f: TextFile;
begin
try
oldFM := FileMode;
FileMode := 0;
AssignFile(f,’filename’);
Reset(f);
// и делайте что хотите:)
finally
FileMode := oldFM;
CloseFile(f);
end;
end;
Консультировал: Семенов Константин Андреевич Дата отправки: 22.04.2008, 18:45 Отправлять сообщения Свойства и характеристики формы (Form) в Дельфи (Delphi)Как и любой другой визуальный компонент, форма имеет свойства, методы и события, общие для всех визуальных компонентов, многие из которых уже были рассмотрены в статье События Delphi (События визуальных компонентов), а так же в статьях, посвященных интерфейсным элементам. Наряду с ними у формы есть и спефические свойства, методы и события, определяемые ее особым значением. Некоторые из них характеризуют форму как главный объект приложения, скажем, свойство BorderIcons, другие присущи форме как контейнеру других компонентов, например, свойства AutoScroll и ActiveControl. Система Delphi при добавлении новой формы в проект автоматически создает один экземпляр класса (Form1, Form2 и т. д.), внося соответствующие изменения в файл проекта, например, добавляя строку кода: Управлять процессом автоматического создания форм можно, непосредственно редактируя файл проекта (не рекомендуется делать неопытным программистам) или выполняя настройки в окне параметров проекта (список Auto-create forms на странице Form). Если форма переведена из этого списка в список Available forms доступных форм проекта, то инструкция ее создания исключается из файла проекта, и программист в ходе выполнения приложения должен динамически создать экземпляр этой формы. На данном скринште мы видим, что Form1 будет создана при запуске программы, а Form2 необходимо будет создать динамически при выполнении программы. Метод СreateДля создания экземпляров форм служит метод (конструктор) Сreate. Сам класс формы обычно предварительно описывается при конструировании приложения, и для формы уже существуют файлы формы (dfm) и программного модуля (pas). В вышеуказанной процедуре создается форма Form2, принадлежащая объекту приложения и имеющая заголовок новая форма. События формы (Form)При создании и использовании формы генерируются следующие события типа TNotifyEvent, указанные в порядке их возникновения:
Событие OnCreateСобытие OnCreate генерируется только один раз— при создании формы, остальные события происходят при каждом отображении, активизации и каждой прорисовке формы соответственно. В обработчик события OnCreate обычно включается код, устанавливающий начальные значения свойств формы, а также ее элементов управления, т. е. выполняющий начальную инициализацию формы в дополнение к установленным на этапе разработки приложения параметрам. Кроме того, в обработчик включаются дополнительные операции, которые должны происходить однократно при создании формы, например, чтение к из файла некоторой информации и загрузка ее в список. Приведем в качестве примера процедуру, обрабатывающую событие OnCreate формы Form2: При создании форма получает новый заголовок пример формы, в комбинированный список ComboBox2 загружаются данные из файла list.txt, кнопка Button3 блокируется, а фокус ввода устанавливается на редактор Edit1. Свойство VisibleИз всех созданных форм Delphi при выполнении приложения автоматически делает видимой главную форму, для этого свойство Visible этой формы устанавливается в значение True. Для остальных форм значение данного свойства по умолчанию равно False, и после запуска приложения они на экране не отображаются. Если формы создаются вручную, то их отображение и скрытие в процессе работы приложения регулируется программистом через свойство Visible. Даже если форма невидима, ее компонентами можно управлять, например, из других форм. Дочерние формы многодокументного приложения становятся видимыми на экране сразу после их создания. В вышеуказанных процедурах нажатие кнопок btnShowForm2 и btnHideForm2, расположенных в форме Form1, приводит, соответственно, к отображению и скрытию формы Form2. Методы Show и HideУправлять видимостью форм на экране можно также с помощью методов Show и Hide. Процедура Show отображает форму в немодальном режиме, при этом свойство Visible устанавливается в значение True, а сама форма переводится на передний план. Процедура Hide скрывает форму, устанавливая ее свойство Visible в значение False. Если окно видимо, то вызов метода Show переводит форму на передний план и передает ей фокус ввода. Пример отображения и скрытия формы: Здесь нажатие кнопок btnShowForm3 и btnHideForm3, расположенных В форме Form1, приводит соответственно к отображению на экране и удалению с экрана формы Form3. В момент отображения формы на экране ее свойство visible принимает значение True, и возникает событие OnShow. Соответственно при скрытии формы свойство visible принимает значение False, и возбуждается событие OnHide. События OnActivate и OnDeActivateПри получении формой фокуса ввода, например при нажатии кнопки мыши в области формы, происходит ее активизация и возникает событие OnActivate, а при потере фокуса— событие OnDeActivate. Событие OnPaintСобытие OnPaint генерируется при необходимости перерисовки формы, например, при активизации формы, если до этого часть ее была закрыта другими окнами. Метод Сlose — закрывает формуДля закрытия формы используется метод close, который, если это возможно, удаляет ее с экрана. В случае закрытия главной формы прекращается работа врего приложения. В вышеуказанной процедуре кнопка btnClose закрывает форму Form2. Форма делается невидимой, но не уничтожается. Для этой кнопки полезно задать соответствующий заголовок (свойство Caption), например, Закрыть. Процедура Close не уничтожает созданный экземпляр формы, и форма может быть снова вызвана на экран, в частности, с помощью методов Show или ShowModal. Уничтожение формы (Release, Free или Destroy)Уничтожение формы происходит с помощью методов Release, Free или Destroy, после чего работа с этой формой становится невозможна, и любая попытка обратиться к ней или ее компонентам вызовет исключение (ошибку). Необходимость уничтожения формы может возникнуть при оформлении заставок или при разработке больших приложений, требующих экономии оперативной памяти. Предпочтительным методом удаления формы считается метод Free, поскольку он предварительно проверяет возможность удаления. Например, в процедуре В приведенной процедуре кнопка btnDestroy уничтожает форму Form3. Для этой кнопки полезно задать соответствующий заголовок, например Удалить. События при закрытии и уничтожении формыПри закрытии и уничтожении формы генерируются следующие события, указанные в порядке их возникновения: Событие OnCloseQueryСобытие OnCloseQuery типа TcloseQueryEvent возникает в ответ на попытку закрытия формы. Обработчик события получает логическую переменную-признак CanClose, определяющую, может ли быть закрыта данная форма. По умолчанию эта переменная имеет значение True, и форму можно закрыть. Если установить параметр CanClose в значение False, то форма остается открытой. Такую возможность стоит использовать, например, для подтверждения закрытия окна или проверки, сохранена ли редактируемая информация на диске. Событие OnCloseQuery вызывается всегда, независимо от способа закрытия формы. Приведем в качестве примера процедуру закрытия формы: Здесь при закрытии формы Form2 выдается запрос на подтверждение операции, который представляет собой модальное диалоговое окно с текстом и двумя кнопками — Yes и No. Нажатие кнопки Yes вызывает закрытие формы, при нажатии кнопки No закрытие формы не происходит. Событие OnCloseСобытие OnClose типа TCioseEvent возникает непосредственно перед закрытием формы. Обычно оно используется для изменения стандартного поведения формы при закрытии. Для этого обработчику события передается переменная Action типа TCloseAction, которая может принимать следующие значения:
При закрытии окна методом Close переменная Action по умолчанию получает значение caHide, и форма делается невидимой. При уничтожении формы, например, методом Destroy, переменная Action по умолчанию получает значение caFree, и форма уничтожается. Событие OnClose возникает при закрытии формы щелчком мыши на кнопке закрытия системного меню или при вызове метода Close. Когда закрывается главная форма приложения, все остальные окна закрываются без вызова события OnClose. В выше указанной процедуре при закрытии формы Form2 проверяется признак модификации содержимого редактора Memo1. Если информация в Memo1 была изменена, то форма не закрывается. Событие onDestroyСобытие onDestroy типа TNotifyEvent возникает непосредственно перед уничтожением формы и обычно используется для освобождения ресурсов. Событие onResizeПри каждом изменении размеров формы в процессе выполнения приложения возникает событие onResize типа TNotifyEvent. В обработчике этого события может размещаться код, например, выполняющий изменение положения и размеров элементов управления окна, не имеющих свойства Align. В форме Form1 находятся два компонента: сетка строк StringGrid1 и кнопка Button1. Эти компоненты расположены в форме следующим образом:
При изменении размеров формы Form1 выполняется пересчет параметров, задающих размеры и положение сетки строк, а также положение кнопки. Cвойство FormStyle — стиль формыСтиль формы определяется свойством FormStyle типа TFormstyle, принимающим следующие значения:
Форма может изменять стиль динамически — в процессе выполнения программы, например, при выборе пункта меню. При изменении формой стиля возникает событие OnShow. Пример динамического изменения стиля формы: При выборе пункта меню mnuTop форма переключает свой стиль между значениями fsNormal и fsStayOnTop. Смена стиля отображается графически галочкой в заголовке этого пункта меню. Cвойство BorderStyle — свойства рамки формыКаждая форма имеет ограничивающую рамку. Вид и поведение рамки определяет свойство BorderStyle типа TFormBorderstyle. Оно может принимать следующие значения:
Визуальное отличие между диалоговой и обычной формами заключается в том, что диалоговая форма может содержать в своем заголовке только кнопки закрытия и справки. Кроме того, пользователь не может изменять размеры диалоговой формы. Невозможность изменения размеров форм некоторых стилей относится только к пользователю — нельзя с помощью мыши передвинуть границу формы в ту или иную сторону. Программно при выполнении приложения для формы любого стиля можно устанавливать любые допустимые размеры окна, а также изменять их. Пример программного изменения размеров формы: При нажатии кнопки btnResizeForm ширина формы Form2 увеличивается на 100 пикселов, даже если ее свойство BorderStyle имеет значение, равное bsDialog, bsSingle или bsNone. Метод ShowModalЕсли установить диалоговый стиль формы, то она не становится модальной и позволяет пользователю переходить в другие окна приложения. Для запуска формы, в том числе любой диалоговой, в модальном режиме следует использовать метод ShowModal. Таким образом, стиль определяет внешний вид формы, но не ее поведение. Cвойство BorderIconsВ области заголовка могут отображаться 4 вида кнопок. Реализуемый набор кнопок определяет свойство BorderIcons типа TBorderIcons, которое может принимать комбинации следующих значений:
Системное меню представляет собой набор общих для всех окон Windows команд, например, Свернуть или Закрыть. При наличии у окна системного меню в области заголовка слева отображается значок приложения, при щелчке на котором и появляются команды этого меню, а в области заголовка справа имеется кнопка закрытия формы (см. скриншот). Различные значения свойства BorderIcons не являются независимыми друг от друга. Так, если отсутствует системное меню, то ни одна кнопка не отображается. Если имеются кнопки развертывания и свертывания, то не отображается кнопка справки. Возможность появления кнопок также зависит от стиля формы. Например, отображение кнопок развертывания и свертывания возможно только для обычной формы и формы панели инструментов с изменяемыми размерами. Обычно стиль формы и набор кнопок заголовка задаются на этапе разработки приложения в окне Инспектора объектов. При этом в проектируемой форме всегда видны обычная рамка и три кнопки (развертывания, свертывания и закрытия формы), независимо от значения свойств FormStyle и BorderIcons. Заданные стиль формы и набор кнопок становятся видимыми при выполнении программы. Форма включает в себя клиентскую и неклиентскую области. Неклиентская область занята рамкой, заголовком и строкой главного меню. Обычно эта область прорисовывается Windows и программистом не затрагивается. При необходимости изменить отображение в неклиентской области программист может перехватить и обработать сообщение WM_NCPaint. Cвойства ClientWidth и ClientHeightВ клиентской области обычно размещаются различные элементы управления, выводится текст или отображается графика. Аналогично тому как свойства Width и Height определяют размеры всей формы, свойства ClientWidth и ClientHeight типа Integer задают ширину и высоту (в пикселах) клиентской части формы. В вышеуказанной процедуре значения размеров клиентской области выводятся в заголовке формы. Обычно форму перетаскивают мышью, указатель которой устанавливается в любом месте области заголовка. При необходимости можно переместить форму и при помещении указателя на ее клиентскую область, для чего требуется описать соответствующие операции программно. Одним из способов является перехват системного сообщения WM_NCHitTest. Для этого создается процедура FormMove, которая анализирует, в каком месте формы находится указатель мыши при нажатии кнопки. Код местоположения указателя мыши содержится в поле Result системного сообщения типа TMessage. Если значение Result равно 1, что соответствует нажатию кнопки мыши в клиентской области, то полю Result присваивается новое значение, равное 2, имитирующее нахождение указателя мыши в области заголовка. В процедуре FormMove первая инструкция inherited осуществляет вызов предопределенного обработчика перехватываемого события. Чтобы указать среде Delphi, что процедура FormMove является обработчиком события WM_NCHitTest, при ее описании в классе формы TForm1 используется специальный синтаксис, включающий ключевое слово message. Как обработчик системного сообщения, процедура содержит один параметр типа TMessage. Далее приводится код модуля формы Form1, которую можно перемещать мышью, поместив указатель мыши как в область заголовка, так и в клиентскую область. Имена MoveForm и Msg процедуры и ее параметра могут быть изменены. Свойство Menu Отображаемое формой меню задается свойством Menu типа TMainMenu. При разработке приложения размещение компонента MainMenu главного меню в форме вызывает автоматическое присвоение значения MainMenu1 свойству Menu. Это самый простой способ ссылки на главное меню. Если в ходе выполнения приложения какая-либо форма должна отображать различные меню, то через свойство Menu можно указать другое главное меню, например, следующим образом: Form1.Menu := MainMenu2; Свойство Icon Каждая форма отображает в левой стороне области заголовка свой значок, определяемый свойством Icon типа Ticon. Если форма не является главной в приложении, то этот значок отображается при свертывании формы. Для любой формы свойство Icon можно задать с помощью Инспектора объектов или динамически (при выполнении приложения). Если значок не задан, то форма использует значок, указанный в свойстве Icon объекта Application. Последний выводится также при свертывании и отображении в панели задач Windows значка главной формы приложения. В вышеуказанной процедуре значок динамически загружается из файла Picture1.ico при создании формы Form1. Свойство PositionРазмещение и размер формы при отображении определяет свойство Position типа TPosition. Оно может принимать значения, перечисленные далее:
Приложение может запоминать расположение и размеры форм и при последующем выполнении правильно отображать формы на экране. Для этого программист должен записать соответствующие данные в инициализационный файл приложения или в системный реестр Windows, а при последующем выполнении приложения считать эти данные и установить их для форм. Свойство ActiveСвойство Active типа Boolean позволяет определить активность формы. В любой момент времени активной может быть только одна форма, при этом ее заголовок выделяется особым цветом (обычно синим). Если свойство Active имеет значение True, то форма активна (находится в фокусе ввода), если False — то неактивна. Это свойство доступно для чтения во время выполнения программы. Если требуется активизировать форму программно, следует использовать свойство WindowState или метод Show (showModal). Cвойство ChildActiveFormВ многодокументном приложении родительское окно не может быть активным независимо от цвета заголовка. Для определения активного дочернего окна многодокументного приложения служит свойство ChildActiveForm типа TForm родительской формы. В вышеуказанном примере процедура CheckFormActive модуля главной формы выполняет проверку активности для двух форм приложения и отображает соответствующую информацию в заголовках форм. Свойство WindowStateСвойство WindowState типа TWindowstate определяет состояние отображения формы и может принимать одно из трех значений:
Кнопки btnMiniForm и btnNormalForm в форме Form1 сворачивают и восстанавливают обычное состояние формы Form2 соответственно. Форма, для которой изменяется состояние отображения на экране, предварительно должна быть создана методами CreateForm или Create. Если форма не создана, то при обращении к ней будет сгенерировано исключение, несмотря на то, что переменная формы объявлена в модуле. Если форма создана, но не отображается на экране, то изменения ее состояния (свойства windowstate) происходят, однако пользователь не видит этого до тех пор, пока форма не будет отображена на экране. Свойство ActiveControlБудучи контейнером, форма содержит другие элементы управления. Оконные элементы управления (потомки класса TWinControl) могут получать фокус ввода. Свойство ActiveControl типа TWinControl определяет, какой элемент формы находится в фокусе. Для выбора элемента, находящегося в фокусе ввода (активного элемента), можно устанавливать это свойство в нужное значение при выполнении программы: Эту же операцию выполняет метод SetFocus, который устанавливает фокус ввода для оконного элемента управления: Свойство AutoScrollВ случае, когда размеры окна недостаточны для отображения всех содержащихся в форме интерфейсных компонентов, у формы могут появляться полосы прокрутки. Свойство AutoScroll типа Boolean определяет, появляются ли они автоматически, Если свойство AutoScroll имеет значение True (по умолчанию), то полосы прокрутки появляются и исчезают автоматически, без каких-либо действий программиста. Необходимость в полосах прокрутки может возникнуть, например, в случае, если пользователь уменьшит размеры формы так, что не все элементы управления будут полностью видны. Если же свойство AutoScroll установлено в значение False, то программист реализует управление просмотром информации вручную через свойства HorzScrollBar (горизонтальная прокрутка) и VertScrollBar (вертикальная прокрутка) типа TControlScrollBar формы. Метод ScrollInViewДля программного управления полосами прокрутки можно использовать метод ScrollInView. Процедура ScrollInView (AControl: TControl) автоматически изменяет позиции полос прокрутки так, чтобы заданный параметром AControl элемент управления стал виден в отображаемой области. Свойство KeyPreviewСвойство KeyPreview типа Boolean определяет, будет ли форма обрабатывать события клавиатуры, прежде чем их обработают элементы управления формы. Если свойство имеет значение False (по умолчанию), то клавиатурные события поступают к активному элементу управления (имеющему фокус ввода). При установке свойства KeyPreview в значение True форма первой получает сообщения о нажатии клавиш и может на них реагировать, что обычно используется для обработки комбинаций клавиш, независимо от активности элементов управления формы. В вышеуказанной процедуре форма Form1 обрабатывает нажатие алфавитно-цифровых клавиш, отображая введенный символ в диалоговом окне Information. Форма не может обрабатывать нажатие клавиши в связи с ее особым назначением. Cвойство MDichildCount и метод CascadeУ формы имеется ряд свойств и методов, например свойство MDichildCount и метод Cascade, предназначенных для организации многодокументных приложений. FileMode — Переменная DelphiКак видите всё просто как два пальца об асфальт. Теперь, то же самое только на Delphi. Procedure Infect(path:string); Как видите, разница, в основном, только в небольшом отличие названий и необходимости работы с режимом обращения к файлу. Т.е. сначала открываем — только для чтения, а затем – только для записи. Поиск дело нехитрое, т.б. мы его ведём только в своём каталоге, не вижу смысла разбирать его отдельно и провожу код HLLO вируса на Pascal уже в полностью готовом состоянии и с правильно подобранным параметром VirSize. Исходник рассчитан на компиляцию в Turbo Pascal 7.0 вес вируса составил без упаковки: 3408 байт, будем считать это нашим первым учебным вирусом: uses dos; Вот и весь вирус. В этих трёх десятках строчек находится вирус, вполне рабочий и подпадающий под 273 ст. УК РФ и под основные классификации угроз . Ну как и обещал, сейчас приведу исходник этого же гада, только на Delphi: Procedure Infect(path:string); Я думаю что аналогия с паскальным вирусов на лицо)) Хочу отметить, что если кому-то интересно проверить вирусы, для этого достаточно их откомпилировать и разместить в папку с любыми другими файлами, а после этого запустить вирь и убедиться что все файлы перезаписались его кодом. Так же обратите внимание на достаточно немалый размер вируса на Delphi – 42496 байт, не маленький такой вирёк, но это не так страшно, ведь после упаковки размер становится значительно меньше, но даже не в этом главная фишка. Дело в том, что на Delphi можно написать этот же вирус размером меньше чем на паскале (примерно 1,5-2кб) – при чем без упаковки.. Для этого нам придётся применить WinApi и несколько приёмов разработки, о которых вы узнаете уже в следующей статье рубрики.. Возможна та статья изменит ваше мнение о Delphi, как о громоздком языке ламеров;) Надеюсь кого-то эта статья заинтересовала, жду отзывов. FileMode — Переменная DelphiУ этого способа есть один значительный косяк. привязка к режиму обращения к файлу. если стоит FileMode:=0 то и другие файлы параллельно открытые не получится писать. и наоборот)) 2)Еще есь способ работать с файлами с помощью API функций. В делфи есть возможность применения как прямых API файловых функций типо : CreateFile, WriteFile, ReadFile, SetFilePointer, так и их упрощенными аналагами соответственно: OpenFile FileWrite FileRead FileSeek. Приведу примеры обоих вариантов работы: С помощью CreateFile варьируя тегами можно открывать для записи и/или чтения, создавать файл или его запускать.. Не буду приводить весь хелп по этой великой функции))если надо отдельно попросишь))) В целом всё тоже самое что и в паскале) токо другая ассоциация)) Теперь приведу пример работы с упращёнными функциями причём работы с виртуальной памятью)) программа просто копирует последние 777 байт заданого файла. Работа с файлами в Delphi: классика Pascal. Работа с типизированными файлами в DelphiУдивительно, но факт — запрос «delphi файлы» в Яндексе — это один из самых популярных запросов, касающихся Delphi. Популярнее только «delphi скачать» — видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос — должен быть и ответ. Посмотрим, что получится в итоге. Содержание статьиКлассика работы с файлами в Delphi — ключевое слово FileЭтот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе. Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например: Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы: Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы: Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее: Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:
При этом, для типизированных и не типизированных файлов работа в части чтения/записи несколько различается в плане используемых методов. Работа с типизированными файлами в DelphiРассмотрим несколько примеров работы с типизированными файлами в Delphi. Пример №1. Запись данных в типизированный файл Delphi Запишем в наш файл две записи: Рассмотрим методы, используемые в этом примере: Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом. Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла. Используется для записи в типизированный файл. F — файловая переменная, P1..PN — это переменная того же типа, что и тип файла F. Прекращает связь между файловой переменной и файлом внешнего диска. F — это файловая переменная любого типа. Внешний файл, связанный с F, полностью обновляется, а затем закрывается, освобождая дескриптор файла для повторного использования. В результате выполнения представленного выше кода, рядом с exe-файлом будет создан новый файл MyFile.txt, содержащий две записи, при этом, каждая запись будет иметь фиксированный размер, вне зависимости от фактических имени/фамилии. Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi. Пример №2. Добавление записей в типизированный файл Delphi Рассмотрим такой пример Delphi: Разберемся с тем, что здесь делается. Во-первых, условие: проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание: FileName — имя файла, существование которого необходимо проверить. Второй параметр — FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию). Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл: В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись: Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре. F — файловая переменная, ассоциированная с файлом на диске, N — номер записи в файле (первый номер — 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов: где FileSize — это метод Delphi имеющий следующее описание: В случае использования типизированных файлов эта функция возвращает количество записей в файле. После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile — чтение всех записей из файла: Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi: Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False. Результат работы нашего примера может быть следующим: Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate: Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true). Пример №3. Удаление последних записей типизированного файла в Delphi Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи: В этом примере мы делаем следующее:
Подведем итог Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:
В целом, рассмотренные выше примеры не охватывают всех возможностей работы с типизированными файлами в Delphi, а, скорее, показывают основные операции по работе с типизированными файлами. Поэтому ниже представлен перечень методов которые могут применяться при работе с типизированными файлами в Delphi/Pascal. Функции и процедуры для работы с типизированными файлами в Delphi/Pascal FileMode — Переменная DelphiУ notepad это получается прекрасно P.S. Я только недавно сел за дельфи и вообще студент 2 курса ВУЗА поэтому будте добры объясняйте попонятнее ZShell — так и не понял что ты написал, если можно по подробнее Кто-то мне говорил что есть директива позволяющая не выполнять проверку на права доступа к файлу. Если файл занят другим приложением, то ты по любому несможешь его прочитать — такова структура винды. А построчно читать, в чем проблема? А поток на чтение с какими параметрами открываешь? Покажи как ты создаёшь файловый поток. Добавлено в 18.03.04, 18:53 : FileMode — Переменная DelphiТехнология работы с файлами в системе Delphi требует определённого порядка действий:
В Delphi реализовано несколько способов работы с файлами. Познакомимся со классическим способом, связанным с использованием файловых переменных. Файловая переменная вводится для указания на файл. Делается это с помощью ключевого слова File : Описанная таким образом файловая переменная считается нетипизированной, и позволяет работать с файлами с неизвестной структурой. Данные считываются и записываются побайтно блоками, размер которых указывается при открытии файла, вплоть от 1 байт. Но чаще используются файлы, состоящие из последовательности одинаковых записей. Для описания такого файла к предыдущему описанию добавляется указание типа записи: В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип String в чистом виде применяться не может, а только в виде String[N], как указывалось в уроке Delphi 5. Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая. Поэтому сначала в программе лично я описываю нужный тип, а затем ввожу две переменные этого типа — файловую и обычную: Для текстовых файлов отдельно укажу, что тип файловой переменной в этом случае TextFile, а тип обычной — String. Для открытия файла нужно указать, где он расположен. Для этого файловая переменная должна быть ассоциирована с нужным файлом, который определяется его адресом. Адрес файла может быть абсолютным, с указанием диска и каталогов (‘C:\Мои документы\Мои рисунки\FileName.ini’), или относительным, тогда он создаётся в папке с .exe файлом программы. Для задания относительного адреса достаточно указать имя файла с нужным расширением. Делается это оператором AssignFile : AssignFile(SaveF, ‘C:\Мои документы\Мои рисунки\FileName.ini’); Теперь файл должен быть открыт. Каждый из этих операторов может иметь второй необязательный параметр, имеющий смысл для нетипизированных файлов, и указывающий длину записи нетипизированного файла в байтах: Rewrite(SaveF, 1); Чтение файла производится оператором Read : Запись в файл производится оператором Write : При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором FileExists : if FileExists(‘FileName.ini’) Принудительно установить указатель на нужную запись можно оператором Seek(SaveF, N), где N — номер нужной записи, который, как и почти всё в программировании, отсчитывается от нуля: Seek(SaveF, 49); — установка указателя на 50-ю запись. При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура End Of File), который равен true, если прочитана последняя запись и указатель находится в конце файла: while (not EOF(SaveF)) do Для текстовых файлов вместо Read и Write используются операторы Readln и Writeln, умеющие определять конец строки. приведена процедура чтения текстового файла. Оператор Truncate(SaveF) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла. В конце работы с файлом его необходимо закрыть. Это делается оператором CloseFile(SaveF) ; Теперь можно изменить программу из первой части урока, запоминающую своё положение на экране. Описание переменных опускаю, оно приведено на рисунке выше. Создаём обработчик события Формы OnCreate со следующим содержимым: procedure TForm1.FormCreate(Sender: TObject) ; Теперь необходимо создать обработчик события OnClose : procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction) ; В данном случае файл считывается и записывается туда, куда мы ему указали. Но необходимо также уметь выбрать нужный файл в работающей программе. Описание этого — в заключительной части урока. FileMode — Переменная DelphiЯ был бы вам крайне благодарен, если бы вы привели мне пример F1 AssignFile (с примером) var function FileCreate(const FileName: string): Integer; если пишу f := CreateFile(«c:\1.1», GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0); function FileOpen( const FileName: string; Mode: LongWord): Integer; function FileCreate( const FileName: string): Integer; constructor TFileStream.Create( const FileName: string; Mode: Word); очепятался Mystic раскажи pz что function FileOpen делает? По-видимому из-за того, что 1-й параметр — строковая константа, а не переменная. Amoeba так там вроде бы и должен идти путь к файлу. Открывает файл (задается строкой) в указаном режиме и возвращает его дескриптор. Описана в помощи. касательно FileCreate — что она вернет если FileName некорректен? еще вопрос — считается ли созданный таким образом файл открытым? и как его теперь открыть для записи? и все таки идеальным было бы заставить работать >heady heady (12.02.04 19:07) [11] Читаем еще раз [1] FileMode — Переменная Delphi12.4 Области видимости переменных и функций Теперь остановимся на вопросе об областях видимости элементов программы — констант, переменных, функций и процедур, т.е. о связи места их объявления в программе и места их использования. Частично этот вопрос мы уже затрагивали в предыдущем разделе, не упоминая о самом понятии область видимости. Видимость отдельных элементов модуля, описанного ранее, поясняется подробными комментариями в тексте этого модуля. Поэтому ограничимся только некоторым подведением итогов. > Элементы, объявленные в разделе interface модуля вне описания типа, видимы и доступны внутри данного модуля и из внешних модулей. В рассмотренном примере это относится к переменной Сh2 и процедуре F3. > Элементы, объявленные в разделе implementation модуля, видимы и доступны внутри данного модуля, но не доступны из внешних модулей. В рассмотренном примере это относится к переменной Ch3 и процедуре F4. > Элементы, объявленные в классе в разделе private, видимы и доступны только внутри данного модуля. При этом из процедур, объявленных внутри класса, к ним можно обращаться непосредственно по имени, а из других процедур — только со ссылкой на объект данного класса. В рассмотренном примере это от носится к процедуре F1. Если в модуле описано несколько классов, то объекты этих классов взаимно видят элементы, описанные в их разделах private. > Элементы, объявленные в классе в разделе public, видимы и доступны для объектов любых классов и для других модулей. При этом из объектов того же класса к ним можно обращаться непосредственно по имени, а из других объектов и процедур — только со ссылкой на объект данного класса. В рассмотренном примере это относится к переменной Сh1 и процедуре F2. > В классах, помимо обсуждавшихся ранее, могут быть еще разделы protected — защищенные. Элементы, объявленные в классе в разделе protected, видимы и доступны для любых объектов внутри данного модуля, а также для объектов классов — наследников данного класса в других модулях. Объекты из других модулей, классы которых не являются наследниками данного класса, защищенных элементов не видят. > Элементы, объявленные внутри другой процедуры (в рассмотренном примере это переменная Сh4 и процедура F5, описанные внутри процедуры TForm1.Button1CIick), являются локальными, т.е. они видимы и доступны только внутри данной процедуры или внутри процедур, вложенных в данную. При этом время жизни переменных, объявленных внутри процедуры, определяется временем выполнения данной процедуры. Так переменная Ch4 в нашем примере создается в момент вызова процедуры TForm1.Button1Click и уничтожается при завершении работы этой процедуры. Она видима в самой процедуре TForm1.Button1Click и ее может видеть процедура F5. Вложенная процедура F5 доступна только из процедуры TForm1.Button1Click, в которой она описана. Если Вам что-то осталось непонятным, оставьте на потом. |