От Delphi 4 к Delphi 5 часть 23

От Delphi 4 к Delphi 5
Палитра компонентов.
Страница SERVERS.
Взаимодействие с Word, Excel и многими другими распространенными программами, входящими в стандартную установку Microsoft Office разных версий, может осуществляться из приложений, разработанных в среде Delphi 5, с помощью компонентов страницы Servers (рис. 1).
Эти компоненты отображают множество импортируемых серверов COM (Component Object Model — компонентная модель объектов). Их основная задача — описать свойства, методы и события удаленного объекта в терминах машины клиента, т.е. на используемом при разработке клиентского приложения языке программирования. С помощью интерфейсов программа клиента обращается к удаленному объекту так, как если бы он был ее собственным объектом.

Использование отладчика Delphi
Польза от простого пуска и останова программы с использованием контрольных точек довольно ограничена. Чтобы действительно обнаружить ошибку, среда Delphi предоставляет вам множество средств, таких как окно Watch List и диалоговое окно Evaluate/Modify, которые позволяют исследовать и изменять состояние вашей программы и ее переменных во время отладки.

Диалоговое окно Evaluate Modify
Это окно предназначено для того, чтобы оценить или изменить величину элемента выражения.
Среда Delphi позволяет вам изменять значения переменных в структурах данных в течение отладочного сеанса. Вы можете протестировать другие параметры для определения ошибки и увидеть, как раздел кода ведет себя при других обстоятельствах, модифицируя величину данных в течение отладочного сеанса.
Когда вы изменяете значение данных через отладчик, модификация работает только в течение отладки этой программы. Изменения, которые вы делаете в диалоговом окне Evaluate Modify, не влияют на ваш исходный код или откомпилированную программу. Для того чтобы сделать изменение постоянным, вы должны модифицировать ваш исходный код в Редакторе кода, а затем перекомпилировать вашу программу.
Модифицируя величину указателей или индексов массива, вы можете получить нежелательные эффекты, поскольку запишете другие переменные в структуры данных. Поэтому проявляйте осмотрительность всякий раз, когда вы модифицируете программные величины в режиме отладчика.
Когда производится оценка выражения, то его текущая величина отображается в области результата диалогового окна.
Чтобы открыть диалоговое окно Evaluate/Modify, проделайте следующее:
выберите в меню Delphi раздел Run, далее команду Evaluate/Modify — перед вами появится диалоговое окно Evaluate/Modify (рис. 2), в котором вы можете видеть несколько комбинированных окон.
Комбинированное окно Expression (выражение) определяет переменную, область, массив или объект, которые оценивают или модифицируют.
Комбинированное окно Result (результат) отображает результат для величины, определенной в комбинированном окне выражения после того, как вы выберите его для оценки или модифицирования (изменения). Новая величина появится в комбинированном окне результата.
Комбинированное окно New value позволяет модифицировать значение переменной.
Для определения значения необходимой переменной или выражения введите необходимую величину. Оцените выражение в рамке редактирования выражения и посмотрите отображаемое значение в комбинированном окне результата.
Итак, лучше всяких слов, конкретный пример поможет понять неоценимую помощь, которую предоставляет отладчик с использованием диалогового окна Evaluate/Modify.
Вам предоставляется инструмент для облегчения поиска ошибок. Существенная помощь оказывается при работе с приложениями, где производятся многочисленные расчеты.
1. Запустите Delphi.
2. Сохраните файл модуля под именем Evaluate_.pas, а файл проекта под именем Evaluate.dpr.
3. Поместите на форму кнопку Button со страницы Standard и, используя событие OnClick, напишите следующий программный код для обработки этого события.

procedure TForm1.Button1Click(Sender: TObject); var I:Integer; J:Real; Str:String; begin J:=1.
5; Str:=''; for I:=1 to 10 do begin J:=J+1.5; Str:=Str + Chr(I + 64); end; end; end.


4. Используйте клавиатуру или мышь для установки контрольной точки после слова begin. Для этого установите курсор слева от выражения I:=1.5; и нажмите клавишу F5. Вы увидите точку прерывания.
5. Запустите программу на компиляцию, после этого щелкните по кнопке для решения задачи, описанной в программном коде. Приложение перейдет в режим прерывания, строка с контрольной точкой будет иметь стрелку — это означает, что программа остановилась перед этой строчкой (рис. 3).


6. Нажмите клавишу F8. Выполнится текущая строка. Стрелка передвинется на следующую строку. Цвет следующей строки изменится на синий. Это будет означать, что данная строка будет выполняться следующей (рис. 4).


7. Установите курсор справа или слева от переменной J. Выберите в меню Delphi раздел Run, из раскрывшегося списка выберите команду Evaluate/Modify. Появится диалоговое окно Evaluate/Modify (рис. 5). Для вызова этого окна можете использовать сочетание клавиш (Ctrl +F7).
8. В диалоговом окне вы можете наблюдать имя переменной J, которое расположено в комбинированном окне Expression. Текущее значение переменной появляется в комбинированном окне Result. Нижнее комбинированное окно можно использовать для изменения значения переменной.


9. Нажмите клавишу Esc. Продолжите выполнение следующей строки программного кода, для этого нажмите клавишу F8 еще три раза, чтобы стрелка оказалась в строке с первым ключевым словом end, т.е. вы дали возможность выполниться строке, содержащей переменную Str. Изучите переменную Str, для чего поместите курсор возле данной переменной и нажмите сочетание клавиш (Ctrl + F7) (рис. 6). После окончания просмотра не забудьте нажать клавишу Esc.
10. Вы можете пройти еще несколько строчек кода с возможностью изучения работы цикла for. После того, как вы окажетесь в конце обработчика, программа продолжит работу. Вы можете нажать клавишу F9, если хотите продолжить работу с текущей строки, не дожидаясь окончания отладки обработчика события.


11. Имеется возможность производить просмотр изменений текущего значения переменной величины в пошаговом режиме. Для этого необходимо вызвать диалоговое окно Evaluate/Modify для переменной Str. Совместите диалоговое окно и окно редактора кода таким образом, чтобы они не перекрывались (рис. 7). Теперь, производя пошаговое выполнение, после прохода очередного цикла, происходит изменение интересующей вас переменной. Произведите щелчок по пиктограмме Evaluate, расположенной в верхней части диалогового окна Evaluate /Modify. Вы увидите изменения, произошедшие с переменной.
12. Вы можете произвести изменение переменной величины, используя диалоговое окно Evaluate/Modify, для этого используйте комбинированное окно New value. Например, измените значение переменной J с 1,5 на значение 10 и, используя пиктограмму Modify, щелкните по ней для ввода изменений. Далее после пошагового выполнения вызываете вновь диалоговое окно для интересующей переменной и оцениваете проведенные изменения.
13. Можно использовать диалоговое окно Evaluate/Modify в качестве калькулятора. Для этого наберите выражение, например 655*2, и нажмите на пиктограмму Evaluate — в комбинированном окне Result увидите результат.
14. В большинстве случаев окно Result показывает информацию в удобном для чтения виде, но среда Delphi позволяет менять формат результата вашего выражения. Это можно сделать добавлением запятой и форматных символов в конце выражения.
Символ H или X (тип Integer) показывает результат в шестнадцатеричном формате.
Символ D (тип Char, String) в дополнение к нормальным символам показывает специальные символы младших кодов таблицы ASCII.
Символ Fn (тип Integer) показывает результат в десятичной форме.
Символ nM (тип Floating point) показывает величину с плавающей точкой со значащими цифрами.
Символ P (тип Pointer) показывает значение указателя и информацию о нем.
Символ R (тип Structure union) по умолчанию показывает разделенные точками значения структурных полей. Это форматный символ показывает имена полей и значения.
Символ S (тип Char, String) показывает символы младших кодов таблицы ASCII как управляющие последовательности (escape sequences).
Если вы укажете неопознанные форматные символы, окно Result останется пустым.
Рассмотрим пример. Для этого необходимо ввести в комбинированное окно Expression следующее выражение: 15,H. Т.е. переведем десятичное число 15 в шестнадцатеричное число. Щелкните по пиктограмме Evaluate диалогового окна Evaluate/Modify, в комбинированном окне появится результат $F. Для обратного преобразования наберите в комбинированном окне Expression $F или $F,D.
Будьте внимательны, не забывайте использовать клавишу Esc для закрытия диалогового окна Evaluate/Modify, следите за положением выделенной строки, перешагнула ли она через нужную переменную, чтобы просмотреть произведенные изменения.
В случае выдачи сообщений о неправильном просмотре переменной используйте Help Delphi.
На рассмотренном выше примере вы поставили контрольную точку и прошлись по шагам программы, исследуя переменные. Таким образом, используя диалоговое окно Evaluate/Modify, вы можете по шагам исследовать программу, открывать окно просмотра переменной и путем нажатия клавиши Esc возвращаться в программу. Затем можете осуществлять переход к следующей строке, и снова обеспечивать просмотр переменной. Это очень неудобно. Существует более легкий путь, который рассмотрим дальше.

Окно Watch List
Окно Watch List позволяет вам просматривать содержимое переменных во время выполнения программы. Во время пошагового выполнения окно Watch List динамически обновляется, так что вы можете видеть результат воздействия каждой строки программы на значения переменных.
Для просмотра окна Watch List во время редактировании программы или во время выполнения откройте раздел View меню Delphi и выберите команду Debug Windows, далее Watches или используйте сочетание клавиш Ctrl + Alt +W.
Окно Watch List может отображать любые типы переменных, имеющих смысл и находящихся в области действия. Например, если окно Watch List выведет сообщение Process not available, то ваша программа не выполняется. Если выведено сообщение справа от переменной unknown identifier, следовательно переменная не находится в поле действия функции в контрольной точке.
Продолжим работу с примером Evaluate.
1. Установите контрольную точку. Запустите программу на компиляцию, щелкните по кнопке для выполнения программы, программа остановится на точке прерывания. Дважды нажмите клавишу F8 для выполнения первых двух строк. Если не происходит выполнения после нажатия клавиши F8, то щелкните левой кнопкой мыши в месте мерцания вертикальной черты и нажмите F8.


2. Затем поместите курсор на слове Str. Щелкните правой кнопкой мыши, появится всплывающее меню, выберите команду Debug, далее команду Add Watch at Cursor (или используйте сочетание клавиш Ctrl + F5). Откроется диалоговое окно Watch List (рис. 8).
3. Переместите диалоговое окно Watch List таким образом, чтобы оно не закрывало окно редактора текста. Теперь, нажимая на клавишу F8, можете проследить, как меняется значение переменной Str.


4. Для вызова диалогового окна Watch Properties используйте раздел меню Delphi Run, далее команду Add Watch. Появится диалоговое окно Watch Properties, используя которое введите значение необходимой переменной и щелкните кнопку Ok. Вы увидите значения введенной переменной в окне Watch List (рис. 9).
В диалоговом окне Watch Properties имеется несколько опций. В комбинированном окне Expression вводится имя переменной или она выбирается из выпадающего списка. Delphi запоминает имена всех переменных, которые вы контролируете, и добавляет их в выпадающее меню для дальнейшего использования.
Среда Delphi определяет типы переменных и показывает их в соответствующем формате. Если вы хотите видеть эту переменную в другом формате, выберите одну из радиокнопок в диалоге Watch Properties. Среда Delphi предлагает следующие форматы: Character, String, Decimal Integer, Hex Integer, Ordinal, Pointer, Record, Default и Memory Dump. В большинстве случаев установка Default даст вам то, что нужно. Для чисел с плавающей запятой вы можете указать количество значащих цифр, введя его в текстовом окне Digits.
Вы можете увидеть весь массив, если введете имя массива в комбинированное окно Expression. Окно Watch List демонстрирует разделенные запятыми элементы массива. Для того чтобы увидеть конкретный элемент массива, введите в комбинированном окне Expression имя массива и индекс элемента. Если вы хотите увидеть несколько элементов массива, введите в комбинированном окне Expression имя массива и номер первого элемента, а в текстовом окне Repeat Count — количество элементов, которые вы хотите видеть.
Окно Watch List имеет всплывающее меню, упрощающее операции. Оно предоставляет вам следующие возможности.
Edit Watch вызывает диалоговую панель Watch Properties и позволяет вам менять свойства текущих наблюдаемых переменных.
Add Watch вызывает диалоговую панель Watch Properties с незаполненными полями.
Рассмотрим опцию Delete Watch. Если у вас слишком много наблюдаемых переменных, показываемых в окне Watch List, то просмотр их становится затруднительным. Используйте эту опцию для удаления ненужных переменных из окна просмотра. Позднее вы сможете просто вернуть эти переменные в Watch List. Удалить переменную из списка просмотра можно, пометив ее и нажав кнопку Delete.
Рассмотрим опцию Enable/Disable Watch. По умолчанию ваши контролируемые переменные не маскированы, т.е. они оцениваются на каждой контрольной точке. Замаскированные (disabled) наблюдаемые переменные затемнены в списке и никогда не оцениваются. Используйте выбор этой команды для переключения между режимами маскирования и снятия маски.
Опция Enable /Disable All Watches позволит вам быстро маскировать все наблюдаемые переменные и снимать с них маски. Это окажется полезным, если вы хотите сконцентрироваться на одной переменной. Просто замаскируйте все переменные и затем отдельно снимите маску с той, что вас интересует.
Опция Delete All Watches удаляет все наблюдаемые переменные из окна Watch List. Окно Watch List, однако, не закрывается, и вы можете добавить к нему новые переменные для наблюдения.

Компонент MaskEdit.
Компонент MaskEdit находится на странице Additional. Если для этого компонента не определено свойство EditMask в инспекторе объекта на странице Properties, то компонент MaskEdit используется как обычный редактор Edit. Иначе вы можете использовать компонент MaskEdit, чтобы ограничить число символов, которые необходимо ввести в окно текстового редактора MaskEdit, а также обеспечить ввод необходимых символов в нужном формате. Если после введения маски вы попытаетесь ввести неправильный символ, то управляющий элемент MaskEdit не воспримет символ.


Используйте редактор маски (рисунок 10), чтобы определить для окна редактирования MaskEdit значения, которые ограничивают пользователя во вводимых данных и задают специфический формат. Например, в области входа данных для номеров телефонов вы можете определить окно редактирования, которое принимает только числовой ввод. Если пользователь попытается ввести буквенное значение в это окно редактирования, ваше приложение не примет его.
Для того чтобы открыть диалоговое окно редактора маски, необходимо проделать следующее:
1. Поместите компонент MaskEdit на форму;
2. Произведите двойной щелчок по кнопке с тремя точками справа от свойства EditMask инспектора объекта.
3. Вы можете поместить вначале интересующий вас шаблон, например, выберите в образце масок строку Long Time 09: 05:15PM. После выбора строки показаний времени вы увидите в строке Input Mask: !90:00:00> LL;1;_. А в строке Test Input: __:__:____. Давайте разберемся, что получилось.
Шаблон (справа от полей ввода), его значения появляются в полях маски при активизации одной из строк. Шаблон состоит из трех частей, отделенных друг от друга символами (;). Первая часть шаблона задает маску ввода, вторая часть представляет собой символ 1 или 0, который определяет, записывается ли в свойство Text результат наложения маски (1) или исходный текст (0). Чтобы это понять, посмотрите на свойство Text: когда значение второй части установлено в 1, то в свойстве Text вы видите некоторые значения, для нашего примера это двоеточия на определенном расстоянии в соответствии со значением Test Input. Если установлено значение 0, то в свойстве Text не отображается информация. Данные изменения производятся с использованием чекбокса Save Literal Characters.
В третьей части указывается символ, который в окне редактора будет стоять в полях, предназначенных для ввода символов. Поэкспериментируйте с разными шаблонами и посмотрите, какая информация отображается в свойстве Text в других случаях. Если вы не вводите маску, то можете использовать свойство Text для ввода текста или числовых значений. Когда вы выбираете маску из предложенного списка, среда Delphi устанавливает встроенную маску в поля редактирования маски и отображает образец в рамке редактирования. Для того чтобы отображать маски ввода, соответствующие какой-либо стране, заданной в списке, выберите кнопку Masks…


4. Теперь попробуйте создать собственную маску. Для этого используйте маску ввода Input Mask. Допустим, вам необходимо задать код города и далее семизначный номер телефона. Для этого введите в маску ввода следующие значения: (999)9-99-99-99. В окне Test Input вы увидите заготовку (___)_-__-__-__. Теперь запустите на компиляцию ваше приложение, и вы можете вводить номера телефонов практически без ошибок. Измените порядок написания, введите конкретный код города, а номера телефонов сделайте произвольными. Введите в Input Mask (017)9-99-99-99;1;_. Поменяйте символ ( _ ) в окне Character for Blanks на 0 — и в окне Test Input отобразится следующее (017)0-00-00-00 (рис. 11).
Маска для ввода данных состоит из описателей полей ввода, поля ввода специальных символов и поля ввода литералов.
Описатель указывает, какой именно символ может ввести пользователь в данное поле (описатель всегда описывает поле единичной длины, рассчитанное на ввод одного символа).
Литерал вставляется в текст, показываемый в окне редактора, но при вводе курсор перескакивает через литерал и не дает возможности изменить его. Литералами считаются любые символы, кроме описателей полей и специальных символов, а также любой символ, которому предшествует символ "\". Специальные символы формируют дополнительные указания редактору.
Описатели полей ввода имеют следующее назначение:
символ L — поле должно содержать букву;
символ l — поле может содержать букву;
символ С — поле должно содержать любой символ;
символ с — поле может содержать любой символ;
символ А — поле должно содержать букву или цифру;
символ а — поле может содержать букву или цифру;
символ 0 — поле должно содержать цифру;
символ 9 — поле может содержать цифру;
символ # — поле может содержать цифру, знак "+" или "-".
Специальные символы, которые используются в полях ввода, имеют следующее назначение:
символ \ (наклонная черта влево) указывает, что следующий символ-литерал позволяет вставить в маску литералы из символов описателей ввода и специальных символов;
символ : (двоеточие) указывает, что на это место вставляется символ-разделитель для разделения часов, минут, секунд;
символ / (наклонная черта вправо) указывает, что на это место вставляется символ-разделитель для полей даты;
символ ; (точка с запятой) указывает на разделение частей шаблона;
символ ! (восклицательный знак) подавляет все ведущие пробелы;
символ> (знак больше) указывает, что все следующие за ним поля ввода преобразуют буквы к заглавным;
символ < (знак меньше) указывает, что следующие за ним поля ввода преобразуют буквы к строчным;
символ <> отменяет преобразование букв.
Редактор Input Mask Editor позволяет не только ввести маску, но и задать символ для обозначения вводимого знакоместа. Кроме того, вы можете указать, сохранять ли вместе с конечной строкой присутствующие в маске литералы. Например, скобки, которые помещаются вокруг кода области в телефонном номере, могут отображаться только в качестве подсказки, а могут сохраняться вместе со строкой, содержащей результирующий номер.
Если не все требуемые поля ввода заполнены и компонент лишился фокуса ввода, возникает исключительная ситуация EDBEditError, на экран выводится окно с сообщением и после закрытия окна курсор устанавливается в место, где закончился правильный ввод.
Если установите в свойство PasswordChar компонента Mask Edit любой символ, кроме #0, обеспечивается секретность ввода — в этом случае все вводимые в компоненте символы заменяются символом PasswordChar. Обычно используется символ (*).

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
4. К. Сурков, Д. Сурков, А. Вальвачев. Программирование в среде Delphi 2.0 Минск. ООО "Попурри". 1997 г.
5. Джозеф Когсвел. Изучи сам Delphi 2. 0 сегодня. Минск. ООО "Попурри". 1997г.
6. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
7. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г.

Владимир Скуратов


(c) компьютерная газета


Компьютерная газета. Статья была опубликована в номере 32 за 2001 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета