|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Разработка DDE-сервераПриложение, получающее данные из другого приложения по DDE и/или управляющее другим приложением с помощью команд через DDE является DDE-клиентом. В этом случае второе приложение является DDE-сервером. Рассмотрим проект DDE-сервера, выполненного на языке программирования Borland Delphi 6. На рис.20 представлено окно DDE-сервера во время дизайна в среде Delphi
Рис. 20. Окно DDE-сервера на стадии проектирования в Delphi
Для построении DDE-сервера в Delphi имеются два объекта, расположенные на странице System Палитры Компонент - TDdeServerConv и TDdeServerItem. Обычно в проекте используется один объект TDdeServerConv и один или более TDdeServerItem. Для получения доступа к сервису DDE-сервера, клиенту потребуется знать несколько параметров: имя сервиса (Service Name) - это имя приложения (обычно - имя выполняемого файла без расширения EXE, возможно с полным путем); Topic Name - в Delphi это имя компоненты TDdeServerConv; Item Name - в Delphi это имя нужной компоненты TDdeServerItem. Назначение объекта TDdeServerConv - общее управление DDE и обработка запросов от клиентов на выполнение макроса. Объект TDdeServerItem связывается с TDdeServerConv и определяет, что, собственно, будет пересылаться по DDE. Для этого у него есть свойства Text и Lines. (Text имеет то же значение, что и Lines[0].) При изменении значения этих свойств автоматически происходит пересылка обновленных данных во все приложения-клиенты, установившие связь с сервером. При запуске приложения происходит выполнение процедуры TDDEServe.FormActivate:
procedure TDDEServe.FormActivate(Sender: TObject); var nidata: TNotifyIconData; begin Application.ShowMainForm:= False; ShowWindow(Application.Handle, SW_HIDE); ShowWindow(Application.MainForm.Handle, SW_HIDE); with nidata do begin cbSize:= SizeOf(TNotifyIconData); Wnd:= Self.Handle; uID:= 1; uFlags:= NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallBackMessage:= WM_MYICONNOTIFY; hIcon:= Application.Icon.Handle; StrPCopy(szTip,Application.Title); end; Shell_NotifyIcon(NIM_ADD, @nidata); ru:=10; end;
В этой процедуре приложение сворачивается в системный Tray, а форма становится невидимой. Окончание работы DDE-сервера вызывается путём нажатия левой или правой кнопкой мыши на иконке приложения в области системного Tray. Обработка этого события выполняется в процедуре TDDEServe.WMICON:
procedure TDDEServe.WMICON(var msg: TMessage); begin case msg.LParam of WM_RBUTTONDOWN,WM_LBUTTONDOWN: close; end; end;
При этом, при закрытии окна приложения вызывается процедура TDDEServe.FormDestroy, в которой происходит удаление иконки из системного Tray:
procedure TDDEServe.FormDestroy(Sender: TObject); var nidata: TNotifyIconData; begin with nidata do begin cbSize:= SizeOf(TNotifyIconData); Wnd:= Self.Handle; uID:= 1; end; Shell_NotifyIcon(NIM_DELETE, @nidata); end;
Работа приложения в целом строится посредством вызова процедуры TDDEServe.Timer1Timer по прерыванию таймера.
implementation {$R *.DFM} uses ComObj, activex, ShellApi, shlobj, registry; var xsin: integer; ru:real; boolka:boolean;
procedure TDDEServe.Timer1Timer(Sender: TObject); var LPTbyte: byte; begin xsin:=xsin+1; if xsin>1000 then xsin:=xsin-1000; DDEItem100.Text:=inttostr(5*(xsin-20*trunc(xsin/20))); //пилообразный сигнал asm mov dx,379h in al,dx and al,80h mov LPTbyte,al end; DDEItem200.Text:=inttostr(LPTbyte*100); //состояние линии LPT-порта DDEItem300.Text:=inttostr(round(50+50*sin(xsin/20))); if (xsin/5)=trunc(xsin/5) then if (ru<round(50+50*sin(xsin/20))) then begin boolka:=true; ru:=ru+20 end else begin boolka:=false; ru:=ru-20 end; if boolka then DDEItem400.Text:='100' else DDEItem400.Text:='0'; end;
Для обеспечения DDE-обмена задекларированы следующие константы: ‘DDEServer’ – имя сервиса (Service Name); ‘DDETopic’ – Topic Name; ‘DDEItem100’ – переменная обмена; ‘DDEItem200’ – переменная обмена; ‘DDEItem300’ – переменная обмена; ‘DDEItem400’ – переменная обмена.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |