Инспектор объектов
Инспектор объектов предназначен для установки доступных на этапе проектирования свойств компонентов (то есть свойств, объявленных как published). Окно инспектора состоит из трех основных частей:
Селектора компонентов
Страницы свойств (Properties)
Страницы событий (Events)
Селектор компонентов представляет собой выпадающий комбинированный список и предназначен для выбора компонент для просмотра и редактирования. Обычно, в использовании селектора нет необходимости, так как выделенный компонент появляется в инспекторе объектов автоматически. Селектор компонентов отображает имя компонента и класс, от которого данный компонент происходит. Например, кнопка с именем OkButton будет представлена как «OkButton: TButton».
Страница Properties инспектора объектов отображает все свойства выбранного компонента, доступные на стадии проектирования. Страница разделена на два столбца. Столбец Property слева показывает имя свойства, столбец Value справа - значение этого свойства. Если свойство имеет тип класса, записи, или множества, то слева от его имени отображается знак +. Дважды щелкнув на имени такого свойства, можно получить доступ к отдельным его полям. Того же эффекта можно достичь, выбрав пункт Expand в контекстном меню инспектора объектов. Для закрытия развернувшегося списка полей необходимо повторно дважды щелкнуть на имени свойства, либо использовать пункт Collapse в контекстном меню инспектора объектов. Во многих случаях редактор отображает список возможных значений свойства. Для свойств, представляющих собой объекты (экземпляры классов VCL) существуют две возможности для редактирования. Во-первых, можно, щелкнув на кнопке с многоточием (…) в столбце Value свойства вызвать редактор соответствующего свойства; либо, щелкнув дважды на имени свойства, можно развернуть список его полей, как описано выше. Если на форме выделено несколько компонентов, инспектор объектов покажет их общие свойства. Это дает возможности менять свойства нескольких компонентов одновременно.
Страница Events редактора объектов содержит список событий, которые может обрабатывать данный компонент. Для создания обработчика события необходимо дважды щелкнуть на столбце Value рядом с именем этого события. При этом Delphi создаст метод, со всеми параметрами, необходимыми для обработки события. Активизируется окно редактора кода с курсором, расположенным внутри обработчика события. Остается только ввести код обработчика! Обычно имя обработчика события генерируется автоматически, однако, можно вручную задать требуемое имя в столбце Value напротив имени события. После нажатия клавиши Enter произойдет генерация скелетного кода обработчика события с заданным именем. Можно связать событие с уже имеющимся обработчиком. Для этого используется выпадающий список, появляющийся при нажатии соответствующей кнопки в столбце Value напротив имени события. В список включаются только обработчики событий, совпадающие по типу с данным событием.
Редактор кода
Основные средства упрощения процесса создания исходного кода приложе- ний собраны в едакторе кода (Code Editor), который из окна для отображе- ния и редактирования кода модулей приложения превратился в удобное сред- ство с многочисленными справочными и вспомогательными возможностями.
Шаблоны компонентов
Шаблоны компонентов предоставляют удобный способ использования наи- более часто применяемых групп компонентов (например, часто требуется объединить пояснительную надпись, поле редактирования и кнопку). При этом сделанные при создании шаблона настройки свойств составляющих его компонентов сохраняются и переносятся на новую форму вместе с этими компонентами.
Создание шаблона включает следующие шаги:
1. На форме необходимо разместить требуемые компоненты, выровнять их и настроить нужные свойства.
2. Выделить на форме компоненты, которые предполагается включить в шаблон, в группу.
3. Выбрать в меню Components Главного окна среды разработки команду Create Component Template.
4. В появившемся диалоге требуется задать имя нового шаблона и указать страницу Палитры компонентов, на которой шаблон будет доступен. Нажать кнопку ОК.
Теперь шаблон можно использовать обычным способом: после выбора его на странице Палитры компонентов и переноса, на форме появляется заданный набор компонентов с определенными ранее свойствами.
Шаблоны кода
Шаблоны кода предназначены для быстрой вставки в исходные код моду-. лей проекта стандартных (или часто используемых) комбинаций операторов языка Object Pascal. Для вызова шаблона кода используется комбинация клавиш иш
+, после нажатия которой появляется список доступных в настоящее время шаблонов.
Выбор наименования шаблона из раскрывшегося списка приводит к появ- лению на указанном мышью месте набора операторов, определяемых шаб- лоном. Стандартная поставка Delphi включает несколько типовых шаблонов с наиболее распространенными наборами операторов.
Опция завершения кода
Опция завершения кода применяется при необходимости использовать в исходном коде проекта свойства и методы стандартных компонентов Delphi. Включение механизма завершения кода происходит после ввода символа точки за названием класса или объекта. едактор кода автоматически разворачивает список всех свойств и методов компонента. После выбора нужного элемента списка и нажатия клавиши свойство или метод дописывается в имени класса или объекта. Так как многие классы обладают. внуши- тельным списком свойств, доступных программисту, то при выборе нужного элемента из списка можно воспользоваться наращиваемым поиском — при вводе после точки первых букв свойства или метода осуществляется автоматическое позиционирование списка на первый похожий элемент.
Опция включается на странице Code Insight в диалоговом окне команды Environment Options меню Tools Главного меню среды разработки при помощи флажка Сне Completion (рис. 2.1).
Опция параметров
Опция параметров осуществляет вывод справочной информации о количестве и типах параметров, входящих в состав любой процедуры или функции, название которой есть в исходном коде проекта в окне едактора кода. Справочные данные появляются при позиционировании курсора на названии процедуры или функции.
Опция включается на странице Code Insight в диалоговом окне команды Environment Options меню Tools Главного меню среды разработки при помощи флажка Соде Parameters (рис. 2.1).
Опция заполнения класса
Эта функция автоматически генерирует исходный код для любых составных частей нового класса (свойств и методов), которые уже объявлены в секции interface, а также создает объявление для тех элементов, которые уже описаны в секции implementation.
Чтобы создать описание объявленных свойств и методов, необходимо установить курсор в любое место объявления класса в секции interface и нажать комбинацию клавиш ++.
После этого Delphi, во-первых, создаст для объявленных свойств класса не- обходимые свойства и методы для чтения и записи в секции private. Во- вторых, в секции implementation будет сгенерировано описание необходимых методов.
Например, имеется простейший класс:
type TSimpleObject = class (TObject) property Empty: Integer; function ClearEmpty: Boolean; end;
Тогда, после нажатия комбинации клавиш ++, исходный код в секции interface будет приведен к следующему виду:
type TSimpleObject = class (TObject) property Empty: Integer read FEmpty write SetEmpty; function ClearEmpty: Boolean; private FEmpty: Integer; procedure SetEmpty(const Value: Integer); end;
А в секции implementation появятся следующие строки:
function TSimpleObject.ClearEmpty: Boolean; begin
end;
procedure TSimpleObject.SetEmpty(const Value: Integer); begin FEmpty := Value; end;
3. Межпрограммное взаимодействие
Часто возникает необходимость организовать взаимодействие программ, написанных разными людьми или даже разными фирмами. Задача решается в рамках идеологии «клиент-сервер», когда одно приложение должно реагировать на запросы других приложений. Наконец, с развитием сетей совершенно обычной стала задача взаимодействия приложения на разных машинах.
Для организации взаимодействия между задачами существует очень много инструментов. Некоторые из них позволяют работать в рамках только одной машины, некоторые - в рамках локальной или глобальной сети. Связь между двумя программами можно установить таким образом, что изменения в одном приложении будут отражаться во втором. Например, если Вы меняете число в электронной таблице, то во втором приложении данные обновятся автоматически и отобразят изменения. Кроме того, можно из своего приложения управлять другими приложениями такими, как Word for Windows, Excel и др.
Dynamic Data Exchange (DDE)
DDE дает возможность перейти через рамки приложения и взаимодействовать с другими приложениями и системами Windows. Dynamic Data Exchange получило свое имя потому, что позволяет двум приложениям обмениваться данными (текстовыми, через глобальную память) динамически во время выполнения. DDE - давний и прижившийся протокол обмена данными, появившийся еще на заре эры Windows. Ниша, занимаемая DDE - это оперативная передача и синхронизация данных в приложениях.
Приложения, использующие DDE, подразделяются на две категории: клиенты и серверы. Оба участника процесса совершают контакты (conversations) по определенным темам (topics), при этом в рамках темы производится обмен элементами данных (items). Устанавливает контакт DDE-клиент, который посылает запрос, содержащий имена контакта и темы. После установления контакта всякое изменение элемента данных на DDE-сервере передается элементу данных клиента. Одно и то-же приложение может быть одновременно и сервером, и клиентом (например, MicroSoft Word).
DDE-серверы
Для построения DDE-сервера в Delphi имеются два объекта, расположенные на странице System Палитры Компонент - TDdeServerConv и TDdeServerItem. Обычно в проекте используется один объект TDdeServerConv и один или более TDdeServerItem. Для получения доступа к сервису DDE-сервера, клиенту потребуется знать несколько параметров: имя сервиса (Service Name) - это имя приложения (обычно - имя выполняемого файла без расширения EXE, возможно с полным путем); Topic Name - в название темы; Item Name – название элемента данных.
Назначение объекта TDdeServerConv - общее управление DDE и обработка запросов от клиентов на выполнение макроса. Последнее выполняется в обработчике события OnExecuteMacro, например, как это сделано ниже:
procedure TDdeSrvrForm.DoMacro(Sender: TObject;Msg: TStrings); var Text: string; Begin Text := ''; if Msg.Count > 0 then Text := Msg.Strings[0]; MessageDlg ('Executing Macro - ' + Text, mtInformation, [mbOK], 0); End;
Важнейшим свойством компонента TDdeServerConv является название темы, содержащееся в свойстве Name. Клиент должен знать это имя при установлении контакта, за исключением случая, когда он подключается к данным контакта, скопированным в буфер обмена.
В моменты открытия и закрытия контакта возникают события:
Property OnOpen: tNotifyEvent; Property OnClose: tNotifyEvent;
Объект TDdeServerItem связывается с TDdeServerConv посредством свойства
Property ServerConv:tDDEServerConv,
и определяет, что, собственно, будет пересылаться по DDE. В принципе, потокол DDE подразумевает обмен любыми данными, формат которых зарегистрирован в системе для передачи через буфер обмена. Однако для рассматриваемых компонентов эти возможности ограничиваются только текстовыми данными. Для этого у компонента TDdeServerItem есть свойства Text и Lines (Text имеет то же значение, что и Lines[0]).
Property Text:string; Property Lines:tStrings;
При изменении значения этих свойств автоматически происходит пересылка обновленных данных во все приложения-клиенты, установившие связь с сервером.
Данный компонент позволяет также осуществлять установление связи через буфер обмена (Clipboard). Для этого служит метод CopyToClipboard. Необходимая информации помещается в через буфер обмена и может быть вызвана из приложения-клиента при установлении связи. Обычно, в DDE-серверах для этого есть специальный пункт меню Paste Special или Paste Link.
DDE-клиенты
Для построения DDE-клиента в Delphi используются два компонента TDDEClientConv и TDDEClientItem. Аналогично серверу, в программе обычно используется один объект TDDEClientConv и один и более связанных с ним TDDEClientItem.
TDDEClientConv служит для установления связи с сервером и общим управлением DDE-связью. Установить связь с DDE-сервером можно как во время разработки, так и во время выполнения программы, причем двумя способами. Первый способ - заполнить вручную необходимые свойства компонента. Это DdeService, DdeTopic и ServiceApplication. Если во время разработки дважды щелкнуть на одном из первых двух свойств в Инспекторе Объектов - появится диалог для определения DDE-связи. Для установления связи через Clipboard в диалоге есть специальная кнопка Past Link. Ей можно воспользоваться, если Вы запустили DDE-сервер, сохранили каким-то образом информацию о связи и вошли в этот диалог. Например, если DDE-сервером является DataBase Desktop, то нужно загрузить в него какую-нибудь таблицу Paradox, выбрать любое поле и выбрать пункт меню Edit|Copy. Свойство ServiceApplication заполняется в том случае, если в поле DDEService содержится имя, отличное от имени программы, либо если эта программа не находится в текущей директории. В этом поле указывается полный путь и имя программы без расширения (.EXE). Данная информация нужна для автоматического запуска сервера при установлении связи по DDE, если тот еще не был запущен.
Имена сервера DDE и темы содержатся в свойствах:
Property DDEService:string; Property DDETopic:string;
Способ вхождения в контакт определяется свойством
Property ConnectMode:tDataMode; Type tDataMode = (DDEAutomatic,DDEManual);
Метод
Function SetLinc(const Service: string; const Topic: string):Boolean; Присваивает свойствам DDEService и DDETopic соответствующие значения, а в случае, если задан режим DDEAutomatic, и устанавливает контакт. В режиме DDEManual для установления контакта необходимо дополнительно вызвать метод
Function OpenLink: Boolean; Этот метод сначала закрывает предыдущий контакт, затем пытается связаться с сервером DDEService на тему DDETopic. Если это не удается сразу, предпринимается попытка загрузить приложение с именем, определенным в свойстве:
Property ServiceApplication: string; Можно связаться с сервером, поместившим данные в буфер обмена с помощью метода
Function PasteLink: boolean;
Ниже приведен пример процедуры, осуществляющей связь с сервером.
procedure TMainForm.doNewLink(Sender: TObject); begin DdeClient.SetLink(AppName.Text, TopicNameEdit.Text); DdeClientItem.DdeConv := DdeClient; DdeClientItem.DdeItem := ItemName.Text; end;
procedure TMainForm.doPasteLink(Sender: TObject); var Service, Topic, Item : String; begin if GetPasteLinkInfo (Service, Topic, Item) then begin AppName.Text := Service; TopicName.Text := Topic; ItemName.Text := Item; DdeClient.SetLink (Service, Topic); DdeClientItem.DdeConv := DdeClient; DdeClientItem.DdeItem := ItemName.Text; end; end;
После того, как установлена связь, нужно позаботиться о поступающих по DDE данных, это делается в обработчике события OnChange объекта TDdeClietItem:
procedure TFormD.DdeClientItemChange(Sender: TObject); begin DdeDat.Lines := DdeClientItem.Lines; end;
Это единственная задача объекта TDdeClientItem.
Свойство
Property DDEConv: TddeClientConv
Этого компонента предназначено для связи с соответствующим объектом DdeClientConv. А свойство
Property DDEItem:string;
Должно содержать имя элемента данных.
Свойства
Property Text: string; Property Lines: tStrings;
Аналогичны соответствующим свойствам tDDEServerItem и содержат данные.
На объект TDdeClientConv возлагаются еще две задачи: пересылка данных на сервер и выполнение макросов. Для этого у данного объекта есть соответствующие методы.
Function ExecuteMacroLines(Cmd:tStrings, WaitFlg:Boolean):Boolean; Function PokeDataLines(const Item:string,Data:tStrings):Boolean;
|