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

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

Страница MIDAS.


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

Компонент ClientDataSet предназначен для непосредственного (без BDE ) доступа к данным с клиентского компьютера.

Компонент DComConnection устанавливает связь с удаленным сервером, используя средства технологии DCOM.

Компонент SocketConnection устанавливает связь с удаленным сервером, используя собственные средства Windows (так называемые сокеты).

Компонент DataSetProvider реализует удаленного (на машине сервера) поставщика наборов данных для многоуровневых клиентских приложений. В отличие от компонента Provider, ориентирован на иной, чем BDE, механизм доступа к данным.

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

Компонент WebConnection устанавливает связь с Web-сервером.

Компонент CorbaConnection устанавливает связь с удаленным сервером, используя средства технологии CORBA.

В версию Delphi 5 не включены некоторые устаревшие компоненты версии Delphi 4.

Ошибки времени выполнения.


Существуют ошибки времени выполнения (run-time errors), которые дают о себе знать исключительными ситуациями, останавливающими работу вашего приложения. Если обработка исключительной ситуации стандартная, то выдается сообщение, в котором указывается тип ошибки, а также адрес, по которому она произошла. Среда Delphi имеет средства, помогающие обнаруживать ошибки времени выполнения и устранять их. Ваше приложение в некоторых случаях может приостановиться, не прекратить работу и не зависнуть. После определения ошибки и ее исправления вы можете продолжить его, выбрав команду меню Run/Run, или прервать работу приложения командой меню Run/Program Reset. Если вы выберете команду Run, то обработкой исключительной ситуации займется среда Delphi с выдачей сообщения об ошибке.

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

Контроль ошибок времени выполнения является настраиваемым. Для его настройки необходимо открыть диалоговое окно Project Options на странице Compiler, с помощью раздела Project меню Delphi, далее команда Options.


Переключатели из группы Runtime errors позволяют вам указать, в каких ситуациях должны генерироваться ошибки времени выполнения (рисунок 2).

Переключатель Range checking позволяет контролировать индексы массивов и строк, а также переменные интервальных типов, не выходя за границы объявленных пределов. Контроль следует включать только на время отладки.

Переключатель I/O checking позволяет включить контроль ошибок ввода-вывода. Если он включен, то чтобы узнать, была ли ошибка ввода-вывода, необходимо проверить значение переменной IOResult: (IOResult<>0). Этот переключатель следует включать только на время отладки.

Переключатель Overflow checking (Q) позволяет включить контроль переполнения целых чисел при выполнении арифметических операций. Этот переключатель включается только на время отладки.

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

Диалоговое окно Project Options на странице Compiler имеет группу Messages с переключателями Show hints и Show warnings (рисунок 2) .


Подсказки ( включена опция Show hints) генерируются компилятором, когда обнаруживается неиспользуемая в программе переменная, производятся бесполезные присваивания и во многих других случаях неоптимального программирования.

Предупреждения ( включена опция Show warning) генерируются компилятором, когда происходит обращение к неинициализированным переменным, обнаруживаются функции с пропущенным результатом, когда конструируются объекты абстрактных классов и в других ситуациях, которые могут привести к ошибкам времени выполнения.


Инструментарий Delphi.

Опции отладчика.


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

Перед разработкой приложения необходимо позаботиться о том, чтобы все средства встроенного отладчика были доступны. На его работу влияют как параметры среды ( Environment Options ), так и параметры проекта (Project Options). Для настройки встроенного отладчика откройте диалоговое окно Environment Options (выбрав команду Environment Options в разделе Tools меню Delphi ) и активизируйте страницу Preferences.


Переключатели из группы Compiling and Running управляют работой отладчика.

Опция Show compiler progress позволяет показывать диалоговое окно процесса компиляции приложения.

Опция Warn on package rebuild позволяет выдавать информацию предупреждения, генерируемую компилятором.

Опция Minimize on run обеспечивает минимизацию Delphi (т.е. свертывание Delphi ) на время работы приложения. Когда приложение закрывается, Delphi восстанавливается.

Опция Hide designers on run позволяет спрятать на время отладки все неиспользуемые на этот период окна (например, окно инспектора объекта и окно формы).

Прежде чем начать использование инструментария отладчика Delphi, вы должны заставить компилятор генерировать специальную информацию, необходимую для его работы. Для конфигурирования отладчика откройте раздел Project и выберите команду Options для входа в диалоговое окно Project Options . Выберите вкладку Compiler . Откроется диалоговое окно со страницей параметров компилятора раздел Debugging (рисунок 3).

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

Опция Debug Information сообщает компилятору о необходимости генерировать информацию для отладчика. Эта информация, сохраняемая в файле с расширением . DCU, в основном состоит из таблицы, сопоставляющей номер строки вашей программы с позицией команды в полученном исполняемом модуле. Всегда оставляйте эту опцию включенной во время разработки программы, чтобы иметь возможность пользоваться отладчиком Delphi.


Опция Local Symbols сообщает компилятору о необходимости создать список переменных, используемых в вашей программе, сохранив его в файле с расширением . DCU . Список содержит имя каждой переменной и ее положение в памяти при выполнении программы. Если его содержимое доступно отладчику, то вы сможете контролировать величины, содержащиеся в переменных, и даже менять их во время работы программы. Всегда оставляйте эту опцию включенной на этапе разработки, поскольку это повышает эффективность работы с отладчиком.

Опция Reference info (Y) представляет собой эквивалент директивы Y, генерирует информацию о ссылках на объявления идентификаторов, где они используются. Эта информация необходима для работы Code browser.


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

Опция Definition only представляет собой вспомогательную опцию, доступную только при включенной опции Reference info (Y) . Она определяет генерацию информации только об определенных ссылках.

Опция Assertions ( C ) представляет собой эквивалент директивы {$C}, она управляет генерацией информации, связанной с процедурой Assert. При включении этой опции код Assert удаляется из файла, но после этого надо повторно откомпилировать модуль.

В Delphi 5 добавилась новая опция Use Debug DCUs, которая разрешает использовать отладочную версию компонентов VCL. Если она включена, среда Delphi использует, вместо пути Search path (устанавливается командой Project Options на странице Directories/Conditionals ), путь Debug DCU (устанавливается командой Tools/Debugger Options на странице General ).


Использование контрольных точек.


Если ваша программа запускается и никогда не "зависает", она все же может работать не так, как вы этого хотите. Некоторые логические ошибки проявляют себя быстро. В других случаях такая ошибка может случаться довольно редко. Логические ошибки самые тяжелые, и для их поиска и исправления вам может помочь использование контрольных точек.

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

Вы можете устанавливать контрольные точки различными способами.


Первый способ:
в Редакторе кода произведите щелчок левой кнопкой мыши слева от выбранной строки программного кода на серой полосе области Редактора кода. Среда Delphi покажет маленький знак на сером поле диалогового окна и подсветит строку программы, например, красным цветом (рисунок 4). Это простейший способ, которым вы будете пользоваться чаще всего.


Второй способ:
установите курсор на строку, куда вы хотите вставить контрольную точку, и нажмите клавишу F5.


Третий способ:
установите курсор на строку, куда вы хотите вставить контрольную точку, и выберите раздел Run меню Delphi, далее команду Add Breakpoint, Source Breakpoint (рисунок 5) .


Используйте диалоговое окно Add Source Breakpoint для добавления контрольной точки в позицию строки в вашем исходном коде.

Опция Filename определяет имя исходного файла для контрольной точки.

Опция Line Number (номер строки) позволяет устанавливать или изменять номер строки для контрольной точки.

Опция Condition (условие) определяет условное выражение, которое оценивается всякий раз, когда встречается контрольная точка. Введите условное выражение, чтобы остановить выполнение программы. Вы можете ввести любое правильное выражение языка Pascal .

Таким образом, определяются условные контрольные точки. Некоторые ошибки происходят только в определенных обстоятельствах, создавшихся в вашей программе. Для поиска этих ошибок Delphi предусматривает условные контрольные точки, которые активируются только при выполнении определенных, заданных вами условий. Предположим, что в программе имеется ошибка, которая проявляется только во время рисования эллипса. Поместите контрольную точку на строку программы (допустим, строка текста процедуры TForml.DrawShape ) и войдите в диалоговое меню редактирования контрольных точек. В текстовое окно Condition введите DrawingTool=dtEllipse и нажмите Enter . Запустите программу и нарисуйте четырехугольник — ничего не происходит. Теперь попытайтесь нарисовать эллипс — Delphi переходит в режим отладчика. Теперь вы можете использовать средства отладчика для просмотра переменных или пошагового исполнения программы, как будет описано далее. Для продолжения работы программы просто нажмите клавишу F9.


В текстовое окно Conditions вы можете поместить почти любое выражение, допустимое в Pascal и не содержащее функций. Для активации контрольной точки значение выражения должно быть True или ненулевым.

Опция Pass Count (счет прохода) приводит к останову выполнения программы на определенном номере строки после определенного числа проходов. Среда Delphi осуществляет счет прохода всякий раз, когда встречается строка, содержащая контрольную точку. Вы можете использовать данную опцию, чтобы определить, какая итерация цикла терпит неудачу.

Установите счет прохода на определенный номер цикла и выполняйте вашу программу. Когда программа терпит неудачу, вы можете вычислить номер итерации цикла, проверяя номер счета прохода.

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


Четвертый способ:
используя команду меню View, выберите команду Debug Windows, далее Breakpoints. Откроется диалоговое окно Breakpoint List (рисунок 6). Произведите щелчок правой кнопкой мыши по пустому полю диалогового окна Breakpoint List — появится всплывающее меню с командой Add. Далее раскроется список команд, в котором выберите команд у Sourse BreakPoint.


Вы можете размещать контрольные точки только на строках с действительными операторами. Среда Delphi не поставит контрольную точку на комментарий.

Установив контрольные точки, нажмите клавишу F9 или кнопку Run на линейке инструментов. Среда Delphi откомпилирует вашу программу и будет ее выполнять до контрольной точки.

Используя любой из приведенных выше методов в обратном порядке, вы можете удалять контрольные точки. Для удаления сразу всех контрольных точек выберите команду Delete All Breakpoints в оперативном меню окна Breakpoint List .

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

Если вы установили контрольные точки, но они не нужны вам все время, вы можете временно отменить их действие. Это полезно, когда контрольные точки установлены внутри цикла и программа останавливается на каждом его проходе. Для отмены контрольной точки отметьте ее в окне Breakpoint List и выберите Disable Breakpoint в оперативном меню. Контрольная точка остается в списке, но она затенена в окне редактора кода. Для восстановления контрольной точки выберите Enable Breakpoint в оперативном меню. Для отмены или восстановления сразу всех контрольных точек выберите в оперативном меню Enable All или Disable All .

Окно Breakpoint List позволяет вам быстро переходить к тому месту в программе, где расположена контрольная точка. Просто отметьте контрольную точку и выберите View Source в оперативном меню. Среда Delphi помещает курсор в начало строки, содержащей контрольную точку. Если вы хотите, чтобы редактор кода получил фокус и вы могли немедленно приступить к редактированию, выберите в оперативном меню Edit Source.


Счетчик проходов контрольных точек в диалоговом окне Breakpoint List предназначен для ускорения процесса отладки Delphi. Установленные контрольные точки включаются в работу только после числа проходов, которые вы установили.

Если установите значение Pass равным 0, то контрольная точка вызывается каждый раз, когда программа ее встречает.


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

Буксируемая инструментальная линейка.


Некоторые приложения Windows имеют инструментальные линейки, которые могут быть помещены ниже основного меню, другие могут быть в виде вертикальных полос, а некоторые приложения имеют возможность преобразования инструментальной линейки в комплект инструментальных средств, т.е. маленькое плавающее окно.

Для создания буксируемой инструментальной линейки в другую область экрана необходимо проделать следующее. В качестве основы для примера будем использовать программу занятия 20 ToolBar (см. КГ № 28 (320) от 31.07.01.) (рисунок 7). Кнопки SpeedButton на лицевой части имеют графическое изображение.

    1. Запустите Delphi.
    2. Сохраните файл модуля под именем Tool_. pas, а файл проекта под именем DragTool.dpr .
    3. Задайте имя для формы, используя свойство Name, введите ToolBarForm.

Поместите на форму компонент Panel, восемь кнопок SpeedButton, компонент Label. К омпоненту Panel, который используется как инструментальная линейка, необходимо установить значение свойства DragMode равным dmAutomatic для поддержания процесса буксировки. Затем добавьте метод для события OnDragOver компонента Label1, присвоив параметру Accept значение True (строка 35 – 39 ). Далее приведен программный код, который требует пояснения. Повторяющиеся значения программного кода для выравнивания текста и т.д. не приводятся, используйте занятие 20.

    1. procedure Label1DragOver(Sender, Source: TObject; X, Y: Integer;
    2. State: TDragState; var Accept: Boolean);
    3. procedure Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
    4. procedure FormCreate(Sender: TObject);
    5. private
    6. { Private declarations }
    7. public
    8. BarPos: TAlign;
    9. PanelSize: Integer;
    10. BoxOn: Boolean;
    11. function GetBarPos (X, Y: Integer): TAlign;
    12. procedure RotateSpeedbar;
    13. procedure MoveButtons (Win: TWinControl);
    14. end;
    15. { Public declarations }
    16. var
    17. ToolBarForm: TToolBarForm;
    18. implementation
    19. {$R *.DFM}
    20. uses TBoxForm;


    21. const DragSize = 20;
    22. function TToolbarForm.GetBarPos (X, Y: Integer): TAlign;
    23. begin
    24. if X < DragSize then
    25. GetBarPos := alLeft
    26. else if Y < DragSize then
    27. GetBarPos := alTop
    28. else if X > ClientWidth - DragSize then
    29. GetBarPos := alRight
    30. else if Y > ClientHeight - DragSize then
    31. GetBarPos := alBottom
    32. else
    33. GetBarPos := alNone;
    34. end;


    35. procedure TToolbarForm.Label1DragOver(Sender, Source: TObject; X,
    36. Y: Integer; State: TDragState; var Accept: Boolean);
    37. begin
    38. Accept := True;
    39. end;


    40. procedure TToolbarForm.Label1DragDrop(Sender, Source: TObject;
    41. X, Y: Integer);
    42. var
    43. ReqPos: TAlign;
    44. begin
    45. ReqPos := GetBarPos (X + Label1.Left, Y + Label1.Top);
    46. if ReqPos = alNone then
    47. begin
    48. ToolBox.Show;
    49. Panel1.Visible := False;
    50. BoxOn := True;
    51. if BarPos in [alLeft, alRight] then
    52. RotateSpeedbar;
    53. {переместите кнопки в инструментарий}
    54. MoveButtons (ToolBox);
    55. end
    56. else
    57. begin
    58. Panel1.Align := ReqPos;
    59. if ( (ReqPos in [alTop, alBottom]) and
    60. (BarPos in [alLeft, alRight]) ) or
    61. ( (ReqPos in [alLeft, alRight]) and
    62. (BarPos in [alTop, alBottom]) ) then
    63. RotateSpeedbar;
    64. BarPos := ReqPos;
    65. end;
    66. end;


    67. procedure TToolbarForm.MoveButtons (Win: TWinControl);
    68. var
    69. I, J: Integer;
    70. begin
    71. {переместить быстрые кнопки в новый родительский компонент}
    72. for I := 0 to ComponentCount - 1 do
    73. if Components [I] is TSpeedButton then
    74. TSpeedButton (Components [I]).Parent := Win;
    75. if Win = ToolBox then
    76. begin
    77. {разместите быстрые кнопки в две строки}
    78. for J := 0 to Win.ControlCount - 1 do
    79. if Win.Controls [J].Left > 110 then
    80. begin
    81. Win.Controls [J].Left := Win.Controls [J].Left - 112;
    82. Win.Controls [J].Top := 30;
    83. end;
    84. end
    85. else
    86. begin
    87. {разместите вновь кнопки в одну строку}
    88. for J := 0 to Win.ControlCount - 1 do
    89. if Win.Controls [J].Top = 30 then
    90. begin
    91. Win.Controls [J].Left := Win.Controls [J].Left + 112;
    92. Win.Controls [J].Top := 2;
    93. end;
    94. end
    95. end;


    96. procedure TToolbarForm.RotateSpeedbar;
    97. var
    98. I, X, Y: Integer;
    99. begin
    100. for I := 0 to Panel1.ControlCount - 1 do
    101. begin
    102. {reverse X and Y}
    103. X := Panel1.Controls [I].Top;
    104. Y := Panel1.Controls [I].Left;
    105. Panel1.Controls [I].Top := Y;
    106. Panel1.Controls [I].Left := X;
    107. end;
    108. end;


    109. procedure TToolbarForm.FormCreate(Sender: TObject);
    110. begin
    111. BarPos := alTop;
    112. PanelSize := Panel1.Height;
    113. BoxOn := False;
    114. end;
    115. end.

Чтобы указать возможные положения инструментальной линейки, можно использовать тип данных TAlign, определяемый библиотекой VCL как:


TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);


Значение alNone будет использоваться, чтобы обозначить комплект инструментальных средств (а не инструментальную линейку). Этот тип данных является возвращаемым значением функции GetBarPos, которая возвращает другой код в зависимости от значений параметров Х и У, представляющих координаты формы (строка 22 – 34 ).

В этом коде DragSize — константа, которая определена в соответствии с программой и должна быть меньше высоты (или ширины) инструментальной линейки (строка 21 ). Как только заканчивается буксировка, вы должны переместить инструментальную линейку в новое место. Начнем с простого случая. Какой же код вы должны написать, чтобы переместить инструментальную линейку из верхней части формы к ее нижней части? Вы должны только изменить значение свойства Align панели:


Panell.Align := alBottom;


Вы можете просто игнорировать другие компоненты формы, потому что имеющийся компонент Label выровнен по клиентской области, т.е. он охватывает всю область формы, исключая прямоугольник, занятый инструментальной линейкой. Чтобы восстановить Panell в верхней части формы, требуется совершить обратное действие. Когда вы перемещаете инструментальную линейку в другое место, выполнится аналогичное действие с помощью возвращаемого значения функции (строки 45 – 46 ).


ReqPos := GetBarPos (X + Label1.Left, Y + Label1.Top);

Panell.Align := ReqPos;


При преобразовании панели в вертикальный элемент проблема состоит не в самой панели, а в быстрых кнопках, для которых она выступает в роли хозяина. Вам нужно перемещать каждую кнопку в новое место, или они не все будут видимы, кроме первых кнопок.

Чтобы переместить кнопку из горизонтальной полоски в вертикальную, вы можете просто поменять ее координату Тор на координату Left. Чтобы переместить кнопки обратно в горизонтальную полоску, вы снова должны выполнить такую же, но обратную операцию. Для этого использована процедура RotateSpeedbar (строки 96 – 108 ).

Описанный метод инвертирует значения X и Y для каждого управляющего элемента полоски, просматривая ControlCount из массива Controls . Но этот код хорошо работает только для квадратных управляющих элементов. Когда вы должны вызывать этот метод? Только когда старая и новая инструментальные линейки являются соответственно вертикальной и горизонтальной, или наоборот:


If ( (ReqPos in [alTop, alBottom]) and (BarPos in [alLeft, alRight]) ) or

( (ReqPos in [alLeft, alRight]) and (BarPos in [alTop, alBottom]) ) then RotateSpeedbar;


В этой проверке с помощью оператора if переменная BarPos содержит текущее положение инструментальной линейки. С помощью этого кода теперь вы можете перемещать инструментальную линейку в каждую из четырех сторон формы. И последнее, что вы должны сделать, это преобразовать инструментальную линейку в комплект инструментальных средств. Чтобы выполнить это, необходимо добавить в проект вторую форму ToolBox и присвоить ее свойствам BorderStyle значение bsToolWindow, a свойству FormStyle — значение fsStayOnTop.


Программный код для второй формы представлен ниже:


implementation

uses Tool_;

{$R *.DFM}

procedure TToolBox.FormClose(Sender: TObject; var Action: TCloseAction);

begin

ToolbarForm.Panel1.Visible := True;

ToolbarForm.BoxOn := False;

ToolbarForm.MoveButtons (ToolbarForm.Panel1);

if ToolbarForm.BarPos in [alLeft, alRight] then

ToolbarForm.RotateSpeedbar;

end;

end.


Форма комплекта инструментальных средств является пустой, и в нее можно копировать быстрые кнопки, когда это понадобится. Если операция буксировки завершается в центральной части формы, показывается комплект инструментальных средств, скрывается инструментальная линейка, поворачиваются быстрые кнопки. Если они расположены по вертикали, то вызывается метод MoveButtons. Код также присваивает частному логическому полю ВохО n формы значение True, чтобы указать, что инструментальная линейка видима, строки ( 46 – 55 ).

Метод MoveButtons выполняет два различных действия: вначале он перемещает кнопку в TWinControl, передаваемый как параметр, а затем размещает быстрые кнопки в две строки или же перемещает их обратно в одну строки ( 67 – 95 ).

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


Литература:

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

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

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




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

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