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

От Delphi 4 к Delphi 5
Палитра компонентов

Страница Internet Express.


Два компонента страницы Internet Express предназначены для поддержки интранет-сетей, т.е. деловых сетей, использующих технологию Internet для передачи данных (рисунок 1). Эта страница имеется в Delphi 5.


Компонент XMLBroker (брокер) использует язык XML (Extensible Markup Language – расширяемый язык разметки). Язык XML является дополнением к используемому в Интернет языку HTML.

HTML
служит для отображения данных, а XML — для работы с ними. Этот компонент служит связующим звеном между источником данных и сервером приложений в интранет-сетях.

Компонент MidasPageProduser представляет собой продюсер Web- страниц для Web- приложений. Эти страницы отображают информацию базы данных от прикладного сервера и включают пакеты данных, закодированные в XML и JavaScript, что позволяет Web- браузерам управлять этими данными, изменять и подтверждать изменения в прикладном сервере.

Синтаксический контроль.


Проверка синтаксического контроля вашей программы производится двумя способами. Первый способ предполагает выбор раздела Project меню Delphi, далее команда Syntax check Project1. Delphi компилирует каждый модуль проекта и останавливается на найденной ошибке (рисунок 2).

Второй способ предполагает выбор в меню Delphi раздела Run, далее команду Run (или можно нажать Ctrl +F9 ) . Delphi производит не только компиляцию программы, но и компонует ее (рисунок 3). В том случае, когда программа не имеет синтаксических ошибок, команда Run запустит программу на выполнение. Если указанные способы обнаружили ошибки, Delphi покажет в статусной строке сообщение об ошибке и установит указатель вставки в Редакторе кода на место, явившееся причиной ошибки (рисунок 4).

Компилятор Delphi иногда не может поставить маркер на то место, где явно произошла ошибка, например, в случае отсутствия точки с запятой после ключевого слова end, подсвечивается вся строка после ключевого слова end, где имеется ошибка (рисунок 5). Сообщение в статусной строке в данном случае помогает определить место ошибки [Error] DartBoard_.pas(54): ';' expected but 'PROCEDURE' found – ожидалась точка с запятой, но она не обнаружена.

В качестве примера для синтаксического контроля выбрана программа Mishen (занятие 19). На рисунке 6 показан случай, когда компилятор не смог поставить указатель вставки в ту точку программы, где возникла проблема. В случае, когда невозможно определить место ошибки, можно сузить поле поиска ошибки, переводя последовательно операторы в разряд комментариев, пока ошибка не пропадет. Для комментариев используйте следующие символы: {} круглые скобки, // две наклонные черты или сочетание (* *) . Затем вы можете последовательно выводить команды из комментария, пока не обнаружите ошибку. В случае, показанном на рисунке 6, ошибка состоит в том, что пропущено ключевое слово begin.


Если у вас программа производит множество вычислений, но итог не соответствует ожидаемому результату, то можно использовать вывод промежуточных результатов в компоненты Edit. Для этого можно использовать следующую последовательность операторов:


Edit1.Text := FloatToStr(X);

Edit2.Text := IntToStr(X1);


Если у вас проблемы с английским языком, то необходимо использовать переводчик, например Socrat, Rpomt 98 и т.д. Вам необходимо выделить сообщение в статусной строке, копировать его в буфер обмена, далее запустить переводчик и осуществить перевод сообщения, а в дальнейшем произвести поиск ошибки. Для того чтобы меньше использовать клавиатуру при вводе программного кода и при этом вносить меньше ошибок, можно воспользоваться вызовом оперативного справочника Delphi. Вы можете копировать большинство операторов прямо из справочной системы. Могут возникать ошибки выполнения, когда ваша программа синтаксически правильна и может работать, но во время выполнения возникают ошибки. Такие ошибки могут вызывать "зависание" программы.

Иногда Delphi может восстановиться после такой ошибки, указатель вставки в Редакторе кода будет стоять в месте возможной ошибки. Иногда вся система может не восстановиться, что приведет к потере всех не сохраненных данных. Поэтому, прежде чем запустить программу на компиляцию, произведите сохранение в открытых приложениях. Даже если ваша программа запускается и не вылетает, она все же может работать не так, как вы хотите. Способы решения этой проблемы рассмотрим на следующих занятиях.


Методы–процедуры и методы-функции.


Методы–процедуры аналогичны самостоятельным процедурам за исключением того, что они принадлежат тому классу, в котором заданы, и могут быть вызваны лишь через какого-либо действительного представителя этого класса.

Методы-функции возвращают значения и ведут себя так же, как и обычные самостоятельные функции, с той разницей, что, как и все методы, они принадлежат тому классу, в котором заданы, и должны вызываться через действительного представителя этого класса.

Методы-процедуры и методы-функции объявляются как и обычные процедуры и функции, с той разницей, что это делается не в блоке объявлений языка Object Pascal, а в описании класса.

Заголовок метода выглядит так же, как и заголовок самостоятельной подпрограммы.

Синтаксис заголовка метода-процедуры имеет вид:


type
ИмяКласса = class(ИмяРодительскогоКласса)

procedure ИмяМетода (<Список параметров>);

end;


Синтаксис заголовка-функции имеет вид:


type
ИмяКласса = class(ИмяРодительскогоКласса)

function ИмяМетода (<Список параметров>) : Возвращаемый тип;

end;


Внутри одного класса можно объявить столько методов, сколько требуется. Объявления методов-процедур могут быть перемешаны с объявлениями методов-функций и методов других видов. Объявления элементов класса могут быть сгруппированы в разделы. Единственное требование – чтобы в пределах каждого раздела в описании класса все поля появлялись до объявления методов.

Каждое объявление метода-процедуры внутри определения класса начинается с зарезервированного слова procedure, после которого стоит имя метода. Каждое объявление метода-функции начинается с зарезервированного слова function, за которым следует его имя.

За именем метода может следовать заключенный в скобки необязательный список параметров. Синтаксис для списка параметров подчиняется тем же правилам, что и для списка параметров обычных подпрограмм.

В случае метода-функции за закрывающейся скобкой списка параметров или за названием функции, у которой нет параметров, следует двоеточие, после которого указывается тип возвращаемого функцией значения.

Вы уже встречались с методами-процедурами и методами-функциями на занятии 17, где были определены следующие методы-процедуры и методы-функции: procedure SetValue(m, d, y: Integer); function LeapYear: Boolean;, присоединенные к классу Date. Данный пример можно расширить и добавить новые методы.

Используя пример занятия 17, добавьте на форму компонент Label4 и четыре компонента Button, щелчок по которым приведет к изменению даты на один день и десять дней . Определим новые методы-процедуры и методы-функции.

В этой версии примера имеются некоторые новые методы. Один из них — GetText — является функцией, которая возвращает строку с датой. Второй новый метод-процедура Increase, который увеличивает дату на один день. Третий метод-функция DaysInMonth, который возвращает число дней в текущем месяце. Процедура Decrease уменьшает дату на один день. Procedure Add; procedure Subtract увеличивают и уменьшают дату на 10 дней.

Ниже представлен программный код, дополняющий пример YearLeap занятия 17. Показаны также операторы, в которых проведены изменения.


public
{ Public declarations }
end;
Date = class
Month, Day, Year: Integer;
function GetText : string;
function DaysInMonth: Integer;
procedure Increase;
procedure Decrease;
procedure Add (NumberOfDays: Integer);
procedure Subtract (NumberOfDays: Integer);
end;
var
Form1: TForm1;
ADay: Date;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
ADay := Date.Create (1, 1, 1900);
Label4.Caption := ADay.GetText;
end;
function Date.GetText: string;
begin
{Отформатировать текст, преобразовать целые числа в строки с фиксированным числом символов}
GetText := Format ('%.2d.%.2d.%4d', [Month, Day, Year.));
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ADay.Increase;
Label4.Caption := ADay.GetText;
end;
function Date.DaysInMonth: Integer;
begin
case Month of
1, 3, 5, 7, 8, 10, 12:
DaysInMOnth := 31;
4, 6, 9, 11:
DaysInMonth := 30;
2:
if (LeapYear) then
DaysInMonth := 29
else
DaysInMonth := 28;
else
// если месяц не правильный
DaysInMonth := 0;
end;
end;
procedure Date.Increase;
begin
{если этот день не последний день месяца }
if (Day < DaysInMonth) then
Inc (Day) {increase the value by 1}
else
{ если это не декабрь }
if (Month < 12) then
begin
{ День 1 следующего месяца }
Inc (Month);
Day := 1;
end
else
begin
{ если это - в следующем году новый день }
Inc (Year);
Month := 1;
Day := 1;
end;
end;
procedure Date.Decrease;
{метод увеличения }
begin
if (Day > 1) then
Dec (Day)
{ уменьшите величину }
else
{ это - начало месяца }
if (Month > 1) then
begin
{ последний день предшествующего месяца }
Dec (Month);
Day := DaysInMOnth;
end
else
{ начало января }
begin
{ последний день прошлого года }
Dec (Year);
Month := 12;
Day := DaysInMOnth;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
ADay.Decrease;
Label4.Caption := ADay.GetText;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
ADay.Add(10);
Label4.Caption := ADay.GetText;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
ADay.Subtract(10);
Label4.Caption := ADay.GetText;
end;
procedure Date.Add (NumberOfDays: Integer);
var
n: Integer;
begin
for n:=1 to NumberOfDays do
Increase;
end;
procedure Date.Subtract (NumberOfDays: Integer);
var
n: Integer;
begin
for n:=1 to NumberOfDays do
Decrease;
end;
end.


Результат работы измененной программы YearLeap показан на рисунке 7 .

Компонент Panel, компонент SpeedButton.


Компонент Panel можно использовать для визуальной группировки элементов, связанных друг с другом каким-либо обстоятельством. Панели можно придать приподнятый или опущенный вид, изменяя два ее свойства: BevelOuter и BevelInner. Выбрав для каждого из этих свойств значения bvNone, bvLowered, bvRaised, вы можете достигать различных рельефных визуальных эффектов.

Регулировку визуального эффекта можно производить, задавая числовое значение для свойства BewelWidth.


Основное назначение данного компонента заключается в размещении на нем других управляющих элементов . Используя свойство Align, можно определить расположение элемента на форме, не беспокоясь о расположении панели при изменении размеров формы. Во многих приложениях Windows имеется инструментальная линейка в верхней части окна и строка состояния в его нижней части. В зависимости от создателя приложения инструментальная линейка может называться по-разному, например SpeedBar или полоса управления. Инструментальная линейка, как бы ее ни называли, обычно содержит несколько маленьких кнопок, которые вы можете нажимать щелчком мыши, чтобы задавать команды или переключать опции включено и выключено.

Иногда она может содержать комбинированный список, строку редактирования или некоторые другие управляющие элементы. Инструментальные линейки обычно могут быть помещены на форме в левой или правой части или использованы как комплект инструментальных средств (маленькое плавающее окно с массивом кнопок).

Строка состояния обычно имеет одну или несколько областей с текстовым описанием текущего состояния программы. Вы можете использовать панель как область для отображения координат, времени, для показа выбранного шрифта или отображения всплывающих подсказок о том, что делать дальше, а также вывода сообщений об ошибках и т.д. Фактически вы определяете, что должно войти в строку состояния. Рассмотрим последовательно данные возможности.


Группировка управляющих элементов с помощью панелей.


Для создания инструментальной линейки или строки состояния в Delphi вы можете использовать компонент Panel, добавив в него несколько кнопок или других панелей, а можете использовать специальный компонент StatusBar . Компонент Panel можно рассматривать как инструмент для разбиения клиентской области на части и для группировки других компонентов.

На панели можно размещать собственный текст, отображая, таким образом, последовательность действий пользователя. В основном панели используются для улучшения вида приложения за счет их трехмерного вида. В этом отношении Panel аналогична компоненту Bevel, хотя он имеет менее важную роль и обладает намного меньшими функциональными возможностями.

Для инструментальной линейки используйте значение alTop, а для строки состояния — alBottom . Кроме других общепринятых свойств, компонент Panel может также обрабатывать всплывающие подсказки, используя свойства Hint и ShowHints .

Всплывающая подсказка представляет собой короткое сообщение, отображаемое возле курсора, когда пользователь перемещает мышь над кнопкой инструментальной линейки. Они доступны не только на панелях. Каждая форма может иметь всплывающие подсказки для какого-либо компонента или для всех компонентов, которые входят в нее.

Итак, после некоторой теоретической части начнем построение инструментальной линейки.

Рассмотрим пример программы ToolBar, в которой кнопки, расположенные на панели, образуют инструментальную линейку. Использование кнопок позволит производить выравнивание текста в компоненте Label, а также изменять шрифт и стиль текста в данном компоненте.

    1. Запустите Delphi.
    2. Сохраните файл модуля под именем StrTools_.pas, от сокращенного названия линейка инструментальных средств (Straightedge of tools), а файл проекта сохраните под именем StrTools. dpr. Для этого используйте команду Save Project As…, выбрав раздел File меню Delphi.
    3. Чтобы построить инструментальную линейку, вам необходимо поместить Panel в верхней части формы. Для этого щелкните по компоненту Panel на странице Standard палитры компонентов и поместите его на форме, щелкнув кнопкой мыши по форме. Используя свойство Align инспектора объекта, для выделенного компонента Panel, в окошке справа от свойства Align, выберите значение alTop. Панель займет верхнее положение на форме.
    4. Разместите на ней несколько компонентов SpeedButton (быстрая или горячая кнопка). Для нашего примера поместите 8 компонентов SpeedButton. Для выравнивания кнопок на панели используйте выделение их мышью при нажатой клавише клавиатуры Shift. Выберите раздел View в меню Delphi, далее команду Alignment Palette (выравнивание компонентов) и произведите выравнивание кнопок на панели. Используйте свойство Caption инспектора объекта для выбранных кнопок, введите заголовки кнопок " Сигнал", "Вправо", По центру", "Влево", " fsBold", "fsItalic", "fsUnderLine", "24". Задайте размеры для компонентов Button с учетом, того, чтобы поместились соответствующие надписи.

    5. Кнопка SpeedButton может иметь заголовок и значок, хотя обычно она имеет только графический элемент. Быстрые кнопки подобны командным кнопкам (т.е. компоненту Button ) и главным образом используются внутри диалоговых панелей. Они могут вести себя подобно командным кнопкам, чекбоксам или кнопкам опций (радио-кнопкам) и иметь растровые изображения для различных ситуаций. Однако существуют и важные технические различия между SpeedButton и обычными кнопками. Быстрые кнопки являются графическим элементом, они не имеют дескриптора окна (т.е., не используют ресурсы окон), не могут получать фокус, не участвуют в переборе клавишей Tab.


      Если вы просто выбираете компонент SpeedButton и помещаете его экземпляр на панель (инструментальную линейку), то в результате получите графическую командную кнопку. Для нее вы можете выбрать растровое изображение или ввести заголовок, хотя первое решение более распространено. Командные кнопки инструментальной линейки достаточно малы, их размер составляет 20 * 20 пикселей. Обычно, в таком ограниченном пространстве вы не сможете написать много текста. Несмотря на то, что значок маленький, он может сделать кнопку более выразительной. В нашем примере введите надписи для кнопок. На следующем занятии рассмотрим использование растровых изображений на кнопке.

    6. Добавьте на форму компонент Label и, используя свойство Align инспектора объекта, определите значение alClient. Используя свойство Caption, введите текст по вашему усмотрению. Используя три кнопки выравнивания текста и три кнопки, которые выбирают стиль текста, задайте для них режим работы чекбоксов. Для этого, используя свойство Grouplndex, для кнопок определяющих выравнивание текста присвойте значение 1. Для кнопок, изменяющих стиль надписи, присвойте свойству Grouplndex значение 2, и выберите значение True для свойства AllowAllUp. Это все, что требуется вам, чтобы иметь полностью рабочий чекбокс. Когда вы нажимаете одну из кнопок в составе группы, она как бы утопает, а когда вы снова нажимаете ее, она освобождается. Для кнопки "24" задайте значение GroupIndex равным 3.

Программный код раздела implementation для данного примера приведен ниже. На рисунке 8 показан результат работы программы ToolBar .


implementation
{$R *.DFM}
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MessageBeep (0);
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Label1.Alignment := taLeftJustify;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Label1.Alignment := taCenter;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
Label1.Alignment := taRightJustify;
end;
procedure TForm1.SpeedButtonBoldClick(Sender: TObject);
begin
if SpeedButtonBold.Down then
Label1.Font.Style := [fsBold]
else
Label1.Font.Style := [];
end;
procedure TForm1.SpeedButtonItalicClick(Sender: TObject);
begin
if SpeedButtonItalic.Down then
Label1.Font.Style := [fsItalic]
else
Label1.Font.Style := [];
end;
procedure TForm1.SpeedButtonUnderLineClick(Sender: TObject);
begin
if SpeedButtonUnderline.Down then
Label1.Font.Style := [fsUnderline]
else
Label1.Font.Style := [];
end;
procedure TForm1.SpeedButtonBigClick(Sender: TObject);
begin
if SpeedButtonBig.Down then
Label1.Font.Size := 24
else
Label1.Font.Size := 12;
end;
end.

Литература:

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

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

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




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

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