П1 7 Окно менеджера трансляций
Рисунок П1.7. Окно менеджера трансляций
![](image/7.gif)
П1.1.4.3. Список ТО-DO
Список то-do предназначен для координации работы нескольких программистов в рамках одного проекта.
Этот список содержит все комментарии проекта, которые начинаются символами //todo: (Рисунок П1.8).
Комментарии содержат сообщения руководителя проекта и/или программистов об обнаруженных ошибках и обычно располагаются там, где обнаружена неточность.
После вызова списка то-do переход к нужному комментарию осуществляется двойным щелчком мыщи на соответствующей строке списка.
Программист может сообщить об устранении ошибки, отметив переключатель в левой части строки списка, - в этом случае текст строки выводится перечеркнутым шрифтом.
П1 10 Окно опций проекта
Рисунок П1.10. Окно опций проекта
На странице Application указывается подпись под пиктограммой свернутой программы (Title), сама пиктограмма (Icon) и имя Help-файла (Help file).
На странице Compiler собраны переключатели, управляющие параметрами процесса компиляции. В том числе (в фигурных скобках указана соответствующая директива компилятора): Optimizations - включает режим оптимизации {$0}, Aligned record fields - размещает данные, выравнивая их на границу 32-разрядного слова {$а}; Stack frames - заставляет компилятор создавать стековые рамы для всех процедур и функций {$W}. Pentium-Safe fdiv - вырабатывает код, предохраняющий от ошибок в вещественных вычислениях на процессорах Pentium ранних выпусков {$U}; Range Checking - создает код проверки выхода за границы массивов {$R}; l/o Checking создает код проверки корректности выполнения операций ввода/вывода {$I}; Overflow checking - вырабатывает код проверки переполнения при выполнении целочисленных операций ($Q}. Strict var-Strings - определяет строгую проверку соответствия строковых типов при обращении к подпрограммам {$V}. Complete Boolean Eva1 - определяет полное вычисление логических выражений {$B}; Extended Syntax - включает расширенный синтаксис Object Pascal {$xf; Typed @ Operator - контролирует типы указателей в операции @ {$Т}; open Parameters - разрешает использование открытых параметров в подпрограммах {$р}. Huge Strings - связывает зарезервированное слово String с длинными строками {$Н}; Assignable Typed Constants - разрешает присваивание типизированным константам {$J}; Debug information - помещает в DCU-файл отладочную информацию {$D}; Local Symbols - создает отладочную информацию о локальных символах программы {$l};
Symbol information - создает отладочную информацию о символах программы {$y}, Show Hints - заставляет компилятор выдавать рекомендации; Show Warnings - заставляет компилятор выдавать предупреждающие сообщения; Assertions - заставляет вырабатывать код для отладочных процедур Assertion {$C}.
Страница Linker определяет параметры компоновщика, в том числе: Off - запрещает создавать карту распределения памяти; Segments - карта содержит список модулей и адреса точек входа всех подпрограмм; Publics - дополняет Segments отсортированным списком символов секций public; Detailed - дополняет Public детальной информацией о модулях; Generate dcus - создает стандартные для Delphi DCU-фаЙлы; Generate С Object files - создает файлы в формате объектов языка С; Generate C++ Object files - создает файлы для связывания с программой, созданной С помощью C++ Builder; Generate Console Application - создает консольную программу; include TD32 Debug info - помещает в исполняемый файл информацию для внешнего отладчика; include remote debug symbols-используется для удаленного вызова отладчика; Min Stack Size-устанавливает минимальный размер стека; мах Stack size - устанавливает максимальный размер стека; image Base - указывает начальный адрес для загрузки изображений (для dll); exe Descriptor - информационная строка длиной до 255 символов, которая включается в исполняемый файл (например, для объявления авторских прав).
Страница Directories/Conditionals задает каталоги размещения и условные символы: Output Directory - указывает каталог размещения исполняемого файла; Unit Output Directory - указывает каталог размещения Dcu-файлов;
Search Path - каталог размещения файловых с исходными текстами программы, если они не обнаружены в текущем каталоге; при необходимости указать несколько каталогов в любом из описанных выше окон они разделяются точкой с запятой; Debug source path - определяет каталог размещения внешнего отладчика; bpl output directory - указывает папку размещения файлов компиляции пакетов; dcp output directory - определяет каталог размещения файлов для локализации программ; Conditional Defines - определяет символы для условной компиляции; Unit Aliases-определяет псевдонимы модулей.
На странице Versioninfo сосредоточены параметры управления информацией о версии программы: include version information in project - если переключатель выбран, в проект включается информация о версии программы, которую можно прочитать после щелчка правой кнопкой мыши на пиктограмме программы и выборе Properties; Module Version Number - поля Major, Minor, Release, Build определяют составной номер версии; Auto-increment build number - если переключатель активен, номер версии автоматически наращивается при каждой компиляции программы; Debug Build - указывает на создание отладочной версии программы; Pre-Release - указывает на создание некоммерческой версии программы; Special Build - казывает на специальную версию программы; Private Build - указывает на версию, не предназначенную для широкого распространения; dll - создается динамическая библиотека; Language id - идентификатор языка, на который рассчитана программа.
П1 13 Окно службы OpenHelp
Рисунок П1.13. Окно службы OpenHelp
![](image/13.gif)
Для добавления справочного файла (.hlp) выбирается закладка index, щелкается та же кнопка и указывается положение hlp-файла.
Как показывает практика, эти два действия вполне достаточны для нормального подключения к справочной службе новой информации. Если вы закроете окно OpenHelp, появится запрос - нужно ли обрабатывать внесенные изменения. После утвердительного ответа новый вариант справочной службы будет готов к работе.
П1 14 Окно настройки параметров Coda Insight
Рисунок П1.14 . Окно настройки параметров Coda Insight
![](image/14.gif)
Остальные элементы окна Code insight:
Code Completion - разрешает/запрещает появление окна с именами свойств и методов класса после ввода имени объекта и точки (Рисунок П 1.15).
Code Parameters - разрешает/запрещает появление окна с именами формальных параметров обращения к подпрограмме после ввода имени подпрограммы и открывающей скобки (Рисунок П 1.15).
Tooltip Expression Evaluations - разрешает/запрещает появление окна с указанием текущего значения переменной, над именем которой располагается указатель мыши в режиме отладки
Tooltip Symbol Insight - разрешает/запрещает появление окна с указанием параметров идентификатора, над которым располагается указатель мыши.
Delay - определяет задержку в секундах включения механизма показа окон Code Insight.
П1 15 Окна Code Insight
Рисунок П1.15. Окна Code Insight
![](image/15.gif)
П1 16 Окно точек останова
Рисунок П1.16. Окно точек останова (слева) и окно добавления новой точки (справа)
![](image/16.gif)
П1 17 Окно наблюдения
Рисунок П1.17. Окно наблюдения и окно добавления в него нового выражения
![](image/17.gif)
П1 18 Фрагмент окна редактора в режиме отладки
Рисунок П1.18. Фрагмент окна редактора в режиме отладки
![](image/18.gif)
Кстати, чтобы установить/снять точку контрольного останова, достаточно щелкнуть мышью по служебной зоне слева от нужной строки или установить в эту строку текстовый курсор и нажать F5.
При нажатии F7 среда выполняет те же действия, что и при нажатии F8, однако, если в текущей строке содержится вызов подпрограммы пользователя, программа прервет свою работу перед выполнением первого исполняемого оператора этой подпрограммы, т.е. клавиша F7 позволяет прослеживать работу вызываемых подпрограмм.
После трассировки нужного фрагмента программы можно продолжить нормальную ее работу, нажав клавишу F9.
Содержание справочной службы Delphi
Рисунок 21.8. Содержание справочной службы Delphi:
![](image/21-14.gif)
После создания файла содержания его нужно сохранить в том же каталоге, что и нlр-файл, - после этого содержание станет доступно в момент запуска нlр-файла или с помощью кнопки содержание окна справочной службы.
Сообщение об ошибке вызова раздела
Рисунок 21.10. Сообщение об ошибке вызова раздела
![](image/21-16.gif)
Стандартное окно компонента TColorDialog
Рисунок 18.41 . Стандартное окно компонента TColorDialog
![](image/19-63.gif)
Стандартное окно компонента TFindDialog
Рисунок 18.43 . Стандартное окно компонента TFindDialog
![](image/19-65.gif)
Его значения имеют следующий смысл:
frDown frFindNext | Устанавливает поиск вперед по тексту |
frHideMatchCase | Сообщает программе, что пользователь нажал кнопку Найти далее Убирает выбор в переключателе с учетом регистра |
frHideWholeWord | Убирает выбор в переключателе только слово целиком |
frHideUpDown | Прячет кнопки выбора направления поиска |
frMatchCase | Устанавливает выбор в переключателе с учетом регистра |
frDisableMatchCase | Запрещает выбор С учетом регистра |
frDisableUpDown | Запрещает выбор направления поиска |
frDisableWholeWord | Запрещает выбор только слово целиком |
frReplace | Используется в компоненте TReplacteDialog и указывает на необходимость замены текущего выбора |
frReplaceAll | Используется в компоненте TreplaceDialog и указывает на необходимость замены всех вхождений образца поиска |
frWholeWord | Устанавливает выбор в переключателе Только слово целиком. |
frShowHelp | Включает в окно кнопку Help |
Спецификой диалога является реализуемая им возможность просмотра найденного фрагмента и при необходимости продолжение поиска. С этой целью для компонента определено событие OnFind:
TNotifyEvent, которое возникает всякий раз, когда пользователь нажимает кнопку найти далее. Обработчик события должен найти образец в тексте и показать его пользователю. Пусть, например, компонент Memol содержит отыскиваемый фрагмент и поиск идет с учетом регистра. Тогда обработчик может иметь такой вид:
procedure TFor.gif" >
Стандартное окно компонента TPrintDialog
Рисунок 18.42. Стандартное окно компонента TPrintDialog
![](image/19-64.gif)
Свойства компонента:
property Collate: Boolean; | Если имеет значение True, окно показывается с выбранным переключателем разобрать (collate). Если этот переключатель выбран, печать нескольких копии документа будет идти по копиям: сначала первая копия, затем вторая и т. д., в противном случае - по страницам: сначала все копии первой страницы, затем второй и т. д |
property Copies: Integer; | Определяет количество копии (0 - одна копия) |
property FromPage: Integer | Определяет начальную страницу печати |
property MaxPage: Integers; | Определяет верхнюю границу диапазона страниц для свойств FromPage, ToPage |
property MinPage: Integer; | Определяет нижнюю границу диапазона страниц для свойств FromPage, ToPage |
TPrintDialogOption =
(poPrintToFile, poPageNums, poSe- lection, poWarning, poHelp, poDisablePrintToFile) ; TPrintDialogOptions = set of TPrintDialogOption; property Options: TPrintDialogOptions; |
Определяет настройку окна: poPrintToFile - печатать в файл; poPrintToFile - разрешает выбор диапазона страниц; poSelection - разрешает печать выбранного текста; poWarning - предупреждать пользователя о неустановленном принтере; poHelp вставить в окно кнопку Help; poDisablePrintToFile - запрещает печать в файл |
TPrintRange = (prAllPages, prSelection, prPageNums) ;
property PrintRange: TPrintRange; |
Определяет диапазон печатаемых страниц: prAllPages - все страницы; preelection - выделенный фрагмент текста; prPageNums - страницы по номерам |
property PrintToFile: Boolean; | Содержит True, если пользователь выбрал печать в файл |
property ToPage: Integer; | Определяет конечную страницу печати |
Стандартное окно компонента TReplaceDialog
Рисунок 18.44 . Стандартное окно компонента TReplaceDialog
![](image/19-66.gif)
Класс TReplaceDialog является прямым потомком класса TFindDialog и наследует от него большинство свойств. Дополнительно в компоненте определено свойство RepiaceText: string, в котором содержится текст замены, и событие OnRepiace, которое возникает
При нажатии кнопки заменить или з аменить все.
Стандартное окно TFontDialog
Рисунок 18.40. Стандартное окно TFontDialog
![](image/19-62.gif)
Диапазон возможных значений размеров шрифтов определяется свойствами MinFontSize и MaxFontSize. Значения этих свойств задаются в пунктах (1 пункт равен1/72 дюйма, что приблизительно равно 0,36 мм). Если свойства содержат 0, ограничения на размер шрифта отсутствуют.
Свойство
TFontDialogOption = (fdAnsiOnly, fdTrueTypeOnly, fdEffects, fdFixedPitchOnly, fdFor.gif" >
Стандартное окно TOpenDialog
Рисунок 18.38 . Стандартное окно TOpenDialog
![](image/19-60.gif)
Свойство Filter: string используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. Это свойство можно устанавливать с помощью специального редактора на этапе конструирования формы или программно, как это сделано в предыдущем примере. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна Инспектора объектов. При программном вводе фильтры задаются одной длинной строкой, в которой символы “|” служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора. Например, оператор
OpenDialogI.Filter := 'Текстовые файлы|*.txt| Файлы Паскаля|*.раs';
задает две маски - для отбора файлов с расширениями раs и TXT.
Установить начальный каталог позволяет свойство InitialDir string. Например:
OpenDialogI.InitiaiDir := 'c:\program files\borland\delphi5\source';
С помощью свойства DefaultExt: String [ 3 ] формируется полное имя файла, если при ручном вводе пользователь не указал расширение. В этом случае к имени файла прибавляется разделительная точка и содержимое этого свойства.
В диалоговом окне для ручного ввода предусмотрен элемент TEdit, который при желании можно заменить на TCоmbовох. Для этого необходимо свойству FileEditStyle придать значение fsComboBox вместо умалчиваемого fsEdit. Если выбран комбинированный список, с ним можно связать протокол выбора имен. Для этого используется свойство HistoryList: TStrings, содержимое которого будет появляться в выпадающем списке. Этот список не пополняется автоматически, поэтому за его содержимым должна следить программа. Например:
if OpenDialogI.Execute then
begin
HistoryList.Add(OpenDialogI.FileName);
end;
Настройка диалога может варьироваться с помощью свойства
TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCre-atePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCre-ate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, of-NoDereferenceLinks) ;
TOpenOptions = set of TOpenOption;
property Options: TOpenOptions;
Значения этого свойства имеют следующий смысл:
ofReadOnly | Устанавливает переключатель Только для чтения |
ofOverwritePrompt | Требует согласия пользователя при записи в существующий файл |
ofHideReadOnly | Прячет переключатель Только для чтения |
OfNoChangeDir | Запрещает смену каталога |
ofShowHelp | Включает в окно кнопку Help |
ofNoValidate | Запрещает автоматическую проверку правильности набираемых в имени файла символов |
OfAllowMultiSelect | Разрешает множественный выбор файлов |
ofExtensionDifferent | При завершении диалога наличие этого значения в свойстве options говорит о том, что пользователь ввел расширение, отличающееся от умалчиваемого |
ofPathMustExist | Разрешает указывать файлы только из существующих каталогов |
ofFileMustExist | Разрешает указывать только существующие файлы |
ofCreatePrompt | Требует подтверждения для создания несуществующего файла |
ofShareAware | Разрешает выбирать файлы, используемые другими параллельно выполняемыми программами |
OfNoReadOnlyReturn | Запрещает выбор файлов, имеющих атрибут Только для чтения |
ofNoTestFileCreate | Запрещает проверку доступности сетевого или локального диска |
OfNoNetworkButton | Запрещает вставку кнопки для создания сетевого диска |
ofNoLongNames | Запрещает использование длинных имен файлов |
ofOldStyleDialog | Создает диалог в стиле Windows 3-х |
Если разрешен множественный выбор, доступ к выбранным именам можно получить в свойстве Files: strings.
Назад
|
Стандартное окно TopenPictureDialog
Рисунок 18.39. Стандартное окно TopenPictureDialog
![](image/19-61.gif)
Стандартные курсоры Delphi
Рисунок 17.2. Стандартные курсоры Delphi
![](image/17-2.gif)
В практике программирования часто возникает необходимость изменения формы указателя для всех окон программы. Например, при выполнении достаточно длительного по времени процесса указатель мыши часто принимает вид crHourGlass, а после завершения процесса - восстанавливает свой первоначальный вид. Чтобы изменить форму указателя для всех окон программы одновременно, используется свойство cursor у глобального объекта screen, который автоматически создается для каждой программы:
Screen.Cursor := crHourGiass;
..... //Делаем длительную работу
Screen.Cursor := crDefault; // Восстанавливаем начальную
// форму указателя
Программист может создать и использовать нестандартный указатель. При этом он должен:
с помощью редактора изображений Delphi создать изображение указателя и разместить это изображение в ресурсном файле программы; в работающей программе сначала загрузить указатель из ресурсного файла с помощью функции LoadCursor и зарегистрировать его в списке cursors объекта screen, а уже только после этого назначать нестандартный указатель свойствам cursor компонентов или экрана.Рассмотрим процесс создания и использования нестандартного указателя на следующем примере, в котором создается и используется указатель в виде окружности.
Выберите опцию меню Tools | image Editor, чтобы загрузить редактор изображений Delphi. В окне редактора сначала выберите File | New | Resource File, а затем - Resource | New | Cursor. Окно редактора к этому моменту должно иметь вид, показанный на Рисунок 17.3.Структура типов данных
Рисунок 7.1. Структура типов данных
![](image/7-1.gif)
Для целых типов функция ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ord(X) зависит от свойств этого типа.
К порядковым типам можно также применять функции:
pred(x) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру
ord (X) -1), т. е. Ord(Pred(X)) = Ord(X) - 1;
succ (X) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ord (X) +1, т. е.
Ord(Succ(X)) = Ord(X) + 1.
Например, если в программе определена переменная
var
с : Char;
begin
с := '5';
end;
то функция PRED(C) вернет символ '4', а функция SUCC(C) - символ '6'.
Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция pred(x) не определена для левого, a succ (X) - для правого конца этого отрезка.
Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байтов. В табл. 7.1 приводятся названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений. Таблица 7.1. Целые типы
Название | Длина,байт | Диапазон значений |
Cardinal | 4 | 0. .. 2 147 483 647 |
Byte | 1 | 0...255 |
Shortint | 1 | -128...+127 |
Smallint | 2 | -32 768...+32 767 |
Word | 2 | 0...65 535 |
Integer | 4 | -2 147 483 648...+2 147 483 647 |
Longint | 4 | -2 147 483 648...+2 147 483 647 |
Int64 | 8 | -9*10 18 . ..+9*10 18 |
LongWord | 4 | 0. . .4 294 967 295 |
Примечание
Примечание
Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип integer для этой версии занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.
При использовании процедур и функций с целочисленными параметрами следует руководствоваться “вложенностью” типов, т. е. везде, где может использоваться word, допускается использование Byte (но не наоборот), в Longint “входит” Smallint, который, в свою очередь, включает в себя Shortint.
Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 7.2. Буквами b, s, w, i, l обозначены выражения соответственно типа Byte, Shortint, Word, Integer И Longint,
х - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.
Таблица 7.2. Стандартные процедуры и функции, применимые к целым типам
Обращение | Тип результата | Действие |
abs (x) | x | Возвращает модуль x |
chr(b) | Char | Возвращает символ по его коду |
dec (vx [, i] ) | - | Уменьшает значение vx на i, а при отсутствии i - на 1 |
inc(vx[,i]) | - | Увеличивает значение vx на i, а при отсутствии i -на 1 |
Hi(w) | Byte | Возвращает старший бант аргумента |
Hi(I) | То же | Возвращает третий по счету байт |
Lo(i) | “ | Возвращает младший байт аргумента |
Lo(w) | “ | То же |
odd(l) | Boolean | Возвращает True, если аргумент-нечетное число |
Random(w) | Как у параметра | Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l) |
sqr(x) | X | Возвращает квадрат аргумента |
swap(i) | Integer | Меняет местами байты в слове |
swap (w) | Word | Тоже |
При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с shortint и word общим будет тип integer. В стандартной настройке компилятор Delphi не вырабатывает код, осуществляющий контроль за возможной проверкой выхода значения из допустимого диапазона, что может привести к недоразумениям.
Например, при прогоне следующей программы на экране появится значение 0:
procedure TfmExample.bbRunClick(Sender: TObject) ;
var
k: Word;
begin
k := 65535; // Максимальное значение типа Word
k := k+1; // По правилам математики
k=65536 IbOutput.Caption := IntToStr(k); // На самом деле k=0!
end;
Если активизировать переключатель project | options | Compiler I Range checking и повторить компиляцию с помощью Project | Build All, компилятор вставит в программу код проверки переполнения и при прогоне программы возникнет исключительная ситуация, которую при желании можно соответствующим образом обработать. Замечу, что, если изменить программу следующим образом:
k := 65535; // Максимальное значение типа Word
IbOutput.Caption := IntToStr(k + 1);// Будет выведено 65536
переполнения не произойдет, т. к. 32-разрядный компилятор версий Delphi 32 автоматически преобразует операнды выражения k+i к 4-байтным величинам.
Логические типы. К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина). Для них справедливы правила:
Ord(False) = 0;
Ord(True) <> 0;
Succ(False)= True;
Pred(True) = False.
Поскольку логический тип относится к порядковым типам, его можно использовать в операторе цикла счетного типа, например:
var
l : Boolean;
begin
for l := False to True do ....
Однако необходимо помнить, что в Delphi 32 для Boolean значение
Ord (True) = +1, В ТО Время как для других типов (Bool, WordBool И Т.Д.)
Ord (True) = -1, поэтому такого рода операторы следует использовать с осторожностью!. Например, для версии Delphi 6 исполняемый оператор showMessage (' --- ') в следующем цикле for не будет выполнен ни разу:
var
L: Bool;
k: Integer;
begin
for L := False to True do ShowMessage ('--);
end; __
Если заменить тип параметра цикла l в предыдущем примере на Boolean, цикл будет работать и сообщение дважды появится на экране.[ Для Delphi версии 1 и 2 ord (True) =+1 для любого логического типа. ]
Символьный тип. Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне О...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.
Для кодировки в Windows используется код ANSI (назван по имени American National Standard Institute - американского института стандартизации, предложившего этот код). Первая половина символов ПК с кодами 0... 127 соответствует таблице 7.3. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman для представления символов кириллицы (без букв “ё” и “Ё”) используют последние 64 кода (от 192 до 256): “А”... “Я” кодируются значениями 192..223, “а”... “я” - 224...255. Символы “Ё” и “ё” имеют соответственно коды 168 и 184.
Таблица 7.3. Кодировка символов в соответствии со стандартом ANSI
Код | Символ | Код. | Символ | Код. | Символ | Код | Символ |
0 | NUL | 32 | BL | 64 | @ | 96 | ' |
1 | ЗОН | 33 | ! | 65 | А | 97 | а |
2 | STX | 34 | “ | 66 | В | 98 | b |
3 | ЕТХ | 35 | # | 67 | С | 99 | с |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | Е | 101 | е |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | ' | 71 | G | 103 | д |
8' | BS | 40 | ( | 72 | Н | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | К | 107 | k |
12 | FF | 44 | f | 76 | L | 108 | 1 |
13 | CR | 45 | - | 77 | М | 109 | m |
14 | SO | 46 | 78 | N | 110 | n | |
15 | SI | 47 | / | 79 | 0 | 111 | о |
16 | DEL | 48 | 0 | 80 | Р | 112 | P |
17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC 4 | 52 | 4 | 84 | Т | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | ETB | 55 | 7 | 87 | W | 119 | W |
24 | CAN | 56 | 8 | 88 | х | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | У |
26 | SUB | 58 | : | 90 | Z | .122 | z |
27 | ESC | 59 | ; | 91 | t | 123 | { |
28 | FS | 60 | < | 92 | \ | 124 | 1 |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | Л | 126 | ~ |
31 | US | 63 | f | 95 | 127 | r |
Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.
К типу char применимы операции отношения, а также встроенные функции:
Сhr (в) - функция типа char; преобразует выражение в типа Byte в символ и возвращает его своим значением;
UpCase(CH) - функция типа char; возвращает прописную букву, если сн - строчная латинская буква, в противном случае возвращает сам символ сн (для кириллицы возвращает исходный символ).
Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:
type
colors = (red, white, blue);
Применение перечисляемых типов делает программы нагляднее. Если, например, в программе используются данные, связанные с месяцами года, то такой фрагмент программы:
type
ТипМесяц=(янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек);
var
месяц : ТипМесяц;
begin
if месяц = авг then
IbOutput.Caption := 'Хорошо бы поехать к морю!';
end.
был бы, согласитесь, очень наглядным. Увы! В Object Pascal нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены писать так:
type
TypeMonth=(jan,feb,mar,may,jun,jul,aug,sep,oct,nov,dec);
var
month: TypeMonth;
begin
if month = aug then
IbOutput.Caption := 'Хорошо бы поехать к морю!';
end.
Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер О, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.
Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисляемые типы:
type
colors = (black, red, white);
ordenal= (one, two, three) ;
days = (Monday, Tuesday, Wednesday);
С точки зрения мощности и внутреннего представления все три типа эквивалентны:
Ord(black)=0, ... , Ord(white)=2,
Ord(one)=0, ... , Ord(three)=2,
Ord(Monday)=0, ... , Ord(Wednesday)=2.
Однако если определены переменные
var
col : colors;
num : ordenal;
day : days ;
то допустимы операторы
col := black;
num := Succ(two);
day := Pred(Tuesday);
но недопустимы
col := one;
day := black;
Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией Ord(X). В Object Pascal допускается и обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с'именем перечисляемого типа. Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания:
col := black;
col := colors (0) ;
Разумеется, присваивание
col := 0;
будет недопустимым, т. к. перечисляемому типу нельзя присвоить целое значение.
Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например:
var
col: (black, white, green);
Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона.
Тип-диапазон задается границами своих значений внутри базового типа:
<мин.знач.>..<макс.знач.>
Здесь <мин. знач. > - минимальное значение типа-диапазона; <макс. знач. > - максимальное его значение.
Например:
type
digit = '0'..'9';
dig2 = 48 .. 57;
Тип-диапазон не обязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной, например:
var
date : 1. .31;
month: 1..12;
Ichr : 'А'..'Z';
При определении типа-диапазона нужно руководствоваться следующими правилами:
два символа “..” рассматриваются как один символ, поэтому жду ними недопустимы пробелы; левая граница диапазона не должна превышать его правую границу.Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная
type
days = (то,tu,we,th,fr,sa,su);
WeekEnd = sa .. su;
var
w : WeekEnd;
begin
w := sa;
end;
to ord(w) вернет значение 5, в то время как pred(W) приведет к ошибке.
В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами:
High(X) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х;
Low (X) - возвращает минимальное значение типа-диапазона.
Свойства компонента
Свойства компонента:
![](image/19-13.gif)
property AutoComplete: Boolean; | Определяет, будет ли компонент автоматически получать фокус ввода при нажатии пользователем на клавиатуру |
type TBorderStyle = bsNone..-bsSingle; property Border-Style: TBorderStyle; | Определяет стиль рамки: bsNone - нет рамки; bssingle - рамка толщиной 1 пиксель |
property Canvas: TCanvas; property Columns: Longing; | Канва для программной прорисовки элементов Определяет количество колонок элементов в списке |
property Count: Integer; | Содержит количество строк в компоненте |
property ExtendedSelect: Boolean; | Если ExtendedSelect =True и MultiSelect==True, выбор элемента без одновременного нажатия Crtl или Alt отменяет предыдущий выбор |
property IntegralHeight:Boolean; | Если IntegralHeight=True и Style<>lb0wner-DrawVariabe, в списке показывается целое число элементов |
property ItemHeight: Integer; | Определяет высоту элемента в пикселях для Style=lbOwnerDrawFixed |
property Itemlndex: Integer; | Содержит индекс сфокусированного элемента. Если MultiSelect=False, совпадает с индексом выделенного элемента |
property Items: TStrings; | Содержит набор строк, показываемых в компоненте |
property MultiSelect: Boolean; | Разрешает/отменяет выбор нескольких элементов |
property SelCount: Integer; | Содержит количество выбранных элементов |
property Selected[X: Integer] : Boolean; | Содержит признак выбора для элемента с индексом х (первый элемент имеет индекс 0) |
property Sorted: Boolean; | Разрешает/отменяет сортировку строк в алфавитном порядке |
type TListBoxStyle =
(IbStandard, IbOwnerDrawFixed, IbOwnerDrawVariable) ; property Style: TListBoxStyle; |
Определяет способ прорисовки элементов:
IbStandard - элементы рисует Windows; ibOwnerDrawFixed - рисует программа, все элементы имеют одинаковую высоту, определяемую свойством ItemHeight;IbOwnerDrawVariable -рисует программа, элементы имеют разную высоту |
property TabWidth: Integer; | Задает ширину табуляционного пробела |
property Toplndex: Integer; | Индекс первого видимого в окне элемента |
Создание элементов (опций) списка компонента реализуется с помощью методов его свойства Items - Add, Append, Insert млм LoadFromFile (CM. П. 16.3.1).
Для компонента определены два события, связанные с программной прорисовкой элементов списка:
type
TOwnerDrawState = set of (odSelecred, odGrayed, odDisabied, odChecked, odFocused) ;
TDrawItemEvent = procedure(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState) of object-property OnDrawItem: TDrawItemEvent;
type
TMeasureItemEvent = procedure(Control: TWinControl; Integer;
var Height: Integer) of object/property OnMeasureItem: TMeasureItemEvent;
Первое событие возникает в момент, когда программа должна нарисовать очередной элемент. Обработчик события получает ссылку на список выбора control, индекс изображаемого элемента index, границы элемента Rect и его состояние State. Прорисовка ведется с помощью свойства Canvas.
Примечание
Примечание
Поскольку программная прорисовка обычно связана с изображением рисунков, сохраняемых вместе с текстом в наборе Items; параметр Control задан как абстрактный объект TWinGontrol, поэтому в обработчике должно проводиться необходимое преобразование типов.
В следующем примере в каждом элементе рисуется растровое изображение и текст.
procedure TFor.gif" >
Свойства компонента bbRun
Рисунок 11.2. Свойства компонента bbRun
Определяет рамку компонента: bsNone нет
Свойства компонента:
property BorderStyle: TBorderStyle; | Определяет рамку компонента: bsNone нет рамки; bsSingle - рамка толщиной 1 пиксель |
property Cells[ACol, ARow: Integer] :String; | Определяет содержимое ячейки с табличными координатами (ACol, ARow) |
property Col: Longint; | Содержит номер столбца сфокусированной ячейки |
property ColCount: Longing- | Содержит количество столбцов таблицы |
property Cols[Index: Integer]:
TStrings; |
Содержит все строки колонки с индексом Index |
property ColWidths[Index: Longint] : Integer; | Содержит ширину столбца с индексом Index |
property DefaultColWidth: Integers; | Содержит умалчиваемое значение ширины столбца |
property DefaultDrawing: Boolean; | Разрешает/запрещает автоматическую прорисовку служебных элементов таблицы - фиксированной зоны, фона и прямоугольника сфокусированной ячейки и
т. п. |
property DefaultRowHeight: Integers; | Содержит умалчиваемую высоту рядов |
property EditorMode: Boolean; | Разрешает/запрещает редактирование ячеек. гнорируется, если свойство Options включает goAlwayseShowEditor или не включает goEditing |
property FixedColor: TColor; | Определяет цвет фиксированной зоны |
property FixedCois: Integers; | Определяет количество столбцов фиксированной зоны |
property FixedRows: Integers; | Определяет количество рядов фиксированной зоны |
property GridHeight: Integers; | Содержит высоту таблицы |
property GridLineWidth: Integers; | Определяет толщину линий, расчерчивающих таблицу |
property GridWidth: Integers; | Содержит ширину таблицы |
property LeftCol: Longint; | Содержит номер самого левого столбца, видимого в зоне прокрутки |
property Objects [ACols ARow: Integer] : TObject; | Обеспечивает доступ к объекту, связанному с ячейкой (ACol, ARow) |
property Options: TGridOptions; | Содержит параметры таблицы (см. ниже) |
property Row: Longing; | Содержит номер ряда сфокусированной ячейки |
property RowCount: Longint; | Содержит количество рядов таблицы |
property RowHeights[Index: Long int] : Integer; | Содержит высоту ряда с индексом index |
property Rows[Index: Integer]: TStrings; | Содержит все строки ряда с индексом
Index |
type TScrollStyle = (ssNone,
ssHorizontal, ssVertical, ssBoth) ; |
Определяет полосы прокрутки: ssNone -нет полос; ssHorizontal - в таблицу вставляется горизонтальная полоса; |
property ScrollBars: TScroll
Style; |
ssVertical - вставляется вертикальная
полоса; ssBoth - вставляются обе полосы |
TGridRect = record
case Integer of 0: (Left,Top,Right,Bottom: Long int) ; 1: (TopLeft, BottomRight: TGridCoord) ; end; |
Определяет группу выделенных ячеек в
координатах левая верхняя и правая нижняя ячейки(нумерация столбцов и рядов идет от нуля, включая столбцы и ряды фиксированной зоны). После выделения сфокусированной окажется правая нижняя ячейка |
property Selection: TGridRect;
property TabStops[Index: Long int] : Boolean; |
Разрешает/запрещает выбирать столбец с индексом index при обходе ячеек клавишей Tab. Игнорируется, если Options не содержит goTabs |
property TopRow: Longint; | Содержит номер самого верхнего ряда, видимого в прокручиваемой зоне ячеек |
property VisibleColCount: Integer; | Содержит количество столбцов, полностью видимых в зоне прокрутки |
property VisibleRowCount: Integer; | Содержит количество рядов, полностью видимых в зоне прокрутки |
type
TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);
TGridOptions = set of TGridOptions;
Элементы множества TGridOptions имеют следующий смысл:
goFixedVertLine | Столбцы фиксированной зоны разделяются вертикальными линиями |
goFixedHorzLine | Ряды фиксированной зоны разделяются горизонтальными линиями |
goVertLine | Столбцы рабочей зоны разделяются вертикальными линиями |
goHorzLine | Ряды рабочей зоны разделяются горизонтальными линиями |
goRangeSelect | Разрешено выделение нескольких ячеек. Игнорируется, если включен элемент goEdit |
goDrawFocus Selected | Разрешено выделять сфокусированную ячейку так же, как выделенные |
goRowSizing goColSizing goRowMoviog | Разрешено ручное (мышью) изменение высоты строк Разрешено ручное изменение ширины рядов Разрешено ручное перемещение рядов (нажать левую кнопку мыши на фиксированной ячейке перемещаемого ряда и, удерживая кнопку нажатой, переместить ряд на новое место) |
goColMoving goEditing | Разрешено ручное перемещение столбца Разрешено редактирование ячейки. Игнорируется, если включен элемент goRowSelect. Редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатии клавиши Enter |
goTabs goRowSelect | Разрешено обходить ячейки клавишей Tab (Shift+Tab) Обязывает выделять сразу все ячейки ряда и запрещает редактирование ячеек Разрешено редактировать сфокусированную ячейку: редактирование возможно после выбора ячейки клавишей Tab (Shift+Tab). Игнорируется, если не включен элемент goEditing |
goAlwaysShowEditorgoThumbTracking | Разрешено обновление при прокрутке. Если этот элемент отсутствует, обновление ячеек произойдет только после окончания прокрутки |
function CellRect(ACol, ARow: TRect; Longint): | Возвращает прямоугольник ячейки по номерам столбца ACol и ряда Arow |
procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint); | Возвращает табличные координаты ячейки ACol и arow по экранным координатам(X,У)точки |
TMovedEvent = procedure (Sender: TObject; Fromlndex, Tolndex: Longint) of object; property OnColumnMoved: TMovedEvent; TDrawCellEvent; | Возникает при перемещении столбца с индексом Fromlndex в положение, определяемое индексом ToIndex |
TGridDrawState = set of (gdSelected, gdFocused, gdFixed) ; TDrawCellEvent = procedure (Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState) of object-property OnDrawCell: | Возникает при необходимости перерисовать ячейку с табличными координатами (Col, Row): Rect - прямоугольник прорисовки; State - состояние ячейки (gdSelected -ячейка выделена; gdFocused - ячейка сфокусирована; gdFixed - ячейка принадлежит фиксированной зоне таблицы). Для прорисовки используется табличное свойство Canvas |
GetEditEvent = procedure
(Sender: TObject; ACol, ARow: |
Возникает при редактировании текста в
ячейке с табличными координатами |
Longint; var Value: String) ofobject;
property OnGetEditMask: TGetE ditEvent; |
(ACol.ARow). В параметре value обработчик должен вернуть шаблон для редактора TeditMask |
property OnGetEditText: TGetE
ditEvent; |
Возникает при редактировании текста в ячейке с табличными координатами (ACol.ARow). В параметре value обработчик должен вернуть текст для редактора TEditMask (см. событие OmGetEditMask) |
property OnRowMoved: TMovedEvent; | Возникает при перемещении ряда с индексом Fromindex в положение, определяемое
индексом ToIndex (см. событие onColMoved) |
SelectCellEvent = procedure (Sender: TObject; Col, Row: Long int; var CanSelect: Boolean) of object;
property OnSelectCell: TSe lectCellEvent; |
Возникает при попытке выделить ячейку с табличными координатами (col.Row). В параметре CanSelect обработчик сообщает о возможности выделения ячейки |
TSetEditEvent = procedure
(Sender: TObject; ACol, ARow: Longint; const Value: String) of object; property OnSetEditText: TSetEditEvent; |
Возникает при завершении редактирования
ячейки (ACol.ARow). В параметре value обработчик получает результат ввода или редактирования текста |
property OnTopLeftChanged: TNotifyEvent; | Возникает после изменения значения ТоpRow или LeftCol в результате прокрутки рабочей зоны |
Назовите пустую форму именем fmStGrid и положите на нее панель TPanel. Установите в свойство панели Align значение alBottom, чтобы панель всегда занимала самую нижнюю часть окна, и удалите текст в ее свойстве caption. Поместите на панель кнопку TBitBtn, установите в ее свойство Caption строку Открыть файл..., загрузите в свойство Glyph файл images | buttons | FILE OPEN.BMP и растяните кнопку по горизонтали так, чтобы надпись и пиктограмма полностью умещались на ее поверхности.
в переключателях третье состояние cbGrayed
Свойства компонента:
![](image/19-31.gif)
property AllowGrayed: Boolean; | Разрешает/запрещает использовать в переключателях третье состояние cbGrayed |
property BorderStyle: TBorderStyle; | Определяет тип рамки, очерчивающей компонет: bsNone - нет рамки; bsSingie - рамка толщиной в 1 пиксель |
property Canvas: TCanvas; | Это свойство используется для программной прорисовки опций |
property Checked[Index:
Integer]: Boolean; |
Содержит выбор пользователя типа Да/Нет для переключателя с индексом index. Состояния cbUnchecked И cbGrayed отражаются как False |
property Columns: Integers; | Определяет количество колонок опций |
property Flat: Boolean; | Разрешает/запрещает трехмерную прорисовку окошек выбора |
property Header[Index: Integer] : Boolean; | Запрещает прорисовку окошка выбора для опции с индексом index. Таким образом вставляются заголовки отдельных секций |
property HeaderBack.gif" > |
Учебная программа INTMULT
Учебная программа INTMULT
В описываемой ниже программе пользователь вводит два целых числа, а программа вычисляет и показывает их произведение. В этой программе мы также познакомимся с преобразованием типов. На Рисунок 5.5. показан вид окна работающей программы.[ В версии Delphi 1 тип Integer занимает 2 байта и содержит число в диапазоне от -32 768 до +32 767. ]
Управление календарем с помощью TTabControl
Рисунок 18.22. Управление календарем с помощью TTabControl
![](image/19-40.gif)
Помимо события OnChange, возникающего после выбора новой закладки, для компонента определено также событие OnChanging, которое возникает перед сменой закладки:
type TTabChangingEvent =
procedure (Sender: TObject;
var AllowChange: Boolean) of object;
property OnChanging: TTabChangingEvent;
Обработчик события может запретить выбор закладки, вернув в параметре Alliowchange значение False.
Вид окна CollBar
Рисунок 18.33. Вид окна CollBar
![](image/19-55.gif)
Свойства TCoolBand:
property Bitmap: TBitmap; | Определяет изображение, которое будет циклически повторяться по всему пространству полосы |
property BorderStyle: TBorder-Style; | Определяет наличие рамки у полосы: bsNone - нет рамки; bssingle - рамка толщиной в 1 пиксель |
property Break: Boolean; | Если содержит True, полоса располагается в новой строке, в противном случае - в той же строке, что и предыдущая полоса |
property Control: TWinControl; | Указывает элемент, который содержит полоса |
property FixedBack.gif" > |
Видеоклипы свойства Соmmоn АVI
Рисунок 18.25 . Видеоклипы свойства Соmmоn АVI
Методы компонента:
procedure Play(FromFrame, ToFrame: Word; Count: Integer); | Демонстрирует Count раз подряд фрагмент клипа, начиная с кадра FromFrame по ToFrame включительно (нумерация кадров начинается с 1) |
procedure Reset;
procedure Seek(Frame: Smallint) ; procedure Stop; |
Восстанавливает исходное состояние компонента. Свойство Open вновь становится True, но свойство Active = False Пропускает и не показывает кадр с номером Frame (нумерация кадров начинается с 1) Прекращает показ клипа |
Для компонента определены следующие события: | |
property OnClose: TNotifyEvent;
property OnOpen: TNoti-fyEvent; property OnStart: TNoti-fyEvent; property OnStop: TNotifyEvent; |
Возникает при установке значения False в свойство Open. Например, когда компонент демонстрирует несколько видеоклипов подряд Возникает при установке значения True в свойство Open Возникает в момент начала демонстрации
Возникает в момент прекращения демонстрации |
Возможные виды графиков компонента TChart
Рисунок 18.19. Возможные виды графиков компонента TChart
![](image/19-37.gif)
Компонент впервые появился в версии 3.
Вставки названия раздела
Рисунок 21.4. Вставки названия раздела
![](image/21-4.gif)
Взаимодействие вызывающей программы и процедуры
Рисунок 5.8. Взаимодействие вызывающей программы и процедуры
![](image/5-8.gif)
С примерами процедур и функций мы уже сталкивались - это
Стандартные процедуры Exit, ShowMessage, функции StrToInt, FioatToStr, Random, математические функции и др. Стандартными они называются потому, что созданы одновременно с системой Delphi и являются ее неотъемлемой частью. В Delphi имеется много стандартных процедур и функций. Наличие богатой библиотеки таких программных заготовок существенно облегчает разработку прикладных программ. Однако в большинстве случаев некоторые специфичные для данной прикладной программы действия не находят прямых аналогов в библиотеках Delphi, и тогда программисту приходится разрабатывать свои, нестандартные процедуры и функции.
Нестандартную подпрограмму необходимо описать, чтобы компилятор смог установить связь между оператором вызова и теми действиями, которые предусмотрены в подпрограмме. Описание подпрограммы помещается в разделе описаний (до начала исполняемых операторов).
Учебная программа UPSTRING
Не вдаваясь в дальнейшие подробности, попробуем составить собственную процедуру, чтобы пояснить сказанное. Пусть в этой процедуре преобразуется некоторая символьная строка таким образом, чтобы все строчные буквы заменялись соответствующими прописными. В Object Pascal имеется стандартная функция upcase (см. гл. 6), которая выполняет аналогичные действия над одиночным символом. Наша процедура (назовем ее upString) будет преобразовывать сразу все символы строки, причем сделаем ее пригодной не только для латинских букв, но и для букв русского алфавита[ В Delphi имеется стандартная функция AnsiUpperCase, реализующая те же действия. ].
Разработку программы проведем в два этапа. Сначала сконструируем основную (вызывающую) часть программы. Ее действия очень просты: она должна получить входную строку из компонента edinput, преобразовать ее с помощью процедуры upString в выходную строку и поместить результат в iboutput.Text. Эти действия нетрудно запрограммировать в обработчике bbRunciick:
procedure TfmExample.bbRunClick(Sender: TObject);
procedure UpString(stinp: String; var stOut: String);
{ Эта процедура преобразует все буквы строки stinp в прописные и помещает результат в выходную строку stOut }
begin
stOut := stinp;
end; // UpString var
SI, S2: String;
begin
SI := edinput.Text; // Получаем исходную строку
UpString(SI,S2); // Преобразуем ее
IbOutput.Caption := S2; // Выводим результат
edinput.Text := '' ;
edinput.SetFocus ;
end ;
В этой программе используется замещение процедуры UpString так называемой “заглушкой”, т. е. процедурой, в которой на самом деле не осуществляется нужных нам действий, а выходная строка просто копирует входную. (Однако эта программа синтаксически абсолютно правильна, и при желании ее можно запустить на счет.) Заглушка понадобилась нам по двум причинам. Во-первых, приведенная программа очень проста, в ней отсутствует детальная реализация процедуры, и это позволяет наглядно проиллюстрировать механизм ее описания. Во-вторых, на ее примере мы знакомимся с универсальным методом конструирования сложных программ, получившим название нисходящее программирование. В соответствии с этим методом создание программы начинается “сверху”, т. е. с разработки самого главного, генерального алгоритма. На верхнем уровне обычно еще неясны детали реализации той или иной части программы, поэтому эти части следует заменить временными заглушками. Желательно, чтобы временный вариант программы был синтаксически правильным, тогда можно его откомпилировать и убедиться в отсутствии в нем синтаксических ошибок. Такой прогон даст определенную уверенность перед разработкой и реализацией алгоритмов нижнего уровня, т. е. перед заменой заглушек реально работающими процедурами. Если реализуемый в заглушке алгоритм достаточно сложен, его вновь структурируют, выделяя главный алгоритм и применяя новые заглушки, и т. д. Процесс продолжается “вниз” до тех пор, пока не будет создан полностью работоспособный вариант программы.
Как видим, описание процедуры начинается зарезервированным словом procedure, за которым следуют имя процедуры и список формальных параметров. Список параметров заключается в круглые скобки и содержит перечень параметров с указанием их типа. Заметим, что перед параметром stout, с помощью которого в вызывающую программу возвращается результат преобразования, стоит зарезервированное слово var. Именно таким способом компилятору указываются те параметры, в которых процедура возвращает вызвавшей ее программе результат своей работы (подробнее см. гл. 10). Зарезервированное слово procedure, имя процедуры и список ее параметров образуют заголовок процедуры. За заголовком следует тело процедуры, содержащее новый раздел описаний (этот раздел пока еще пуст) и раздел исполняемых операторов (оператор stout:= stInp).
Приступим к разработке алгоритма процедуры. Для этого учтем, что в соответствии с принятой в Windows кодировкой символов (так называемой ANSI-кодировкой) символы кириллицы (русского алфавита) располагаются сплошным массивом от “А” до “я”, за исключением “ё” и “Ё”, которые предшествуют “А”. Кроме того, символ “я” имеет внутренний код 255, т. е. максимально возможное значение одного байта (для каждого символа строки выделяется по одному байту).
Вот возможный вариант процедуры:
Procedure UpString(stinp: String; var stOut: String);
{ Эта процедура преобразует все буквы строки stinp в прописные и помещает результат в выходную строку stOut } var
k: Integer;// Параметр цикла
begin
stOut := stinp;
// Цикл побуквенного преобразования
for k := 1 to Length(stOut) {Length - длина строки} do
begin
stOut[k] := UpCase(stOut[k]); // Преобразуем латиницу
if stOut[k] >= 'a' then // Строчная буква кириллицы?
st0ut[k] := // Да: преобразуем ее
Chr(ord('A') + ord(st0ut[k]) - ord('a'));
if stOut[k]='e' then
stOut[k] := 'Ё'; // Преобразуем ё в Ё
end;
end; // UpString
Комментарий к программе
В процедуре вначале с помощью оператора
stOut := stinp;
исходная строка копируется в выходную строку. Затем реализуется циклический перебор всех символов выходной строки для преобразования букв. Для доступа к отдельным символам строки используется замечательное свойство типа данных string, позволяющее рассматривать строку как набор (массив) символов. Первый символ этого набора имеет индекс 1, второй - 2 и т. д. Индекс указывается сразу за именем строки в квадратных скобках. Таким образом, stOut [i] - это г-ный символ строки stOut. Перебор символов реализован в виде счетного цикла от 1 до длины входной строки stOut (эта длина получается с помощью стандартной функции Length), в ходе которого каждый символ сначала преобразуется функцией UpCase (эта функция возвращает прописную латинскую букву для строчной буквы, передаваемой ей в параметре вызова; функция не работает с кириллицей). Затем осуществляется проверка принадлежности буквы к русской строчной (оператор if st0ut[k] >= 'a' then; символ “а” - русская буква) и осуществляется необходимая коррекция ее внутреннего кода. При коррекции используются отмеченные выше свойства непрерывности и монотонности массивов кодов, т. е. за “А” идет “Б”, за “Я” - “а”, за “а” - “б” и т. д. Стандартная функция ord возвращает внутренний код символа, который передается ей в качестве параметра обращения, а функция chr преобразует код в символ. Поскольку буква “ё” стоит особняком, ее преобразование осуществляется отдельным оператором.
Рассмотрим иной способ реализации той же программы - оформим алгоритм преобразования в виде функции:
procedure TfmExample.bbRunClick(Sender: TObject) ;
Function UpString(stinp: String): String;
{ Эта функция преобразует все буквы строки stinp в прописные и помещает результат в выходную строку Result }
var
k: Integer; // Параметр цикла begin
Result := stinp;
// Цикл побуквенного преобразования
for k := 1 to Length(Result) do
begin
Result[k] := UpCase(Result[k]);// Преобразуем латиницу
if Result[k] >= 'a' then // Строчная буква кириллицы?
Result[k] := // Да: преобразуем ее
Chr(ord('A') + ord(Result[k]) - ord('a'));
if Result[k]='e' then
Result[k] := 'Ё'; // Преобразуем ё в Ё
end;
end; // UpString
begin
{ В следующем операторе исходная строка edinput.Text преобразуется и помещается в выходную строку IbOutput.Caption: }
IbOutput.Caption := UpString(edinput.Text);
edinput.Text := '';
edinput.SetFocus ;
end;
Комментарий к программе
При описании функции необходимо за списком используемых для ее вызова параметров указать тип возвращаемого ею результата. Именно поэтому за закрывающей круглой скобкой в заголовке функции стоит двоеточие и тип string. В теле любой функции определена стандартная переменная Result, которая трактуется как результат, возвращаемый функцией.
С помощью оператора
Result := stInp;
мы сначала присвоили результату входную строку, а затем в цикле осуществили перебор символов и их коррекцию. Единственный оператор
IbOutput.Caption := UpString(edInput.Text);
заменил сразу три первых оператора в предыдущей реализации программы.