Страница ADO
4.8.6. Страница ADO
Компоненты этой страницы в функциональном отношении во многом подобны компонентам страницы BDE, но поддерживают доступ к данным с помощью техологии ADO (ADOTable, ADOQuery,
ADostoredproc и т. д.). Все компоненты страницы впервые введены в версии 5.
TCalendar ввод и отображение даты
18.7.6. TCalendar - ввод и отображение даты
Компонент TCalendar отображает календарь на выбранный месяц и год. Его свойства Day, Month и Year могут содержать любую дату от 1 до 9999 года от Рождества Христова.
Свойства компонента:
property CalendarDate: ~DateTime; property CellText[ACol, ARow: Integer]: String;
property Day: Integer; property GridLineWidth: Integer; |
Содержит выбранную дату Содержит текст в ячейке календаря на пересечении столбца ACol с рядом ARow (только для чтения) Определяет выбранный день месяца |
property Month: Integer; property Readonly: Boolean; | Устанавливает толщину линий таблицы календаря Определяет выбранный месяц Если содержит True, пользователь не может выбрать другую дату |
type TDayOfWeek = 0..6;property StartOfWeek: TSayOfWeek; | Определяет день недели, который будет отображаться в самом левом столбце таблицы |
property UseCurrentDate: Boolean; | Если содержит True, компонент будет показывать текущую системную дату |
property Year: Integer; | Определяет выбранный год |
Методы компонента: | |
procedure NextMonth; procedure NextYear; procedure PrevMonth; | Показывает календарь на следующий месяц Показывает календарь на следующий год Показывает календарь на предыдущий месяц |
procedure PrevYear; | Показывает календарь на предыдущий год |
TFileListBox панель с именами файлов
18.6.6. TFileListBox - панель с именами файлов
Компонент TFileListBox представляет собой панель с именами файлов. Совместно С компонентами TDriveComboBox, TFilterComboBox и TDirectoryListBox может использоваться для создания диалоговых окон доступа к файлам.
Свойства компонента:
property Directory: String; | Определяет каталог размещения файлов |
property Drive: Char; | Определяет диск размещения файлов |
property FileEdit: TEdit; property FileName: String; | Объект-редактор для ввода имени файла вручную Введенное или выбранное имя файла |
TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal) ; TFileType = set of TFileAttr; property FileType: TFileType; | Определяет типы элементов, показываемых в окне компонента: ftReadOnly - файлы только для чтения; ftHidden - скрытые файлы; ftSystem -системные файлы; ftVolumeID - метки носителей; ftDirectory - каталоги; ftArchive - архивные файлы; ftNormal - обычные файлы |
property Mask: String; | Определяет маску выбора файлов |
property MultiSelect: Boolean; | Разрешает/запрещает множественный выбор файлов |
property ShowGlyphs: Boolean; | Если содержит True, рядом с именами файлов показываются пиктограммы типа файла |
Методы компонента:
procedure ApplyFilePath(const EditText: Strings; | Заменяет значения свойств Drive, Directory, FileName и Mask на те, что содержатся в строке EditText |
procedure Update; | Обновляет содержимое окна |
Для компонента определено событие
property OnChange: TNotifyEvent;
возникающее при любом изменении выбора в окне компонента.
TImage отображение картинок
18.2.6. TImage - отображение картинок
TMemo ввод и отображение текста
18.1.6. TMemo - ввод и отображение текста
![](image/18-9.gif)
Компоненты класса тмето предназначены для ввода, редактирования и/или отображения достаточно длинного текста. Текст хранится в свойстве Lines класса TStrings и, таким образом, представляет собой пронумерованный набор строк (нумерация начинается с нуля). С помощью свойств И методов этого класса (Count, Add, Delete, Clear и т. д. - см. п. 16.3.1) можно динамически формировать содержимое компонента.
Свойства BorderStyle, CanUndo, HideSelection, MaxLentgh, Modified, OEMConvert, OnChange, Readonly, SelLength, SelStart и SelText аналогичны соответствующим свойствам класса TEdit. Свойство WordWrap аналогично свойству TLabel. WordWrap. Другие специфичные свойства представлены ниже:
property CaretPos: TPoint; | Содержит координаты мигающего текстового курсора относительно границ клиентской области компонента (только для Delphi 4...6) |
property Lines: TStrings; TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth) ; property ScrollBars: Tscroll-Style; | Содержит строки текста Определяет наличие в окне редактора полос прокрутки: ssNone - нет полос;ssHorizontal -есть горизонтальная полоса; ssVertical - есть вертикальная полоса; ssBoth - есть обе полосы |
property WantReturns: Boolean; | Если содержит True, нажатие Enter вызывает переход на новую строку, в противном случае обрабатывается системой. Для перехода на новую строку в этом случае следует нажать Ctrl+Enter |
property WantTabs: Boolean; | Если содержит True, нажатие Tab вызывает ввод в текст символа табуляции, в противном случае - обрабатывается системой. Для ввода символа табуляции в этом случае следует нажать Ctrl+Tab |
Замечу, что, если свойство ScrollBars содержит ssHorizontal или ssBoth, свойство wordwrap игнорируется, и длинные строки будут отсекаться границами компонента без переноса текста на следующую строку.
Специфичные методы класса аналогичны методам класса TEdit.
Поскольку компонент является потомком TControl, он имеет также свойство Text, которое содержит отображаемый компонентом текст в виде одной длинной строки. В этой цепочке символов границы строк многострочного текста выделяются символами #13#10 (признак eoln - конец строки). В отличие от этого свойство Lines содержит пронумерованный список строк: первая строка в этом списке имеет индекс 0, вторая - 1, а общее количество строк можно узнать с помощью Lines .count.
Свойство Text удобно использовать для поиска в тексте нужного фрагмента. Чтобы, например, найти и выделить в тексте фрагмент, содержащийся В компоненте edSearch типа TEdit, можно использовать такой обработчик события onclick кнопки btSearch:
procedure TFor.gif" >
TPrinterSetupDialog диалог настройки параметров принтера
18.5.6. TPrinterSetupDialog - диалог настройки параметров принтера
Компонент создает окно настройки параметров принтера, вид которого зависит от типа принтера. Этот диалог взаимодействует с драйвером принтера и не возвращает в программу никакой информации, поэтому его метод Execute - процедура, а не функция.
Вставка графики
21.3.6. Вставка графики
Если вы создаете RTF-файл с помощью редактора Word, вы можете вставлять в текст графические врезки средствами редактора. Единственное ограничение: файлы с графикой должны соответствовать формату bmp. Однако Help-компилятор имеет и собственные средства вставки графических врезок с помощью внешних вмр-файлов. Ниже описывается, как это сделать.
Чтобы вставить в текст графический образ, необходимо поместить на предназначенное для размещения графики место специальную директиву в одном из следующих форматов:
(bmc filename.bmp}
{bml filename.bmp}
{bmr filename.bmp}
Здесь filename - имя вмр-файла; bmc, bml, bmr - команды, управляющие положением картинки относительно текста.
Команда bmc (от BitMap Char) предписывает рассматривать графический образ как символ. В этом случае он располагается точно на том месте в тексте справки, где указана директива вставки. Оставшаяся часть текста слева и справа от директивы разместится соответственно слева и справа от врезки, а высота строки с врезкой будет автоматически выбрана так, чтобы текст не накладывался на картинку. Команды bml (BitMap Left) и bmr (BitMapRight) заставят картинку прижаться соответственно к левому или правому краю окна справки. Все перечисленные в директивах ДМР-файлы должны располагаться в каталоге, указанном в опции bmroot секции [Options] проектного файла (см. п. 21.4.1).
Графический образ может служить ссылкой на пояснение или перекрестной ссылкой. Чтобы придать ему такие свойства, необходимо набрать текст директивы вместе с обрамляющими фигурными скобками перечеркнутым или дважды подчеркнутым шрифтом, если графическая врезка используется в качестве перекрестной ссылки, или подчеркнутым одной линией, если она служит ссылкой на пояснение. Сразу за выделенной таким образом директивой нужно указать скрытым текстом идентификатор связанного раздела. Например:
Этот графический образ [bmc flower.bmp]Bitmap Cross вставлен непосредственно в текст и служит перекрестной ссылкой. {bml hardware.bmp}Bitmap Comment Если щелкнуть мышью по расположенной слева картинке, появится дополнительное окно с пояснениями. Такие окна удобно использовать для пояснения второстепенных деталей справки.
{bmr legal.bmp} Правая картинка не является перекрестной ссылкой. Она просто иллюстрирует одно из многочисленных изображений, поставляемых для текстового редактора MS Word.
На Рисунок 21.5 показан экран Help-службы с графическими вставками. Для его создания использовался приведенный выше фрагмент RTF-файла.
ПРОСТЫЕ ТИПЫ
7.1. ПРОСТЫЕ ТИПЫ
К простым типам относятся порядковые, вещественные типы и тип дата-время.
Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда - название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения.
Вещественные типы , строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
Тип дата-время предназначен для хранения даты и времени. Фактически для этих целей он использует вещественный формат.
СТРУКТУРИРОВАННЫЕ ТИПЫ
7.2. СТРУКТУРИРОВАННЫЕ ТИПЫ
Любой из структурированных типов (а в Object Pascal их четыре: массивы, записи, множества и файлы) характеризуется множественностью образующих этот тип элементов. Каждый элемент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт [ 16-разрядные версии операционной системы Windows З.х используют так называемую “ сегментную” модель памяти, поэтому в Delphi 1 любой структурированный тип не может занимать более одного сегмента (65536 байт). ].
В целях совместимости со стандартным Паскалем в Object Pascal разрешается перед описанием структурированного типа ставить зарезервированное слово packed, предписывающее компилятору по возможности экономить память, отводимую под объекты структурированного типа; но компилятор фактически игнорирует это указание: “упаковка” данных в Object Pascal осуществляется автоматачески везде, где это возможно.
СТРОКИ
7.3. СТРОКИ
Для обработки текстов в Object Pascal используются следующие типы:
короткая строка shortString или string [n] , где n <= 255; длинная строка string; широкая строка WideString; нуль-терминальная строка pchar.Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: для string [n] длина строки меняется от 0 до n, для string и pchar - от 0 до 2 Гбайт.
В стандартном Паскале используются только короткие строки String [n] . В памяти такой строке выделяется n+i байт, первый байт содержит текущую длину строки, а сами символы располагаются начиная со 2-го по счету байта. Поскольку для длины строки в этом случае отводится один байт, максимальная длина короткой строки не может превышать 255 символов. Для объявления короткой строки максимальной длины предназначен стандартный тип ShortString (эквивалент String[255]).
В Windows широко используются нуль-терминальные строки, представляющие собой цепочки символов, ограниченные символом #о. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой.
В 32-разрядных версиях Delphi введен новый тип string, сочетающий в себе удобства обоих типов. При работе с этим типом память выделяется по мере надобности (динамически) и ограничена имеющейся в распоряжении программы доступной памятью. Замечу, что в Delphi 1 тип string эквивалентен String [2 55], т. е. определяет короткую строку максимально возможной длины.
Для совместимости с компонентами, основывающимися на OLE-технологии, в Delphi 32 введены также широкие строки, объявляемые стандартным типом wideString. По своим свойствам они идентичны длинным строкам string, но отличаются от них тем, что для представления каждого символа используются не один, а два байта.
Примеры объявлений строковых типов:
var
ssS: String[250];// Короткая строка длиной до 250 символов
ssMax: ShortString;// Короткая строка длиной до 255 символов
stS : String; // Длинная строка
swS: WideString;// Широкая строка
pcS: PChar; // Ссылка на нуль-терминальную строку
acS: array [0..1000] of Char; // Нуль-терминальная строка
// длиной до 1000 символов
При объявлении переменной sss компилятор выделит для ее размещения 250 + 1 = 251 байт и поместит в первый байт 0 - текущую длину строки. При выполнении такого фрагмента программы:
procedure TfmExample.bbRunClick(Sender: TObject);
var
ssS: String[250];
begin
ssS :='Строка символов';
ssS[6] := ' и'; // Символы в строке нумеруются, начиная с 1
IbOutput.Caption := ssS; // Выводится “Строки символов”
end;
сначала в переменную ssS будет помещена цепочка символов строка символов, причем 1-й байт получит значение 15 (количество символов в строке). После выполнения второго оператора символ с индексом б (индексация байтов начинается с 0, но, поскольку первый байт содержит текущую длину, первый символ в строке имеет индекс 1) будет заменен на “и”, и в переменной окажется цепочка строки символов.
Совершенно другим будет механизм работы с памятью при объявлении длинной строки sts: компилятор выделит для переменной 4 байта, достаточные для размещения номера той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Говорят, что sts ссылается на строку. Такого рода переменные-ссылки называются указателями и обсуждаются в гл. 9. При выполнении первого оператора такого обработчика:
procedure TfmExample.bbRunClick(Sender: TObject);
var
stS, stSS: String;
begin
stS :='Строка символов';
stSS := stS;
stS := 'Это - '+stS;
stS[7] := ' c' ; // Символы в строке нумеруются, начиная с 1
IbOutput.Caption := stS; //Выводится “Это - строка символов”
end;
программа (а не компилятор!) определит длину цепочки символов Строка символов, обратится к ядру перационной системы (ОС) с требованием выделить для нее участок памяти длиной 15+5=20 байт, поместит в переменную sts номер первого выделенного байта [ На самом деле в stS запоминается дескриптор выделенного участка памяти, см. гл. 9. ] и, начиная с него, разместит в этом участке цепочку символов, завершив ее терминальным нулем и 4-байтным счетчиком ссылок. Такое размещение на этапе прогона программы называется динамическим, в то время как размещение на этапе компиляции - статическим. Счетчик ссылок играет важную роль в механизме работы с памятью. С его помощью реализуется “кэширование” памяти: при выполнении оператора
stSS := stS;
память для размещения значения переменной stSS не выделяется, в переменную stSS помещается содержимое указателя sts, а счетчик ссылок в связанной с ним памяти увеличивается на единицу. Таким образом, оба указателя будут ссылаться на одну и ту же область памяти, счетчик ссылок которой будет содержать значение 2. При выполнении оператора
stS := 'Это - '+stS;
счетчик ссылок уменьшается на единицу, выделяется новая область памяти длиной 2 о + б = 2 б байт, указатель на эту область помещается в stS, а в саму память переписывается цепочка символов Это -строка символов, терминальный ноль и содержащий единицу счетчик ссылок. Теперь переменные stS и stss будут ссылаться на разные участки памяти, счетчики ссылок которых будут содержать по единице. Выделенная для размещения строки String область памяти освобождается, если ее счетчик ссылок стал равен нулю.
Похожим образом осуществляется работа с памятью при объявлении переменной pcs типа pchar: компилятор считает эту переменную указателем и выделит для нее 4 байта:
procedure TfmExample.bbRunClick(Sender: TObject);
var
pcS: PChar;
begin
pcS :='Строка символов';
pcS[5] := 'и'; {Символы в нуль-строке нумеруются,начиная с 0}
IbOutput.Caption := pcS; // Выводится “Строки символов”
end;
Программа потребует от ОС 15 + 1 = 16 байт, разместит в памяти цепочку символов и завершающий ее терминальный 0 и поместит адрес выделенного участка памяти в pcs.
Примечание
Примечание
В стандартном паскале, при обращении к области памяти, на которую ссылается указатель , требуется за именем указателя ставить специальный символ .“^”. В Object Раsса1 интенсивно используется динамическая, память, и поэтому, это жесткое требование смягчено: в большинстве случаев (и при обращении к типу pchar в том числе) символ "^" ставить не следует.
И, наконец, последнее объявление acs как массива символов. В Object Pascal считается совместимым с pchar одномерный массив символов с нулевой нижней границей. В отличие от pcs память для такой переменной выделяется статически (в нашем примере компилятор выделит в сегменте данных для переменной acs 1001 байт).
Для размещения в acs нуль-терминальной цепочки символов используется процедура strcopy:
procedure' TfmExample.bbRunClick(Sender: TObject) ;
var
acS: array [0..1000] of Char;
begin
StrCopy(acS,'Строка символов') ;
acS[5] := 'и'; { Символы в нуль-строке нумеруются,начиная с 0}
lbOutput.Caption := acS; // Выводится “Строки символов”
end;
Необходимость в нуль-терминальных строках возникает только при прямом обращении к API-функциям ОС. При работе с компонентами Delphi в основном используются более удобные длинные строки, которые рассматриваются в п. 7.3.1.
И несколько слов о широких строках, 32-разрядные версии Windows используют три сорта символов: однобайтный символ ANSI, двухбайтный символ и символ Unicode. Однобайтный символ связан с одним из 256 возможных значений, которые трактуются в зависимости от установленной в Windows национальной страницы (для размещения кириллицы используется страница 1251). 256 символов вполне достаточны для отображения национального алфавита любого европейского языка. Для отображения алфавитов некоторых азиатских языков этого недостаточно. В этом случае используется двухбайтный символ, в котором младший байт обычно кодируется семибитным ASCII-кодом, а старший указывает, как должен трактоваться этот код (каким символом он будет изображаться в документе или на экране). Символ Unicode в памяти занимает одно слово, которое имеет 65536 возможных значений. Специальная международная комиссия по Unicode выработала соглашение, позволяющее с помощью этого кода представить все символы всех языков мира. Двухбайтные символы и символы Unicode объявляются стандартным типом widecnar, а составленные из них строки - типом widestring. Все Windows-программы, использующие OLE-технологию обмена строками, должны кодировать символы в соответствии с Unicode.
УКАЗАТЕЛИ И ДИНАМИЧЕСКАЯ ПАМЯТЬ
7.4. УКАЗАТЕЛИ И ДИНАМИЧЕСКАЯ ПАМЯТЬ
7.4.1. Динамическая память
Динамическая память - это оперативная память ПК, предоставляемая программе при ее работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от этого статическое размещение осуществляется компилятором Object Pascal в процессе компиляции программы. При динамическом размещении заранее не известны ни тип, ни количество размещаемых данных.
ПСЕВДОНИМЫ ТИПОВ
7.5. ПСЕВДОНИМЫ ТИПОВ
Для любого типа можно объявить сколько угодно псевдонимов. Например:
type
TMyInteger = Integer;
В дальнейшем псевдоним можно использовать так же, как и базовый тип:
var
Mylnt: TMyInteger;
begin
Mylnt := 2*Round(pi);
end;
Такого рода псевдонимы обычно используются для повышения наглядности кода программы. Однако в Object Pascal можно объявлять строго типизированные псевдонимы добавлением зарезервированного слова type перед именем базового типа:
type
TMyIntegerType = type Integer;
var
MylntVar: TMyIntegerType;
С точки зрения компилятора, типизированные псевдонимы совместимы с базовым типом в различного рода выражениях, но фактически они объявляют новый тип данных, поэтому их нельзя использовать в качестве формальных параметров обращения к подпрограммам вместо базового типа. Если, например, объявлена процедура
function MylntFunc(APar: integer): Integer;
begin
end;
то такое обращение к ней
MylntFunc(MylntVar)
будет расценено компилятором как ошибочное.
Строго типизированные псевдонимы заставляют компилятор вырабатывать информацию о типе для этапа прогона программы (RTTI - Run-Time Type Information). Эта информация обычно используется средой Delphi для обеспечения функционирования разного рода редакторов свойств и программ-экспертов.
Секция Config
21.4.7. Секция Config
Секция [Config] предназначена для указания макрокоманд, которые будут выполняться в момент открытия справочной службы. С ее помощью можно также зарегистрировать подпрограммы из библиотеки) DLL, которые после этого могут использоваться наравне с макрокомандами.
Страница InterBase
4.8.7. Страница InterBase
“Родной” для Delphi сервер баз данных InterBase (производитель - InterBase Software Corporation - является дочерним предприятием Borland) имеет непосредственную поддержку в виде компонентов этой страницы. В них используется технология IBExpress, позволяющая отказаться от BDE, ADO или иных подобных механизмов доступа к данным. Все компоненты страницы впервые введены в версии 5.
TButton кнопка
18.1.7. TButton - кнопка
![](image/19-10.gif)
Кнопки TButton широко используются для управления программами. Связанный с кнопкой алгоритм управления реализуется в обработчике события OnClick.
Свойства компонента:
property Cancel: Boolean; | Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Esc |
property Default: Boolean; | Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Enter |
type TModaiResult = Low(Integer)..High(Integer) ; property ModalResult: TModaiResult; | Определяет результат, с которым было закрыто модальное окно (см. ниже пояснение) |
В терминологии Windows модальными окнами называются такие специальные окна, которые, раз появившись на экране, блокируют работу пользователя с другими окнами вплоть до своего закрытия. Обычно с их помощью реализуется диалог, требующий от пользователя принятия некоторого решения. Для этого в состав модального окна включается несколько кнопок. Если у кнопки определено свойство ModalResult, нажатие на нее приводит к закрытию модального окна и возвращает в программу значение ModalResult как результат диалога с пользователем. В Delphi определены следующие стандартные значения ModalResult:
mrNone Модальное окно не закрывается
mrlgnore Была нажата кнопка Ignore
mrOk Была нажата кнопка Oк
mrYes Была нажата кнопка Yes
mrCancel Была нажата кнопка Cancel
mrNo Была нажата кнопка No
mrAbort Была нажата кнопка Abort
mrAll Была нажата кнопка All
mrRetry Была нажата кнопка Retry
В отличие от большинства других видимых компонентов кнопка TButton является компонентом самой Windows и поэтому не может изменять свой цвет произвольным образом - она его меняет вместе с изменением палитры Windows. Кнопка всегда имеет системный цвет clBtnFace и не имеет свойства Color. Шрифт надписи на кнопке может менять свой стиль и размер, но компонент игнорирует изменение его цвета.
TDirectoryListBox панель с именами устройств
18.6.7. TDirectoryListBox - панель с именами устройств
Компонент TDirectoryListBox представляет собой панель с именами каталогов. Совместно с компонентами TDriveComboBox, tfuterComboBox И TFileListBox может использоваться для создания диалоговых окон доступа к файлам. Свойства компонента:
property CaseSensitive: Boolean; | Содержит True, если файловая система чувствительна к высоте букв |
property Directory: String; | Содержит имя каталога |
property DirLabel: TLabel; | Указывает связанный с компонентом объект-метку, в котором отображается полный путь к текущему каталогу |
property Drive: Char; | Содержит имя диска |
property FileList: TFileListBox; | Указывает связанный с компонентом объект TFileListBox, в котором отображается содержимое каталога |
property PreserveCase: Boolean; | Содержит True, если файловая система нечувствительна к высоте букв |
Методы компонента:
function DisplayCase(const S: String): Strings; | Преобразует буквы строки S к строчным с учетом языкового драйвера, если ни свойство CaseSensitive, ни свойство PreserveCase не содержит True |
function FileCompareText(const A, B: String): Integers; | Сравнивает строки а и в с учетом свойства CaseSensitive |
function GetItemPath(Index : Integer) : Strings; | Возвращает путь к дочернему каталогу по его индексу |
procedure OpenCurrent; | Открывает текущий каталог |
procedure Update; | Обновляет текущий каталог |
Для компонента определено событие
property OnChange: TNotifyEvent;
возникающее при любом изменении выбора в окне компонента.
TFindDialog диалог поиска
18.5.7. TFindDialog - диалог поиска
Стандартное диалоговое окно компонента TFindDialog используется для поиска фрагмента текста (Рисунок 18.43).
Свойства компонента:
property FindText: String; | Указывает образец для поиска |
property Left: Integer; | Содержит горизонтальную позицию левого верхнего угла места появления окна |
property Options: TFindOptions; | Определяет настройку диалога (см. ниже) |
property Position: TPoint; | Содержит горизонтальную и вертикальную позицию левого верхнего угла места появления окна |
property Top: Integer; | Содержит вертикальную позицию левого верхнего угла места появления окна |
Для компонента определен следующий тип, использующийся в свойстве options:
TFindOption = (frDown, frFindNext, frHideMatchCase, frHideWholeWord, frHideUpDown, frMatchCase, frDisableMatchCase, frDisableUpDown, frDisableWholeWord, frReplace, frReplaceAll, frWholeWord, frShowHelp) ;
TFindOptions = set of TFindOption;
TShape стандартная фигура
18.2.7. TShape - стандартная фигура
![](image/19-27.gif)
Компонент рисует одну из простейших геометрических фигур, определяемых следующим множеством:
type TShapeType = (stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle) ;
(прямоугольник, квадрат, скругленный прямоугольник, скругленный квадрат, эллипс, окружность). Фигура полностью занимает все пространство компонента. Если задан квадрат или круг, а размеры элемента по горизонтали и вертикали отличаются, фигура чертится с размером меньшего измерения.
Помимо стандартных чертежных инструментов Brush и pen (шрифт для компонента не нужен) в компоненте определено свойство shape.' TShapeType, которое и задает вид геометрической фигуры. Изменение этого свойства приводит к немедленной перерисовке изображения.
TUpDown спаренная кнопка
18.3.7. TUpDown - спаренная кнопка
![](image/19-44.gif)
Компонент TUpDown предназначен для регулирования числовой величины. Он имеет пару кнопок, с помощью которых величина наращивается или уменьшается. Обычно компонент TUpDown связан с другим компонентом класса TEdit, который отображает регулируемую величину и при необходимости может редактировать ее. Связанный компонент называется компаньоном.
Свойства компонента:
TUDAlignButton = (udLeft, udRight) ; property AlignButton: TUDAlignButton; | Определяет положение компонента относительно компаньона: udLeft - TUpDown располагается слева от него; udRight - справа от него |
property Associate: TWinuontrol; | Определяет связанный компонент. TupDown автоматически располагается с нужной стороны компаньона и выравнивает свою высоту с его высотой |
property Increment: Smallint; | Определяет шаг наращивания/уменьшения регулируемой величины |
property Max: Smallint; | Определяет максимальное значение диапазона
изменения регулируемой величины |
property Min: Smallint; | Определяет минимальное значение диапазона изменения регулируемой величины |
TUDOrientation = (udHorizontal,
udVertical) ; property Orientation: TUDOrientation; |
Определяет ориентацию компонента: udHorizontal - по горизонтали; udVertical - по вертикали |
property Positior-.: Sallint; | Содержит текущее значение регулируемой величины |
property Thousands: Boolean; | Если содержит True, в отображение числовой величины в компаньоне вставляются разделители тысяч |
property Wrap: Boolean; | Запрещает/разрешает выход position из диапазона Max...Min (True - запрещает) |
Для компонента определены события
type TUDChangingEvent = procedure (Sender: TObject;
var AllowChange: Boolean) of object;
property OnChar.ging: TUDChanginEvent;
И
type TUDBtnType = (btNext, btPrev) ;
type TUDClickEvent = procedure (Sender: TObject; Button:
TUDBtnType) ;
property OnClick: TUDClickEvent;
Первое возникает при любом изменении регулируемой величины. Обработчик события в параметре AllowChange сообщает, может ли величина измениться. Второе - при щелчке по кнопкам элемента. Параметр Button определяет нажатую кнопку: btprev - вниз или влево; btNext - вверх или вправо.
Выполнение макрокоманд
21.3.7. Выполнение макрокоманд
При открытии того или иного раздела можно выполнить одну или несколько макрокоманд. С помощью макрокоманд можно гибко воздействовать на состояние окна справочной службы: его положение, размеры, цвет, содержимое меню и инструментальных кнопок, отображать другие Help-файлы, выполнять внешние программы и т. д. (см. п. 21.7). Для указания макрокоманды, исполняющейся в момент открытия раздела, ее имя задается в тексте сноски “!”. Сноска указывается вместе с другими сносками в самом начале раздела (до первого символа текста). Например, для вставки в инструментальную панель кнопок просмотра связанных разделов сноска имеет такой вид:
!BrowseButtons ( )
Если нужно указать несколько макрокоманд, они отделяются в тексте сноски символами “;”.
ЛОКАЛИЗАЦИЯ ИМЕН
8.1. ЛОКАЛИЗАЦИЯ ИМЕН
Напомню, что вызов подпрограммы осуществляется простым упоминанием имени процедуры в операторе вызова процедуры или имени функции в выражении. В Delphi 32 функцию можно вызывать точно так же, как и процедуру, т. е. без использования возвращаемого ею значения. Как уже говорилось, любое имя в программе должно быть обязательно описано перед тем, как оно появится среди исполняемых операторов. Не делается исключения и в отношении подпрограмм: каждую свою процедуру и функцию программисту необходимо описать в разделе описаний.
Описать подпрограмму - значит указать ее заголовок и тело. В заголовке объявляются имя подпрограммы и формальные параметры, если они есть. Для функции, кроме того, указывается тип возвращаемого ею результата. За заголовком следует тело подпрограммы, которое подобно программе состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, а в них - описания других подпрограмм и т. д.
Вот какую иерархию описаний получим, например, для программы, структура которой изображена на Рисунок 8.1 (для простоты считается, что все подпрограммы представляют собой процедуры без параметров):
Параметры
8.2.2. Параметры
Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены имена формальных параметров и их типы, например:
Procedure SB(a: Real; b: Integer; с: Char);
Как видно из примера, параметры в списке отделяются друг от друга точками с запятой. Несколько следующих подряд однотипных параметров можно объединять в подсписки, например, вместо
Function F(a: Real; b: Real): Real;
можно написать проще:
Function F(a,b: Real): Real;
Операторы тела подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний:
все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы. Таким способом осуществляется настройка алгоритма подпрограммы на конкретную задачу.
Рассмотрим такой полезный пример. В Object Pascal не предусмотрена операция возведения вещественного числа в произвольную степень[ Начиная с версии 2 с Delphi поставляется модуль Match, в котором есть соответствующая функция. ]. Тем не менее эту задачу можно решить с использованием стандартных математических функций Ехр и Ln по следующему алгоритму:
X Y = e (Y*Ln(X))
Создадим функцию с именем power и двумя вещественными параметрами а и в, которая будет возвращать результат возведения а в степень в. Обработчик события bbRunСlick нашей учебной формы fmExampie читает из компонента edInput текст и пытается выделить из него два числа, разделенных хотя бы одним пробелом. Если это удалось сделать, он обращается к функции power дважды: сначала возводит первое число х в степень второго числа y, затем х возводится в степень -y.
procedure TfmExample.bbRunClick(Sender: TObject);
Function Power(A, B: Real): Real;
{Функция возводит число А в степень В. Поскольку логарифм отрицательного числа не существует, реализуется проверка значения А: отрицательное значение заменяется на положительное, для нулевого числа результат равен нулю. Кроме того, любое число в нулевой степени дает единицу.} begin
if А > 0 then
Result := Ехр(В * Ln(A)) else if A < 0 then
Result := Ехр(В * Ln(Abs(A))) else if В = 0 then
Result := 1 else
Result := 0;
end; // Power var
S: String;
X, Y: Real; begin
{Читаем строку из edinput и выделяем из нее два вещественных числа, разделенных хотя бы одним пробелом.} S := edinput.Text;
if (S = '') or (pos(' ' ,S) = 0) then
Exit; // Лет текста или в нем нет
// пробела - прекращаем дальнейшую работу try
// Выделяем первое число:
X := StrToFloat(copy(S, I, pos(' ', S) - 1));
// Если успешно, удаляем символы до пробела // и выделяем второе число:
Delete (S, 1, pos (' ', S) ) ;
Y := StrToFloat(Trim(S)) ;
except
Exit; // Завершаем работу при ошибке преобразования end;
mmOutput.Lines.Add(FloatToStr(Power(X, Y) ) ) ;
mmOutput.Lines.Add(FloatToStr(Power(X, -Y) ) ) ;
end;
Для вызова функции Power мы просто указали ее в качестве параметра при обращении к стандартной функции преобразования вещественного числа в строку FloatToStr. Параметры х и y в момент обращения к функции power - это фактические параметры. Они подставляются вместо формальных параметров а и в в заголовке функции, и затем над ними осуществляются нужные действия. Полученный результат присваивается специальной переменной с именем Re-suit, которая в теле любой функции интерпретируется как то значение, которое вернет функция после окончания своей работы. В программе функция power вызывается дважды - сначала с параметрами х и y, а затем х и -y, поэтому будут получены два разных результата.
Механизм замены формальных параметров на фактические позволяет нужным образом настроить алгоритм, реализованный в подпрограмме. Object Pascal следит за тем, чтобы количество и типы формальных параметров строго соответствовали количеству и типам фактических параметров в момент обращения к подпрограмме. Смысл используемых фактических параметров зависит от того, в каком порядке они перечислены при вызове подпрограммы. В нашем примере первый по порядку фактический параметр будет возводиться в степень, задаваемую вторым параметром, а не наоборот. Программист должен сам следить за правильным порядком перечисления фактических параметров при обращении к подпрограмме.
Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной, либо, наконец, параметром-константой.
В предыдущем примере параметры а и в определены как параметры-значения. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово var, а если это параметры-константы - слово const, например:
Procedure MyProcedure(var A: Real; В: Real; const C: String);
Здесь а - параметр-переменная, в - параметр-значение, а с - параметр-константа .
Определение формального параметра тем или иным способом существенно в основном только для вызывающей программы: если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр-значение или параметр-константа, то при вызове ему может соответствовать произвольное выражение. Контроль за неукоснительным соблюдением этого правила осуществляется компилятором Object Pascal. Если бы для предыдущего примера был использован такой заголовок функции:
Function Power (A: Real; var В : Real): Real;
то при втором обращении к функции компилятор указал бы на несоответствие типа фактических и формальных параметров (параметр обращения -Y есть выражение, в то время как соответствующий ему формальный параметр B описан как параметр-переменная).
Для того чтобы понять, в каких случаях использовать тот или иной тип параметров, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память (стек) и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра.
Если параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия (фактически в этом случае подпрограмме передается адрес переменной). Изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе.
В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
Итак, параметры-переменные используются как средство связи алгоритма, реализованного в подпрограмме, с внешним миром: с помощью этих параметров подпрограмма может передавать результаты своей работы вызывающей программе. Разумеется, в распоряжении программиста всегда есть и другой способ передачи результатов - через глобальные переменные. Однако злоупотребление глобальными связями делает программу, как правило, запутанной, трудной в понимании и сложной в отладке. В соответствии с требованиями хорошего стиля программирования рекомендуется там, где это возможно, использовать передачу результатов через фактические параметры-переменные.
С другой стороны, описание всех формальных параметров как параметров-переменных нежелательно по двум причинам. Во-первых, это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, и главных, в подпрограмме возможно случайное использование формального параметра, например, для временного хранения промежуточного результата, т. е. всегда существует опасность непреднамеренно испортить фактическую переменную. Вот почему параметрами-переменными следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающей программе. Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем меньше опасность получения не предусмотренных программистом побочных эффектов, связанных с вызовом подпрограммы, тем проще программа в понимании и отладке. По той же причине не рекомендуется использовать параметры-переменные в заголовке функции: если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру или нужным образом декомпозировать алгоритм на несколько подпрограмм. -
Существует еще одно обстоятельство, которое следует учитывать при выборе вида формальных параметров. Как уже говорилось, при объявлении параметра-значения осуществляется копирование фактического параметра во временную память. Если этим параметром будет массив большой размерности, то существенные затраты времени и памяти на копирование при многократных обращениях к подпрограмме можно минимизировать, объявив этот параметр параметром-константой. Параметр-константа не копируется во временную область памяти, что сокращает затраты времени на вызов подпрограммы, однако любые его изменения в теле подпрограммы невозможны - за этим строго следит компилятор.
Еще одно свойство Object Pascal - возможность использования нетипизированных параметров. Параметр считается нетипизированным, если тип формального параметра-переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Заметим, что нетипизированными могут быть только параметры-переменные:
Procedure MyProc(var aParametr);
Нетипизированные параметры обычно используются в случае, когда тип данных несущественен. Такие ситуации чаще всего возникают при разного рода копированиях одной области памяти в другую, например, С помощью процедур BlockRead, BlockWrite, Move-Memory И Т. П.
ОПИСАНИЕ ПОДПРОГРАММЫ
8.2. ОПИСАНИЕ ПОДПРОГРАММЫ
Описание подпрограммы состоит из заголовка и тела подпрограммы.
ПАРАМЕТРЫМАССИВЫ И ПАРАМЕТРЫСТРОКИ
8.3. ПАРАМЕТРЫ-МАССИВЫ И ПАРАМЕТРЫ-СТРОКИ
Может сложиться впечатление, что объявление переменных в списке формальных параметров подпрограммы ничем не отличается от объявления их в разделе описания переменных. Действительно, в обоих случаях много общего, но есть одно существенное различие:
типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому нельзя, например, объявить следующую процедуру:
Procedure S (a: array [1..10] of real);
так как в списке формальных параметров фактически объявляется тип-диапазон, указывающий границы индексов массива.
Если мы хотим передать какой-то элемент массива, то проблем, как правило, не возникает, но если в подпрограмму передается весь массив, то следует первоначально описать его тип. Например:
type
аТуре = array [1..10] of Real;
Procedure S(var a: аТуре);
Поскольку короткая строка является фактически своеобразным массивом, ее передача в подпрограмму осуществляется аналогичным образом:
type
InputType = String [15];
OutputType = String [30];
Function St(S: InputType): OutputType;
Требование описать любой тип-массив или тип-строку перед объявлением подпрограммы, на первый взгляд, кажется несущественным. Действительно, в рамках простейших вычислительных задач обычно заранее известна структура всех используемых в программе данных, поэтому статическое описание массивов не вызывает проблем. Однако разработка программных средств универсального назначения связана со значительными трудностями.
ПРОЦЕДУРНЫЕ ТИПЫ
8.4. ПРОЦЕДУРНЫЕ ТИПЫ
Основное назначение процедурных типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
type
Proc1 = Procedure (a, b, с: Real; var d: Real); Proc2 = Procedure (var a, b);
РгосЗ = Procedure;
Func1 = Function: String;
Func2 = Function (var s: String): Real;
Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.
В следующий программе иллюстрируется механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1 (х) = (sin(x) + 1) * Ехр(-х) и cosi(x) = (Cos(x) + 1) * Ехр(-х) . Вычисление и печать значений этих функций реализуются в процедуре printFunc, которой в качестве параметров передается количество np вычислений функции в диапазоне х от 0 до 2*3.141592 и имя нужной функции.
Function Sinl(X: Real): Real;
begin
Result := (Sin(X) + 1) * Exp(-X) end; // Sin 1
Function Cosl(X: Real): Real;
begin
Result := (Cos(X) + 1) * Exp(-X) end; // Cosi
procedure TfmExample.bbRunClick(Sender: TObject);
type
Func = function (X: Real): Real; // Процедурный тип Procedure PrintFunc(NP: Integer; F; Func) ;
var
k: Integer;
X: Real;
begin
for k := 0 to NP do
begin
X:=k*2*pi/ NP;
mmOutput.Lines.Add(FloatToStrF(X, ffExponent, 10, 2) + #9#9 + FloatToStrF(F(X), ffExponent, 10, 2)) ;
end;
end; // PrintFunc
begin // bbRunClick
nmiOutput.Lines.Add(#9'Функция SINI:');
PrintFunc (10, Sini);
mmOutput.Lines.Add(#9'Функция COSI:');
PrintFunc (10, Cosi);
end;
Обратите внимание: передаваемые подпрограммы не могут быть локальными, т. е. процедурами или функциями, объявленными внутри другой подпрограммы. Вот почему описание подпрогра^.' sini и cosi размещаются вне обработчика bbRunciick, но выше не." по тексту модуля. Замечу, что символ #9 - это символ табуляции. который вставляется в формируемые строки для разделения колонок с цифрами.
В программе могут быть объявлены переменные процедурных типов, например,так:
var
p1 : Proc1;
fl, f2 : Func2;
ар : array [1..N] of Proc1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.
РЕКУРСИЯ И ОПЕРЕЖАЮЩЕЕ ОПИСАНИЕ
8.5. РЕКУРСИЯ И ОПЕРЕЖАЮЩЕЕ ОПИСАНИЕ
Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе.
Рассмотрим классический пример - вычисление факториала. Программа получает от компонента edinput целое число n и выводит в компонент lboutput значение N!, которое вычисляется с помощью рекурсивной функции Factorial.
При выполнении правильно организованной рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к нижнему уровню последовательно до тех пор, пока, наконец, не будет получено тривиальное решение поставленной задачи. В нашем случае решение при n = 0 тривиально и используется для остановки рекурсии.
procedure TfmExample.bbRunClick(Sender: TObject);
Function Factorial(N: Word): Extended;
begin
if N = 0 then
Result : = 1 else
Result := N * Factorial(N-1)
end;
var
N: Integer;
begin
try
N := StrToInt(Trim(edinput.Text));
except
Exit; end;
IbOutput.Caption := FloatToStr(Factorial(N))
end;
Рекурсивная форма организации алгоритма обычно выглядит изящнее итерационной и дает более компактный текст программы, но при выполнении, как правило, медленнее и может вызвать переполнение стека (при каждом входе в подпрограмму ее локальные переменные размещаются в организованной особым образом области памяти, называемой программным стеком).
Рекурсивный вызов может быть косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой содержится обращение к первой, например:
Procedure A (i : Byte);
begin
В (i);
end;
Procedure В (j : Byte) ;
begin
а(j);
end;
Если строго следовать правилу, согласно которому каждый идентификатор перед употреблением должен быть описан, то такую программную конструкцию использовать нельзя. Чтобы такого рода вызовы стали возможны, вводится опережающее описание:
Procedure В (j : Byte) ; For.gif" >
Отображение текста раздела в дополнительном окне
21.3.8. Отображение текста раздела в дополнительном окне
Помимо основного окна в справочной службе можно определить множество дополнительных окон, каждое из которых в общем случае будет иметь свой цвет, заголовок, размеры и т. д. Дополнительные окна описываются в секции [windows] проектного файла (см. п. 21.4.). Чтобы указать, что раздел справки должен по умолчанию отображаться в дополнительном окне, используется ссылка “>” (с помощью модификации гиперссылки можно заменить умалчиваемый тип окна на другой, см. ниже). В тексте ссылки указывается тип окна так, как он определен в проектном файле, например:
> wind
В ссылке “>” может указываться только одно умалчиваемое окно. Другим способом указания дополнительного окна является модификация перекрестной ссылки (см. п. 21.3.1). Если, например, в
ссылке
ГИПЕРТЕКСТ НУРЕКТЕХТ
раздел hypertext должен отображаться в окне windi, ссылка оформляется следующим образом:
ГИПЕРТЕКСТ НУРЕКТЕХТ>WIND1
Окно, указанное в тексте ссылки, имеет приоритет перед умалчиваемым окном, если оно определено сноской">" для раздела. Для нашего примера это означает, что окно windi будет использоваться для отображения ссылки гипертекст даже в том случае, если раздел hypertext имеет сноску “>”, в которой указано другое окно.
Секция BAGGAGE
21.4.8. Секция BAGGAGE
Кнопкой Data Files окна MS HW открывается диалоговое окно определения файлов, которые будет использовать справочная служба. Список этих файлов содержит секция [Baggage] проектного файла. Помимо RTF-файлов, которые обычно вставляются в секции [Files] (см. п. 21.4.2), здесь можно также указать файлы библиотек DLL, подпрограммы которых после этого могут использоваться как макрокоманды.
Страница Decision Cube
4.8.8. Страница Decision Cube
На этой странице представлены компоненты для систем принятия решений на основании анализа многомерных наборов данных. Компоненты этой страницы впервые введены в версии 3.
TBevel кромка
18.2.8. TBevel - кромка
Компонент класса TBevel носит оформительский характер и предназначен для выделения группы элементов или отделения их друг от друга. Свойство
type TBevelShape = (bsBox, bsFrame, bsTopLine, bsBottomLine, bsLeftLine, bsRightLine);
property Shape: TBevelShape;
определяет вид компонента (прямоугольник, рамка, верхняя линия, нижняя линия, левая линия, правая линия).
Свойство
type TBevelStyle = (bsLowered, bsRaised) ;
property Style: TBevelStyle;
задает стиль компонента (вдавленный или выпуклый).
TCheckBox независимый переключатель
18.1.8. TCheckBox - независимый переключатель
![](image/19-11.gif)
Независимый переключатель TCheckBox используется для того, чтобы пользователь мог указать свое решение типа Да/Нет или Да/Нет/Не совсем (в последнем случае в окошке компонента устанавливается флаг выбора, но само окошко закрашивается серым цветом). Это решение отражается в свойстве State компонента, доступном как для чтения, так и для записи. В составе диалогового окна может быть несколько компонентов TCheckBox. Состояние любого из них не зависит от состояния остальных, поэтому такие переключатели называются независимыми.
Типичное использование компонента:
if CheckBoxl.Checked then
else
Или:
case CheckBoxl.State of cbChecked :... ;
cbUnchecked:...;
cbGrayed :...;
end;
Свойства компонента:
type TLeftRight = (taLeftJustify, taRightJustify) ; property Alignment: TLeftRight; | Определяет положение текста: taLeftJustify - с левой стороны компонента; taRightJustify - С Правой стороны |
property AllowGrayed: Boolean; | Разрешает/запрещает использование состояния cbGrayed (Не совсем) |
ptoperty Caption: Strings | Содержит связанный с компонентом текст |
property Checked: Boolean; | Содержит выбор пользователя типа Да/Нет. Состояния cbUnchecked и cbGrayed отражаются как False |
type TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed) ; property State: TCheckBoxState | Содержит состояние компонента: cbUnchecked - нет; cbChecked - да; cbGrayed - не совсем |
Свойство color компонента фактически игнорируется, а свойства Height и width определяют размеры прямоугольника, в котором выводится связанный с переключателем текст, и не влияют на размеры прямоугольного окошка. Сам текст указывается в свойстве Caption.
TDriveComboBox список выбора устройства
18.6.8. TDriveComboBox - список выбора устройства
Компонент TDriveComboBox представляет собой список выбора с именами доступных дисков. Совместно с компонентами TDirectoryListBox, TFilterComboBox И TFileListBox может использоваться для создания диалоговых окон доступа к файлам.
Свойства компонента:
property DirList: TDirectoryList-Box; | Содержит ссылку на объект TDirectoryListBox, в котором отображается структура файлов на диске |
property Drive: Char; TTextCase = (tcLowerCase, tcUp-perCase); property TextCase: TTextCase; | Содержит имя текущего диска Определяет отображение буквы диска: tcLowerCase - отображать строчной буквой; tcuppercase - отображать заглавной буквой |
Для компонента определено событие
property OnChange: TNotifyEvent;
возникающее при любом изменении выбора в окне компонента, а также событие
property OnDropDown: TNotifyEvent;
связанное с раскрытием списка.
THotKey ввод акселератора
18.3.8. THotKey - ввод акселератора
Компонент THotKey служит для ввода или отображения клавиш быстрого выбора (в терминологии Windows их называют горячими клавишами, или акселераторами). При вводе компонент работает
как специализированный однострочный редактор, который распознает нажатие сдвиговых клавиш Shift, Ctrl и Alt и преобразует их в текст <<shift+x”, “ctrl+x” или “Alt+x”, где х - символ совместно нажатой клавиши. Допускается одновременное нажатие двух или
Трех сдвиговых клавиш: Alt+Shift+X, Ctrl+Shift+Alt+X И Т. П.
Свойства компонента:
property AutoSize: Boolean; | Разрешает/запрещает автоматическое изме
нение размеров компонента при изменении шрифта, которым отображается текст в нем |
type TShortCut =
Low(Word)..High(Word) ; property HotKey: TShortCut; |
Содержит код клавиши быстрого выбора |
type THKInvalidKey = (hcNone,
hcShift, hcCtrl, hcAlt, hcCtrlAlt, hcShiftCtrlAlt) ; THKInvalidKeys = set of THKIn validKey; property InvalidKeys: THKInvalid Keys; |
Указывает запрещенные комбинации сдвиговых клавиш: hcNone - запрещено отсутствие сдвиговых клавиш; hcShift - запрещена клавиша Shift; hcCtrlAlt -запрещена
комбинация Ctrl + Alt и т. д. По умолчанию содержит [hcNone, hcShift]. При вводе запрещенной комбинации она заменяется комбинацией, содержащейся в свойстве Modifier |
type THKModifier = (hkShift,
hkCtrl, hkAlt, hkExt); THKModifiers = set of THKModi fier; property Modifiers: THKModifiers; |
Содержит комбинацию сдвиговых клавиш,
которая заменяет собой запрещенную комбинацию. По умолчанию содержит hkAlt, и поэтому нажатие, например, одиночной алфавитно-цифровой клавиши заменяется ее комбинацией с клавишей Alt |
TReplaceDialog диалог поиска и замены
18.5.8. TReplaceDialog - диалог поиска и замены
Компонент TReplaceDialog создает и обслуживает окно поиска и замены текстового фрагмента (см. Рисунок 18.44).
ОСНОВНЫЕ ПОНЯТИЯ
9.1. ОСНОВНЫЕ ПОНЯТИЯ
Классы - это особое “изобретение” программистов для упрощения разработки сложных программ и улучшения их качества. В основе классов лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм.
СОСТАВЛЯЮЩИЕ КЛАССА
9.2. СОСТАВЛЯЮЩИЕ КЛАССА
9.2.1. Поля
Полями называются инкапсулированные в классе данные. Поля могут быть любого типа, в том числе - классами, например:
type TMyClass = class
aIntField: Integer;
aStrField: String;
aObjField: TObject;
end;
Каждый объект получает уникальный набор полей, но общий для всех объектов данного класса набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям только с помощью методов и свойств класса. Однако в Object Pascal разрешается обращаться к полям и напрямую:
type
TMyClass = class
FIntField: Integer;
FStrField: String; end;
var
aObject: TMyClass;
begin
aObject.FIntField := 0;
aObject.FStrField := 'Строка символов';
end;
Класс-потомок получает все поля всех своих предков и может дополнять их своими, но он не может переопределять их или удалять.
Таким образом, чем ниже в дереве иерархии располагается класс, тем больше данных получают в свое распоряжение его объекты.
ОБЪЯВЛЕНИЕ КЛАССА
9.3. ОБЪЯВЛЕНИЕ КЛАССА
Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем - методы и свойства.
Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости перечисляемых в ней полей, методов и свойств - их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т. е. в окне Инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Замечу, что среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция - published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: закрытые элементы описания доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов Автоматизации; область видимости членов этой секции не ограничена.
В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.
Следующий фрагмент кода поясняет области видимости.
Unit Unit1;
Interface
Uses Controls, For.gif" >
ИНТЕРФЕЙСЫ
9.4. ИНТЕРФЕЙСЫ
Интерфейсы играют главную роль в технологиях СОМ (Component Object Model - компонентная модель объектов), CORBA (Common Object Request Broker Architecture - архитектура с брокером требуемых общих объектов) и связанных с ними технологиях удаленного доступа, т. е. технологиях доступа к объектам, расположенным (и выполняющимся) на другой машине. Их основная задача - описать свойства, методы и события удаленного объекта в терминах машины клиента, т. е. на используемом при разработке клиентского приложения языке программирования. С помощью интерфейсов программа клиента обращается к удаленному объекту так, как если бы он был ее собственным объектом.
Тема интерфейсов достаточно обширна и интересна. В этой главе даются лишь самые общие сведения об интерфейсах. Сведение этой темы в одну главу с классами не случайно, т. к. интерфейс представляет собой пустой класс, т. е. класс, в котором провозглашены, но никак не расшифрованы свойства и методы.
Страница QReport
4.8.9. Страница QReport
Около 30 компонентов страницы предназначены для упрощения создания отчетов по материалам, хранящимся в БД. Большинство компонентов страницы впервые введено в версии 2.
TAnimate отображение анимации
18.3.9. TAnimate - отображение анимации
Компонент TAnimate представляет собой проигрыватель видеоклипов формата AVI (Audio Video Interleaved - чередование аудио и видео). Компонент воспроизводит видеочасть файла AVI и игнорирует его звуковое сопровождение. Он способен показывать лишь несжатое изображение или изображение, сжатое по методу RLE (Run-Length Encoding). Изображение воспроизводится в отдельном потоке команд, что освобождает ресурсы программы для выполнения необходимой работы на фоне демонстрации клипа.
Если вы захотите посмотреть компонент в действии (Рисунок 18.24), выполните следующее:
TFilterComboBox список выбора с расширениями файлов
18.6.9. TFilterComboBox - список выбора с расширениями файлов
Компонент TFilterComboBox представляет собой список выбора с расширениями файлов. Совместно с компонентами TDirectoryListBox, TDriveComboBox и TFiieListBox может использоваться для создания диалоговых окон доступа к файлам.
Свойства компонента:
property FileList: TFiieListBox; | Указывает связанный с компонентом объект для просмотра файлов. |
property Filter: String; | Содержит фильтр в виде поясняющего текста и маски. |
property Mask: String; property Text: TCaption; | Содержит текущую маску выбора файлов. Содержит поясняющий текст фильтра. |
Для компонента определено событие
property OnChange: TNotifyEvent;
возникающее при любом изменении выбора в окне компонента, а также событие
property OnDropDown: TNotifyEvent;
связанное с раскрытием списка.
TRadioButton зависимые переключатели
18.1.9. TRadioButton - зависимые переключатели
![](image/19-12.gif)
В отличие от TCheckBox компоненты TradioButton представляют собой зависимые переключатели, предназначенные для выбора одного из нескольких взаимоисключающих решений. На форму (точнее, в компонент-контейнер) помещается по меньшей мере два таких компонента. Они могут иметь только два состояния, определяемых свойством Сhecked. Если в одном компоненте это свойство принимает значение True, во всех других компонентах, расположенных в том же контейнере, свойства Сhecked принимают значения False.
Помимо свойства checked компонент TRadioButton имеет еще одно специфичное свойство - Alignment, аналогичное такому же свойству TCheckBox. Как и в TCheckBox, программист не может изменять размеры и цвет круглого окошка компонента.
TScrollBox панель с прокруткой
18.2.9. TScrollBox - панель с прокруткой
ПРЕОБРАЗОВАНИЕ ВАРИАНТОВ К ДАННЫМ ДРУГИХ ТИПОВ
10.2. ПРЕОБРАЗОВАНИЕ ВАРИАНТОВ К ДАННЫМ ДРУГИХ ТИПОВ
При участии вариантов в выражениях, а также при присваивании их значений переменным других типов тип размещенных в варианте данных преобразуется по следующим правилам:
Здесь
К целым Отнесены varByte, varSmallInt, varlnteger/ varError;
К вещественным — varSingle, varDouble/ varCurrency;
К строковым -var String, varOleStr.
ПОДПРОГРАММЫ ДЛЯ РАБОТЫ С ВАРИАНТАМИ
10.3. ПОДПРОГРАММЫ ДЛЯ РАБОТЫ С ВАРИАНТАМИ
Для работы с вариантами можно использовать такие подпрограммы:
Таблица 10.2. Подпрограммы для работы с вариантами
function VarAsType(const V: Variant; VarType: Integer): Variant; | Преобразует данные варианта V к типу, определяемому параметром VarType |
procedure VarCast(var Dest: Variant; const Source: Variant; Var
Type: Integer) ; |
Преобразует данные варианта Source к типу,определяемому параметром VarType, и помещает результат в переменную Dest |
procedure VarClear(var V: Variant) ; | Освобождает динамическую память, если она была связана с вариантом, и дает ему тип varEmpty |
procedure VarCopy(var Dest: Variant; const Source: Variants; | Копирует параметр Source в вариант Dest |
function VarFrom-DateTime(DateTime: TDateTime):Variant; | Возвращает вариант, содержащий данные DateTime типа дата-время |
function VarIsEmpty(const V:
Variant): Boolean; |
Возвращает True, если вариант V не содержит данных |
function VarIsNull(const V: Vari
ant) : Boolean; |
Возвращает True, если вариант V содержит данные неопределенного типа (varNull) ', |
function VarToDateTime(const V:
Variant): TDateTime) ; |
Преобразует данные варианта V к типу дата-время |
function VarToStr(const V: Vari ant) : String; | Преобразует данные варианта V к строке ; |
function VarType(const V: Variant) : Integer; | Возвращает тип хранящихся в варианте данных i |
ВАРИАНТНЫЕ МАССИВЫ
10.4. ВАРИАНТНЫЕ МАССИВЫ
Значением варианта может быть массив данных, такие варианты называются вариантными массивами. (Не путайте с обычным или динамическим массивом, элементами которого являются варианты!) Значениями элементов вариантного массива могут быть любые допустимые для варианта значения, кроме строк varstring. Значениями элементов вариантного массива могут быть и варианты, а это значит, что в таком массиве могут одновременно храниться данные разных типов (и в том числе строки). Например:
var
V: Variant;
begin
// Создаем одномерный вариантный массив с 5 элементами:
V := VarArrayCreate([0, 4], varVariant);
// Наполняем его:
V[0] := 1; //Тип целый
V[1] := 1234.5678; //Тип вещественный
V[2] := 'Hello world'; //Строковый тип
V[3] := True; //Логический тип
//Пятым элементом исходного массива сделаем еще один массив:
V[4] := VarArrayOf([1, 10, 100, 1000]);
Caption := V[2]; //Hello world
IbOutput.Caption := IntToStr(V[4][2]); //200
end;
Все действия с вариантными массивами осуществляются с помощью следующих процедур и функций:
Таблица 10.3. Подпрограммы для работы с вариантными массивами
function VarArrayCreate(const
Bounds: array of Integer; VarType: Integer): Variant; |
Создает вариантный массив из элементов типа VarType с количеством и границами измерений, указываемых параметром Bounds |
function VarArrayDimCount(const
A: Variant): Integers; |
Возвращает количество измерений вариантного массива А или 0, если А не массив |
function VarArrayHighBound(const
A: Variant; Dim: Integer): Integer; |
Возвращает верхнюю границу индекса вариантного массива А по измерению Dim |
function VarArrayLock(var A:
Variant): Pointer; |
Блокирует массив (предотвращает его возможные изменения размеров) и возвращает указатель на связанные с ним данные |
function VarArrayLowBound(const
A: Variant; Dim: Integer): Integers; |
Возвращает нижнюю границу индекса вариантного массива А по измерению Dim |
function VarArrayOf(const Values:
array of Variant): Variants; |
Создает одномерный вариантный массив по перечню значений, содержащихся в открытом массиве Values. Нижняя граница индексов вариантного массива в этом случае равна 0 |
procedure VarArrayRedim(var A:
Variant; HighBound: Integer) ; |
Изменяет верхнюю границу индекса вариантного
массива А на величину HighBound. Вызов про цедуры игнорируется, если массив был заблоки рован функцией VarArrayLock |
function VarArrayRef(const A:
Variant): Variants; |
Возвращает ссылку на вариантный массив. Ис
пользуется при обращении к API-функциям |
procedure VarArrayUnlock(var A:
Variant) |
Отменяет действие функции VarArrayLock |
ПОЛЬЗОВАТЕЛЬСКИЕ ВАРИАНТЫ
10.5. ПОЛЬЗОВАТЕЛЬСКИЕ ВАРИАНТЫ
Стандартный вариант может хранить только одно из значений, указанных в табл. 10.2. В версии Delphi 6 появились так называемые пользовательские варианты, которые фактически снимают ограничения на характер значений варианта.
Чтобы познакомиться со свойствами новых вариантов, воспользуемся одним из них - вариантом, способным хранить комплексные числа, преобразовывать их в другие типы и осуществлять над ними нужные действия. Как мы увидим дальше, создание пользовательского варианта может быть весьма трудоемким делом - все зависит от сложности хранимых в нем данных. Мы воспользуемся вариантом, созданным разработчиками Delphi и включенным в модуль
VarCmplx.
Создайте такой обработчик bbRunClick:
uses VarCmplx; // Эта ссылка обязательна!
procedure TfmExample.bbRunClick(Sender: TObject);
var
VI, V2: Variants- begin
// Создаем два случайных комплексных числа:
VI := VarComplexCreate(Trunc(Random*1000)/100,
Trunc(Random*1000)/100) ;
V2 := VarComplexCreate(Trunc(Random*1000)/100,
Trunc(Random*1000)/100) ;
with mmOutput.Lines do
begin
// Пустая строка-разделитель
Add ( ' ' ) ;
Add('1-e число: '# 9+V1) ;
Add('2-е число: '#9+V2);
Add('Сложение'#9+(V1+V2));
Add('Вычитание'#9+(V1-V2));
Add('Умножение'# 9+(VI*V2)) ;
Add('Деление'#9#9+(V1/V2))
end
end;
Небольшой комментарий: сложная конструкция Trunc (Random*1000) /100 понадобилась только для того, чтобы реальные и мнимые части комплексных чисел содержали по три значащих цифры.
Вид экрана работающей программы показан на Рисунок 10.1. Как видим, новый вариант легко справляется с поддержкой комплексных чисел: функция VarComplexCreate создает вариант, содержащий комплексное число, а дальнейшее поведение варианта -стандартное (он поддерживает математические операции и преобразование к строковому типу). Однако эта легкость обманчива: исходный текст модуля VarCmplx, который, собственно, и придал варианту дополнительные свойства (по умолчанию располагается в файле Source\Rtl\Common\VarCmplx.pas), содержит более 30000 байт..
На с. 229 показана структура записи TVarData. Два первых байта в этой записи (поле VType) хранят признак значения варианта, остальные 14 могут использоваться для размещения данных.
TDateTimePicker ввод и отображение даты/времени
18.3.10. TDateTimePicker - ввод и отображение даты/времени
Компонент предназначен для ввода и/или отображения даты или времени. На Рисунок 18.26 показаны различные варианты использования компонента.
ДОСТУП К ФАЙЛАМ
11.1. ДОСТУП К ФАЙЛАМ
Файлы становятся доступны программе только после выполнения особой процедуры открытия файла. Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него.
Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре AssignFile :
AssignFile (<ф.п.>, <имя файла>);
Здесь <ф.п.> - файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);
<имя файла > - текстовое выражение, содержащее имя файла и, если это необходимо, маршрут доступа к нему.
Инициировать файл означает указать для этого файла направление передачи данных. В Object Pascal можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно.
Для чтения файл инициируется с помощью стандартной процедуры Reset;
Reset (<ф.п.>);
Здесь <ф. п. > - файловая переменная, связанная ранее процедурой AssignFile с уже существующим файлом.
При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, будет указывать на начало файла, т. е. на компонент с порядковым номером 0.
Примечание
Примечание
Если делается попытка иницийровать чтение из несуществующего файла, возбуждается исключительная ситуация.
Чтобы проверить, существует ли дисковый файл, можно использовать стандартную функцию FileExists, которая возвращает Truе, если указанный при обращении этой функции файл существует, и False - если не существует.
Например
begin
if FileExists(FileName) then
..... // Файл существует
else ..... // Файл не существует
end ;
В Object Pascal разрешается обращаться к типизированным файлам, открытым процедурой Reset (т. е. для чтения информации), с помощью процедуры write (т. е. для записи информации). Такая возможность позволяет легко обновлять ранее созданные типизированные файлы и при необходимости расширять их. Для текстовых файлов, открытых процедурой Reset, нельзя использовать процедуру Write ИЛИ WriteLn.
Стандартная процедура
Rewrite (<ф.п.>);
инициирует запись информации в файл, связанный с файловой переменной <ф.п.>. Процедурой Rewrite нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл (если он был) уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации, и его указатель принимает значение 0.
Стандартная процедура
Append (<ф.п.>)
инициирует запись в ранее существовавший текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедура Append применима только к текстовым файлам, т. е. их файловая переменная должна иметь тип TextFile (см. выше). Процедурой Append нельзя инициировать запись в типизированный или нетипизированный файл. Если текстовый файл ранее уже был открыт с помощью Reset или Rewrite, использование процедуры Арpend приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ
11.2. ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ
Ниже описываются процедуры и функции, которые можно использовать с файлами любого вида. Специфика работы с типизированными, текстовыми и нетипизированными файлами рассматривается в следующих разделах.
Таблица 11.1. Подпрограммы для работы с файлами
Procedure AssignFile(var F; FileName:
String) ; |
Связывает файловую переменную f с именем файла FileName |
function ChangeFileExt
(const FileName, Ex tension: String): Strings; |
Изменяет существующее расширение файла на расширение, заданное параметром Extension |
Procedure ChDir(Path:
String); |
Изменяет текущий каталог: path - строковое выражение, содержащее путь к устанавливаемому по умолчаниюкаталогу |
Procedure CloseFile
(var F) ; |
Закрывает файл, однако связь файловой переменной F с именем файла, установленная ранее процедурой Assign-File, сохраняется. При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CloseFile выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования Процедуры AssignFile |
function DateTime-ToFileDate(DateTime: TDateTime): Integer; | Преобразует значение DateTime в системный формат времени создания (обновления) файла |
Function DiskFree(D:
Byte): Longint; |
Возвращает объем в байтах свободного пространства на указанном диске: D - номер диска (0 - устройство по умолчанию, 1 - диск А ,2- диск В и т, д.). Функция возвращает значение -1, если указан номер несуществующего диска |
function Delete-
File(const FileName: String): Boolean; |
Уничтожает файл с именем (и, возможно, маршрутом доступа) FileName. Возвращает True, если операция прошла успешно |
Function DiskSize(D:
Byte) : Longing; |
Возвращает объем в байтах полного пространства на указанном диске: d - номер диска (0 - устройство по умолчанию, 1 - диск А ,2- диск Д и т. д.). Функция возвращает значение -1, если указан номер несуществующего диска |
Function EOF (var F) :
Boolean; |
Тестирует конец файла и возвращает True, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении - что файл исчерпан |
Procedure Erase(var
F); |
Уничтожает файл f. Перед выполнением процедуры не
обходимо закрыть файл (см. замечание ниже) |
function FileAge(const
FileName: String): In teger; |
Для файла FileName возвращает время его последнего обновления (в системном формате) или -1, если такого файла не существует |
function ExcludeTrai-
lingBack.gif" > |
ТЕКСТОВЫЕ ФАЙЛЫ
11.3. ТЕКСТОВЫЕ ФАЙЛЫ
Текстовые файлы связываются с файловыми переменными, принадлежащими к стандартному типу TextFiie. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, например, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.
Текстовый файл трактуется в Object Pascal как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой строки ставится специальный признак eoln (End Of LiNe - конец строки), а в конце всего файла - признак eof (End Of File - конец файла). Эти признаки можно протестировать одноименными логическими функциями (см. ниже). При формировании текстовых файлов используются следующие системные соглашения:
eoln - последовательность кодов #13 (cr) и #10 (lf);
EOF -КОД #26.
Примечание
Примечание
В Delphi 6 при создании межплатформенных приложений признаком конца строки считается один символ LF(#10)
Для доступа к записям применяются процедуры Read, ReadLn, write, writebn. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур должна стоять файловая
переменная. Обращение осуществляется к дисковому файлу, связанному С Переменной Процедурой AssignFile.
Таблица 11.2. Подпрограммы для работы с текстовыми файлами
Function Eoln(var
F: TextFile): Boolean; |
Тестирует маркер конца строки и возвращает True, если конец строки достигнут |
Procedure Read(var
F: TextFile; V1 [, V2,...,Vn ]); |
Читает из текстового файла последовательность символьных представлении переменных Vi типа char. String, а также любого целого или вещественного типа, игнорируя признаки EOLN |
Procedure ReadLn
(var F: TextFile; [VI [, V2, ...,Vn]]); |
Читает из текстового файла последовательность символьных представлении переменных Vi типа char, String, а также любого целого или вещественного типа с учетом границ строк |
Function
SeekEof(var F: Text): Boolean; |
Пропускает все пробелы, знаки табуляции и маркеры конца строки eoln до маркера конца файла eof или до первого значащего символа и возвращает True, если маркер eof обнаружен |
Function SeekEoln
(var F: TextFile): Boolean; |
Пропускает все пробелы и знаки табуляции до маркера конца строки eoln или до первого значащего символа и возвращает True, если маркер обнаружен |
Procedure Write(var
F: Text; PI [, P2,..., Pn] ) ; |
Записывает символьные представления параметров Pi в текстовый файл |
Procedure WriteLn
(var F: Text; [PI [, P2, ..., Pn]]); |
Записывает символьные представления параметров Pi и при знак конца строки eoln в текстовый файл |
Процедура Read предназначена для последовательного чтения из текстового файла символьных представлений переменных Vi. При чтении переменных типа char выполняется чтение одного символа и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ cr (код #1з), а если достигнут конец файла, то символ eof (код #26). Процедуру Read не рекомендуется использовать для ввода переменных типа string, т. к. она не способна “перепрыгнуть” через разделитель строк eoln и читает только первую строку текстового файла. Для ввода последовательности строк нужно использовать процедуру ReadLn (см. ниже).
Следующая программа “зависнет”, т. к. никогда не будет прочитана вторая строка файла:
procedure TfmExample.bbRunClick(Sender: TObject);
var
F: TextFile;
S: String;
begin
AssignFile(F,'example.pas');
Reset(F);
while- not EOF(F) do
begin
Read(P,S); // Ошибка! Бесконечный цикл!
mmOutput.Lines.Add(S)
end;
CloseFile(F)
end;
При вводе численных переменных процедура Read вначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк eoln пропускаются; после выделения первого значащего символа, наоборот, любой из перечисленных символов или символ eof служат признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления числовой константы, возникает исключительная ситуация. Если при пропуске ведущих пробелов встретился символ eof, переменная получает значение 0. В Object Pascal не предусмотрен ввод шестнадцатеричных констант.
Процедура Read прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура “перескакивает” маркеры конца строк, т. е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовые представления чисел. В сочетании с проверкой конца файла функцией eof процедура Read позволяет организовать простой ввод массивов данных, например, так:
const
N = 1000; // Максимальная длина ввода
var
F : TextFile;
М : array [1..N] of Real;
i : Integer;
begin
AssignFile(F, 'prog.dat');
Reset(F);
i := 1;
while not EOF(f) and (i <= N) do
begin
Read(F, M[i]);
inc (i) end;
CloseFile(F) ;
end.
Процедура ReadLn идентична процедуре Read за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера eoln пропускается, поэтому следующее обращение к ReadLn начинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметров v i „ что приведет к пропуску всех символов текущей строки вплоть до eoln. Если в обработчике bbRunClick (см. пример на предыдущей странице) заменить Read на ReadLn, программа выведет в окно компонента mmout-put все строки из текстового файла example . раs.
Процедура write обеспечивает вывод в текстовый файл группы переменных. Любой элемент списка вывода может иметь форму
OutExpr [ : MinWidth [ : DecPlaces ] ]
Здесь OutExpr - выводимое выражение; MinWidth, DecPlaces - выражения типа integer (квадратные скобки означают возможность отсутствия заключенных в них параметров). Параметр MinWidth, если он присутствует, указывает минимальную ширину поля, в которое будет записываться символьное представление значения OutExpr. Если символьное представление имеет меньшую длину, чем MinWidth, оно будет дополнено слева пробелами, если большую длину, то MinWidth игнорируется и в файл помещается необходимое число символов. Параметр DecPlaces задает количество десятичных знаков в дробной части вещественного числа. Он может использоваться только совместно с MinWidth и только по отношению к выводимому выражению одного из вещественных типов.
Если ширина поля вывода не указана, соответствующий параметр выводится вслед за предыдущим без какого-либо их разделения. Символы и строки передаются выводному файлу без изменений, но снабжаются ведущими пробелами, если задана ширина поля вывода и эта ширина больше требуемой для вывода.
При выводе логических выражений в зависимости от их значения выводятся слова True или False. (Ввод логических констант процедурами Read или ReadLn не предусмотрен.)
Вещественные числа выводятся в экспоненциальном формате, если не указан параметр Decpiaces, в противном случае выбирается формат представления числа с фиксированной точкой. Если подпараметр MinWidth опущен, принимается его значение по умолчанию (23). Если Minwidth меньше 10, считается, что он равен 10. Если подпараметр Decpiaces равен нулю, ни дробная часть числа, ни десятичная точка не выводятся. При отрицательном значении Decpiaces этот параметр игнорируется и число выводится в экспоненциальном формате с учетом Minwidth. Если значение Decpiaces больше 18, принимается значение 18. Следует учесть, что при указании подпараметра Decpiaces вещественное число всегда будет выводиться в формате с фиксированной точкой и требуемым количеством знаков в дробной части, даже если значение подпараметра Minwidth окажется недостаточным для размещения целой части: в этом случае значение Minwidth автоматически увеличивается.
Процедура writebn полностью идентична процедуре Write за исключением того, что выводимая последовательность символов автоматически завершается маркером eoln (свое название процедура получила от Write Line - писать строку). При вызове WriteLn можно опускать параметры Vi-в этом случае в файл передается пустая строка.