Программный интерфейс плагинов приложения «LoggerXP» (описание)
Версия интерфейса 5.1
Copyright © 2003 – 2010
Общие сведения
Приложение «LoggerXP» имеет программный интерфейс (API), через который оно способно взаимодействовать с плагинами (вернее бы сказать: плагины имеют этот API). В данном случае плагин – это обычная DLL, но имеющая в названии файла расширение «.lop» (logger plugin). При этом сам плагин должен экспортировать пять обязательных функций (процедур): RoexGetVersion, RoexGetInfo, RoexRun, RoexRelease, RoexSendNotify и одну необязательную: RoexShowOptionsDialog. В основе взаимодействия приложения с плагинами лежат несколько интерфейсов с определёнными идентификаторами GUID. Следует отметить, что это не имеет ни какого отношения к технологии COM. Благодаря использованию интерфейсов становиться возможным непосредственно из плагина обращаться к методам и компонентам форм, источникам данных и т. д..
Приложение «LoggerXP» написано в среде программирования (IDE) «Delphi 7». Все плагины лично мной также были написаны в этой IDE. Тестирование плагинов написанных в старших или младших версиях Delphi не производилось.
В разделе uses файла проекта плагина первым должен быть подключён модуль ShareMem. Пример показан ниже.
library QRZcom;
uses
ShareMem,
{…остальные модули };
{$E lop}
{$R *.res}
exports
RoexGetVersion, RoexGetInfo, RoexRun, RoexSendNotify, RoexRelease,
RoexShowOptionsDialog;
begin
end.
Экспортируемые плагинами процедуры и функции
И так. Каждый плагин должен иметь ряд экспортируемых процедур и функций, через которые и происходит «общение» приложения с плагином (а вот «общение» плагина с приложением, как уже было сказано выше, осуществляется через интерфейсы). Рассмотрим эти процедуры и функции.
После того, как плагин загружен приложением в память вызывается процедура:
procedure RoexGetInfo(PlugInfo: PPlugInfo); stdcall;
В параметре PlugInfo передаётся указатель на структуру TPlugInfo. Эта структура объявлена следующим образом:
{ Структура информации о плагине }
PPlugInfo = ^TPlugInfo;
TPlugInfo = packed record
lpName : PChar; // имя плагина
lpCopyright: PChar; // авторские права
lpDescript : PChar; // описание плагина
bGUI : Boolean; // True, если плагин должен загружаться только по команде меню
end;
Здесь:
lpName – имя плагина, которое будет отображаться в меню, в окне управления плагинами приложения и в окне «О плагине…»;
lpCopyright – авторские права отображаемые в окне «О плагине…»;
lpDescript – краткое описание плагина отображаемое в окне «О плагине…»;
bGUI – если плагин должен загружаться по команде меню (пользователем), то это значение должно быть True. Имя плагина в данном случае будет помещено в меню «Плагины» главного окна приложения. Если это значение False, то плагин будет загружаться автоматически во время загрузки приложения. При этом имя плагина в меню не помещается.
Далее идёт вызов функции:
function RoexGetVersion: Integer; stdcall;
Она должна возвращать константу с минимальным номером версии API, на которую рассчитан плагин: PLUG_VERSION = 51; // версия интерфейса плагина
Я оставляю за собой право увеличивать это значение по мере усовершенствования интерфейсов (добавление в них новых процедур функций и т. д.).
Функция
function RoexRun(PlugData: PPlugData; const hHandle: THandle): THandle; stdcall;
вызывается приложением при запуске плагина на выполнение. В теле этой функции могут создаваться экземпляры форм, классов, выделяться ссылки и т. д. Функция имеет два параметра:
PlugData – указатель на структуру TPlugData;
hHandle – хэндл загруженного приложением плагина. Этот параметр передаётся из приложения в плагин и будет нужен для целей описанных ниже.
Если в теле этой функции создаётся экземпляр главной формы плагина, то она должна обязательно возвращать хэндл этой формы. Иначе – 0. Например, в плагине пишем:
function RoexRun(PlugData: PPlugData; const hHandle: THandle): THandle; stdcall;
begin
Result := 0;
hPlugin := hHandle;
if bIsRun then Exit;
hOldApp := Application. Handle;
Application. Handle := TApplication(PlugData^.MainForm. Application).Handle;
MainForm := TMainForm. CreateParented(Application. Handle);
Result := MainForm. Handle;
bIsRun := True;
end;
Если форма не является модальной и вы желаете сделать её непотопляемой (т. е. она должна быть всегда поверх главного главного окна приложения), то для формы необходимо переопределить метод CreateParams.
procedure TMainForm. CreateParams(var Params: TCreateParams);
begin
inherited;
{ Форма всегда поверх родительской. }
with Params do
WndParent := hParent;
end;
Здесь hParent := TForm(PlugData^.MainForm. Form).Handle;
Так как созданная форма плагина не добавляется в объект TScreen, то при сворачивании главного окна приложения эта форма остаётся на экране монитора. Чтобы решить эту проблему в приложении был создан специальный менеджер управления окнами. Именно через функцию RoexRun хэндл формы плагина добавляется в этот менеджер. Если форма после своего закрытия не уничтожается, а просто скрывается то, чтобы она не отображалась вновь при разворачивании главного окна приложения (если оно было ранее свёрнуто на панель задач) в конструкторе Create формы всегда следует писать:
procedure TMainForm. FormCreate(Sender: TObject);
begin
SetProp(Handle, PChar(RX_WS), 1);
end;
Здесь RX_WS: String = '{8E5FED9-92FD-0E509B91320F}'; То же самое следует писать и в обработчиках событий FormShow, FormClose или FormHide:
procedure TMainForm. FormShow(Sender: TObject);
begin
SetProp(Handle, PChar(RX_WS), 2);
end;
В данном случае константа 2 показывает, что форма отображена на экране.
procedure TMainForm. FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetProp(Handle, PChar(RX_WS), 1);
end;
Никогда не вызывайте для экземпляра главной плагина формы метод Free, если только форма не модальная. Это должно делаться только в процедуре RoexRelease, описанной ниже. Если всё-таки нужно уничтожить экземпляр формы при её закрытии, то в обработчике события FormClose следует написать:
{ Посылаем сообщение родительскому окну о необходимости очистить
память. При этом, будет вызвана процедура RoexRelease. }
PostMessage(hParent, RX_RELEASE, Integer(RX_WPARAM), Integer(hPlugin));
Здесь:
RX_RELEASE = WM_USER + 132;
RX_WPARAM: String = '{03B9C4A7-74B5-4657-A887-F6F4B031168F}';
При этом процедура RoexRelease будет вызвана автоматически.
Процедура
procedure RoexRelease; stdcall;
вызывается приложением перед выгрузкой плагина. В теле этой процедуры можно освобождать выделенную ранее (в теле функции RoexRun) память и т. д.
Функция
function RoexSendNotify(const wMess, wParam: Word): WordBool; stdcall;
вызывается приложением, чтобы передать плагину какое-то событие. Возвращаемый результат этой функции может обрабатываться приложением. Если он имеет значение True, то плагин может перекрыть некоторые функции приложения (в основном команды меню) и взять управление «на себя».
Функция имеет два параметра передаваемых приложением:
wMess – тип сообщения. Может принимать одну из следующих констант:
SN_NONE = 0; // нет события
SN_NOTIFY = 1; // событие (код события при этом в параметре wParam)
SN_FORMCREATE = 2; // создание интерфейсной формы
SN_FORMDESTROY = 3; // удаление интерфейсной формы
SN_CLICKMENUFORM = 4; // щелчёк по кнопке меню
Если wMess равен SN_FORMCREATE или SN_FORMDESTROY, то параметр wParam имеет одно из следующих значений:
SNP_NEWQSOFORM = 1; // окно "новое QSO"
SNP_DXCLFORM = 2; // окно "DX-кластер"
SNP_CWFORM = 3; // окно "Телеграф"
SNP_CALLBOOKFORM = 4; // окно "база данных позывных"
SNP_SENDSPOTFORM = 5; // окно "Передать спот"
SNP_AWARDSFORM = 6; // окно "Дипломы"
SNP_QSLVIAFORM = 7; // окно "QSL-менеджеры"
SNP_AUDIOCENTERFORM = 8; // окно "Аудиоцентр"
SNP_ANTENNASFORM = 9; // окно "Управление антеннами"
SNP_MAPFORM = 10; // окно "Карты"
SNP_QSLPRINTFORM = 11; // окно "Печать QSL"
SNP_AWSTFORM = 12; // окно "Статистика по дипломам"
SNP_PREFLISTFORM = 13; // окно "База данных префиксов"
Например, если вам нужно отловить момент создания формы «Новое QSO», то нужно написать:
function RoexSendNotify(const wMess, wParam: Word): WordBool; stdcall;
begin
Result := False;
if (wMess = SN_FORMCREATE) and (wParam = SNP_NEWQSOFORM) then
begin
// Здесь что-то с этим делаем
//…
end;
end;
С параметром wMess равным SN_CLICKMENUFORM передаётся одно из следующих значений wParam:
SNP_IMPORT = 14; // команда меню "Импорт данных"
SNP_EXPORT = 15; // команда меню "Экспорт данных"
SNP_EDITFORM = 16; // команда меню "Редактирование"
SNP_DOCPROPFORM = 17; // команда меню "Свойства документа"
SNP_PREVIEWFORM = 18; // команда меню "Предварительный просмотр"
SNP_DXCCSTATFORM = 19; // команда меню "Статистика по странам"
SNP_MAPSFORM = 20; // команда меню "Карты"
SNP_SHOWTOMAP = 21; // команда меню "Показать на карте"
SNP_SEARCHINCLBK = 22; // команда меню "Найти в колбуках"
SNP_REFRESHQSOINFO = 23; // команда меню "Обновление информации о позывном" в окне "Новое QSO"
SNP_AWARDVIEWFORM = 24; // команда меню "Просмотр редактирование дипломных программ"
SNP_DXCLUSTERCONN = 25; // нажатие кнопки подключения к кластеру
SNP_DXCLUSTERDISCONN = 26; // нажатие кнопки отключения от кластера
SNP_DCCLUSTEREDIT = 27; // редактирование списка кластеров
SNP_SENDALLTOEQSL = 28; // отправить все QSO на eQSL
SNP_SENDSELTOEQSL = 29; // отправить только выбранные QSO на eQSL
В этом случае из функции RoexSendNotify вы можете возвратить True, чтобы перехватить управление на себя. Например, в плагине пишем:
function RoexSendNotify(const wMess, wParam: Word): WordBool; stdcall;
begin
Result := False;
if (wMess = SN_CLICKMENUFORM) and (wParam = SNP_EXPORT) then
begin
Result := True;
// Здесь показываем своё окно для экспорта данных
//…
end;
end;
С пареметром wMess равным SN_NOTIFY передаётся одно из следующих значений wParam:
SNPN_ADDNEWQSO = 4; // добавление в журнал новой записи
SNPN_TXRX = 5; // переключение приём/передача
SNPN_DXRSDSPOT = 6; // получение спота из DX-кластера
SNPN_QSOREPEAT = 7; // проверка повторов
SNPN_CWSEND = 8; // передача CW
SNPN_SEARCHCALLBOOK = 9; // поиск в колбуках
SNPN_MAINTABS = 10; // переключение закладок в главном окне
SNPN_NAMECHANGE = 11; // ввод имени
SNPN_QTHCHANGE = 12; // ввод QTH
SNPN_CALLSIGNCHANGE = 13; // ввод позывного
SNPN_BANDCHANGE = 14; // смена диапазона
SNPN_MODECHANGE = 15; // смена вида модуляции
SNPN_RSTTCHANGE = 16; // ввод рапорта
SNPN_RSTRCHANGE = 17; // ввод рапорта
SNPN_QSLVIACHANGE = 18; // ввод QSL-менеджера в окно "Новое QSO"
SNPN_DATASETOPEN = 19; // DataSet AfterOpen
SNPN_DATASETCLOSE = 20; // DataSet AfterClose
SNPN_DXSPOTTOQSOWND = 21; // перенос спота в окно "Новое QSO"
SNPN_AWARDSANALISER = 22; // анализ дипломных программ для нового QSO
SNPN_DELETEQSO = 23; // удаление одного QSO
SNPN_DELETESELQSO = 24; // удаление нескольких выбранных QSO
SNPN_SETFREQ = 25; // установка частоты
SNPN_CONFIGCHANGE = 26; // изменение настроек приложения
SNPN_QSLVIASEARCH = 27; // поиск QSL - менеджера в окне "QSL - менеджеры"
SNPN_OPENDOCUMENT = 28; // открытие документа
SNPN_SAVEDOCUMENT = 29; // сохранение документа
SNPN_UNIONLOGS = 30; // объединение журналов
SNPN_ERRUNIONLOGS = 31; // ошибка объединения журналов
SNPN_DELETELOG = 32; // удаление журнала
SNPN_ERRDELETELOG = 33; // ошибка удаления журнала
SNPN_MAPSTABS = 34; // щелчок по закладкам окна "Карты"
SNPN_CALLBOOKTABS = 35; // щелчок по закладкам окна "База данных позывных"
SNPN_DXCLASTERTABS = 36; // щелчок по закладкам окна "DX-кластер"
SNPN_EXITCALLFLD = 37; // выход курсора из поля "Позывной" окна "Новое QSO"
SNPN_VIEWTOMAP = 38; // запрос положения на карте
SNPN_FILLAWARD = 39; // начало автозаполнения дипломной программы
SNPN_CREATABACKUP = 40; // создание резервной копии журнала
SNPN_DXCLUSTERCONFCHG = 41; // изменение настроек кластера
SNPN_DXSENDSPOT = 42; // передача спота
SNPN_DXCLEARSPOTS = 43; // очистка принятых спотов
Есть ещё одна необязательная процедура:
procedure RoexShowOptionsDialog(const hHwnd: THandle); stdcall;
Она должна присутствовать в плагине, если необходимо в нём иметь окно с опциями (настройками). Например:
procedure RoexShowOptionsDialog(const hHwnd: THandle);
begin
with TOptionForm. CreateParented(hHwnd) do
try
ShowModal;
finally
Free;
end;
end;
Интерфейсы
Теперь рассмотрим более подробно структуру TPlugData передаваемую в параметре функции
RoexRun. Все члены структуры являются интерфейсами, через которые и происходит взаимодействие плагина с приложением. Как уже было сказано выше, это позволяет иметь полное или частичное (ограниченное тем или иным интерфейсом) взаимодействие плагина с формами и компонентами приложения. Структура TPlugData объявлена следующим образом:
PPlugData = ^TPlugData;
TPlugData = packed record
Config : IConfig;
Document : IDocument;
ExData : IExData;
Logs : ILogs;
Repiats : IRepiats;
Transceiver : ITransceiver;
MainForm : IMainForm;
NewQSOForm : INewQSOForm;
DxClusterForm: IDxClusterForm;
SendSpotForm : ISendSpotForm;
CWForm : ICWForm;
CallBookForm : ICallBookForm;
QSLViaForm : IQSLViaForm;
AwardsForm : IAwardsForm;
MapsForm : IMapsForm;
QSLPrintForm : IQSLPrintForm;
AntennasForm : IAntennasForm;
end;
Перед использованием каждого члена данной структуры он должен быть предварительно проверен на nil!
Интерфейс IConfig
Интерфейс IConfig предназначен для доступа к конфигурации (настройкам) приложения. Все свойства интерфейса в основном имеют права только на чтение. Интерфейс объявлен следующим образом:
IConfig = interface
['{164ECBD2-DFE9-40B1-9C07-F14E7374B935}']
function GetBandIndex: Integer;
function GetModeIndex: Integer;
procedure SetBandIndex(const Value: Integer);
procedure SetModeIndex(const Value: integer);
function GetBandName: String;
function GetModeName: String;
function GetConfigPath: String;
function GetProfilePath: String;
function GetPluginsDataPath: String;
function GetUserLat: Double;
procedure SetUserLat(const Value: Double);
function GetUserLong: Double;
procedure SetUserLong(const Value: Double);
property BandIndex: Integer read GetBandIndex write SetBandIndex;
property ModeIndex: Integer read GetModeIndex write SetModeIndex;
property BandName: String read GetBandName;
property ModeName: String read GetModeName;
property ProfilePath: String read GetProfilePath;
property ConfigPath: String read GetConfigPath;
property PluginsDataPath: String read GetPluginsDataPath;
property UserLat: Double read GetUserLat write SetUserLat;
property UserLong: Double read GetUserLong write SetUserLong;
function GetInsertColor: TColor;
function GetSelectedColor: TColor;
property InsertColor: TColor read GetInsertColor;
property SelectedColor: TColor read GetSelectedColor;
function GetFontColor: TColor;
function GetFontName: TFontName;
function GetFontSize: Integer;
function GetFontStyle: TFontStyles;
property FontName: TFontName read GetFontName;
property FontSize: Integer read GetFontSize;
property FontStyle: TFontStyles read GetFontStyle;
property FontColor: TColor read GetFontColor;
function GetToolbarStyle: Integer;
property ToolbarStyle: Integer read GetToolbarStyle;
function GetImageStyle: String;
property ImageStyle: String read GetImageStyle;
function GeteQSLLogin: String;
property eQSLLogin: String read GeteQSLLogin;
function GeteQSLPSW: String;
property eQSLPSW: String read GeteQSLPSW;
function GeteQSLProxyHost: String;
property eQSLProxyHost: String read GeteQSLProxyHost;
function GeteQSLProxyPort: Integer;
property eQSLProxyPort: Integer read GeteQSLProxyPort;
function GeteQSLProxyLogin: String;
property eQSLProxyLogin: String read GeteQSLProxyLogin;
function GeteQSLProxyPsw: String;
property eQSLProxyPsw: String read GeteQSLProxyPsw;
function GeteQSLProxyEnable: Boolean;
property eQQSProxyEnable: Boolean read GeteQSLProxyEnable;
function GeteQSLReadTimeout: Integer;
property eQSLReadTimeout: Integer read GeteQSLReadTimeout;
function GetProxyBasicAuthentication: Boolean;
property ProxyBasicAuthentication: Boolean read GetProxyBasicAuthentication;
function GetGQSLLogin: String;
property GQSLLogin: String read GetGQSLLogin;
function GetGQSLPSW: String;
property GQSLPSW: String read GetGQSLPSW;
function GetGQSLReadTimeout: Integer;
property GQSLReadTimeout: Integer read GetGQSLReadTimeout;
function GetPluginsInterfaceVersion: Integer;
function GetInternalExplorer: Boolean;
property InternalExplorer: Boolean read GetInternalExplorer;
function GetInternalMailClient: Boolean;
property InternalMailClient: Boolean read GetInternalMailClient;
function SaveConfig: Boolean;
end;
BandIndex | Текущий индекс диапазона. Индекс изменяется при смене диапазона в окне «Новое QSO» или через CAT. |
ModeIndex | Текущий индекс вида модуляции. Индекс изменяется при смене вида модуляции в окне «Новое QSO» или через CAT. |
BandName | Текущее имя диапазона (например, 1.8 МГц). Имя изменяется при смене диапазона в окне «Новое QSO» или через CAT. |
ModeName | Текущее имя вида модуляции (например, SSB). Имя изменяется при смене вида модуляции в окне «Новое QSO» или через CAT. |
ProfilePath | Путь к текущему профилю пользователя. Например, c:\Documents and Settings\Admin\Application Data\RS SoftX\loggerxp\Profiles\{E6596DAF-55B2-45CE-9F86-28BFF990A084} |
ConfigPath | Путь к корневой папке конфигурации приложения. Например, c:\Documents and Settings\Admin\Application Data\RS SoftX\loggerxp |
PluginsDataPath | Путь к папке конфигурации и данных плагинов. Например, c:\Documents and Settings\Admin\Application Data\RS SoftX\loggerxp\Plugins Data |
UserLat | Географическая широта пользователя, заданная по умолчанию в редакторе настроек. |
UserLong | Географическая долгота пользователя, заданная по умолчанию в редакторе настроек. |
InsertColor | Цвет выбранных записей таблиц. |
SelectedColor | Цвет отмеченных QSO главной таблицы приложения. |
FontName | Имя шрифта таблиц. |
FontSize | Размер шрифта таблиц. |
FontStyle | Стиль шрифта таблиц. |
FontColor | Цвет шрифта таблиц. |
ToolbarStyle | Стиль меню и панелей. |
ImageStyle | Имя темы кнопок (изображений на них). |
eQSLLogin | Логин для доступа к eQSL. Хранится в зашифрованном виде с использованием 96-битного шифрования. |
eQSLPSW | Пароль для доступа к eQSL. Хранится в зашифрованном виде с использованием 96-битного шифрования. |
eQSLProxyHost | Имя хоста прокси – сервера. Данное название свойства оставлено из-за соображения совместимости с предыдущими версиями когда прокси – сервер использовался только для eQSL. |
eQSLProxyPort | Номер порта прокси – сервера. Данное название свойства оставлено из-за соображения совместимости с предыдущими версиями когда прокси – сервер использовался только для eQSL. |
eQSLProxyLogin | Логин для доступа к прокси – серверу. Хранится в зашифрованном виде с использованием 96-битного шифрования. Данное название свойства оставлено из-за соображения совместимости с предыдущими версиями когда прокси – сервер использовался только для eQSL. |
eQSLProxyPsw | Пароль для доступа к прокси – серверу. Хранится в зашифрованном виде с использованием 96-битного шифрования. Данное название свойства оставлено из-за соображения совместимости с предыдущими версиями когда прокси – сервер использовался только для eQSL. |
eQQSProxyEnable | Используется ли к прокси – сервер или нет. Данное название свойства оставлено из-за соображения совместимости с предыдущими версиями когда прокси – сервер использовался только для eQSL. |
eQSLReadTimeout | Время ожидания данных с eQSL. |
ProxyBasicAuthentication | Прокси – сервер требует логин и пароль. |
GQSLLogin | Логин для доступа к Gold QSL. Хранится в зашифрованном виде с использованием 96-битного шифрования. |
GQSLPSW | Пароль для доступа к Gold QSL. Хранится в зашифрованном виде с использованием 96-битного шифрования. |
GQSLReadTimeout | Время ожидания данных с Gold QSL. |
InternalExplorer | Если True, то используется внутренний Интернет – браузер. |
GetPluginsInterfaceVersion | Функция возвращает текущий номер программного интерфейса |
InternalMailClient | Если True, то используется внутренний почтовый клиент. |
SaveConfig | Процедура сохраняет конфигурацию. |
Интерфейс IRoexForm
Все формы приложения описанные структурой TPlugData наследуют этот интерфейс.
IRoexForm = interface
['{8271DACDF-A47B-B7401CF3EA30}']
function GetForm: Pointer;
{ TForm }
property Form: Pointer read GetForm;
end;
Свойство GetForm возвращает указатель на саму форму. Используется, например, так:
if pPlugData^.DxClusterForm <> nil then
TForm(pPlugData^.DxClusterForm).Form. Caption := ‘Это работает плагин’;
Интерфейс ITab
Формы приложения описанные структурой TPlugData и способные создавать закладки (например, MainForm, MapForm, DXClusterForm и др.) наследуют этот интерфейс.
ITab = interface(IRoexForm)
['{303100F1-F0B7-45E8-ABB9-492C778B6DC7}']
function GetTabIndex: Integer;
function CreateTab(const ACaption: String; const PlugHandle: THandle): THandle;
procedure DeleteTab(const Hndl: THandle);
procedure ShowTabImage(const Hndl: THandle; const ShowImage: Boolean);
{ TCustomControl }
function GetTab: Pointer;
property TabIndex: Integer read GetTabIndex;
procedure SetActiveTab(const Hndl: THandle);
function GetTabOfHandle(const Hndl: THandle): Pointer;
end;
Свойство TabIndex возвращает индекс текущей активной закладки. Для первой закладки – это ноль.
Функция CreateTab создаёт новую закладку.
Здесь:
ACaption – текст заголовка закладки;
PlugHandle – хэндл плагина создающего закладку. Этот параметр используется только в том случае, если закладка создаётся у главного окна приложения.
Функция CreateTab возвращает хэндл только, что созданной закладки. Далее значение возвращённое этой функцией должно быть использовано при вызове DeleteTab (удаляет закладку), ShowTabImage (показывает изображение в заголовке (только для окна CallBookForm)), SetActiveTab (устанавливает активную закладку, если ноль, то это первая закладка), GetTabOfHandle (возвращает указатель типа TCustomControl на закладку с данным хэндлом).
Функция GetTab возвращает указатель типа TCustomControl на текущую активную закладку.
Интерфейс IMainForm
Данный интерфейс позволяет получить доступ к главной форме приложения, к объектам TApplication, TScreen и к другим объектам и компонентам этой формы.
IMainForm = interface(ITab)
['{E91BB80E-E0F6-4AC8F5120D1}']
function GetApplication: Pointer;
function GetScreen: Pointer;
function GetCurrentDBGrid: Pointer;
function GetRepiatDBGrid: Pointer;
function GetStatusBarText(const Index: Integer): String;
function GetMenu: Pointer;
procedure SetStatusBarText(const Index: Integer; const Value: String);
{ TApplication }
property Application: Pointer read GetApplication;
{ TScreen }
property Screen: Pointer read GetScreen;
{ TDBGrid }
property CurrentDBGrid: Pointer read GetCurrentDBGrid;
{ TDBGrid }
property RepiatDBGrid: Pointer read GetRepiatDBGrid;
{ TStrings }
property Menu: Pointer read GetMenu;
function AddStatusBarPanel(const AWidth: Integer; const AText: String): Integer;
procedure DeleteStatusBarPanel(const Index: Integer);
function GetConnection: Pointer;
function GetCurrentDataSet: Pointer;
{ TADOConnection }
property Connection: Pointer read GetConnection;
{ TDataSet }
property CurrentDataSet: Pointer read GetCurrentDataSet;
procedure DataFormsConnected(const Connected: Boolean);
{ TClientDataSet}
function GetReportDataSet: Pointer;
property ReportDataSet: Pointer read GetReportDataSet;
procedure ViewFilterStatus;
procedure ViewRecordCount;
procedure EQSLConfirmNew;
procedure EQSLConfirmAll;
procedure ShowMCHint(const Text: String);
procedure CreateBackupDataBase;
end;
SetStatusBarText | Процедура выводит текст на панель с индексом Index строки состояния. |
Application | Указатель на объект T Application. |
Screen | Указатель на объект TScreen. |
CurrentDBGrid | Свойство возвращает указатель на текущую таблицу |
RepiatDBGrid | Свойство возвращает указатель на таблицу повторных QSO |
Menu | Свойство возвращает указатель типа TStrings. Будет рассмотрено ниже. |
AddStatusBarPanel | Функция добавляет новую панель в строку состояния. В настоящий момент не реализована. |
DeleteStatusBarPanel | Процедура удаляет панель из строки состояния. В настоящий момент не реализована. |
Connection | Указатель на компонент TADOConnection. |
CurrentDataSet | Указатель на объект TDataSet. Возвращает текущий DataSet, в зависимости от текущего документа: журнал или архив. |
DataFormsConnected | Если Connected = False, то процедура отключает всех потребителей от источника данных. |
ReportDataSet | Указатель возвращает TClientDataSet отчёта. |
ViewFilterStatus | Процедура выводит текущий статус фильтра в строку состояния. |
ViewRecordCount | Процедура выводит количество записей в строку состояния. |
EQSLConfirmNew | Процедура запускает процесс подтверждения новых QSO имеющихся на eQSL. |
EQSLConfirmAll | Процедура запускает процесс подтверждения всех QSO имеющихся на eQSL. |
ShowMCHint | Процедура отображает всплывающее сообщение в системном трее Windows. В настоящий момент не реализована. |
CreateBackupDataBase | Процедура запускает мастер резервной копии базы данных или создаёт резервную копию данных, если в настройках приложения включена опция автоматического создания резервной копии. |
Как уже было сказано, интерфейс имеет свойство Menu в виде указателя на объект TStrings. Это свойство имеется также в интерфейсе IDxClusterForm. По сути дела это список команд создаваемых плагинами в меню «Плагины» главного окна приложения и контекстного меню. Пример создания пункта меню (команды) показан ниже.
const
RX_COMMAND_NAME = ‘Это команда меню созданного плагином’;
var
sCommandName: String = RX_COMMAND_NAME;
procedure CreateMenu;
var
i, iCount: Integer;
begin
{ Создаём пункт меню, при этом проверяем его уникальность.
Если такое имя уже есть, то к немуу добавляем цифру и проверяем вновь. }
if pPlugData^.MainForm <> nil then
with TStrings(pPlugData^.MainForm. Menu) do
begin
iCount := Count - 1;
for i := 0 to iCount do
if AnsiSameText(TStrings(pPlugData^.MainForm. Menu)[i], sCommandName) then
sCommandName := RX_COMMAND_NAME + ' ' + IntToStr(i + 1);
TStrings(pPlugData^.MainForm. Menu).Add(sCommandName);
end;
end;
Когда пользователь в приложении выбирает команду меню с именем RX_COMMAND_NAME, то всем плагинам посылается сообщение RX_COMMAND. При этом переменная Message. WParam будет содержать значение RX_COMMAND_NAME. Чтобы другие плагины не реагировали на эту команду, значение RX_COMMAND_NAME должно быть уникальным. Как раз уникальность и проверяется в выше приведённом примере.
Если команда меню создана, то её необходимо и обрабатывать. Сообщение RX_COMMAND должно обрабатываться только в форме. При этом форма должна быть постоянно создана, но показывать её не обязательно. В разделе private формы следует определить обработчик сообщения:
procedure RXCommand(var Message: TMessage); message RX_COMMAND;
Здесь RX_COMMAND = WM_USER + 134;
Далее в теле процедуры пишем:
procedure TMainForm. RXCommand(var Message: TMessage);
begin
with Message do
if String(WParam) = sCommandName then
{ Здесь что-то делаем… };
end;
Когда плагин выгружается, созданную команду меню следует удалять:
procedure DeleteMenu;
begin
{ Удаляем себя из меню. }
if pPlugData^.MainForm <> nil then
with TStrings(pPlugData^.MainForm. Menu) do
Delete(IndexOf(sCommandName));
end;
Интерфейс IDocument
Интерфейс позволяет осуществлять доступ к некоторым свойствам текущего документа (журнал, архив, отчёт) и к компонентам TOpenDialog, TSaveDialog.
IDocument = interface
['{5C9FAF21-D72F-46D9-ABAE-112AD6566634}']
{ TOpenDialog }
function GetOpenDocumentDialog: Pointer;
property OpenDocumentDialog: Pointer read GetOpenDocumentDialog;
{ TSaveDialog }
function GetSaveDocumentDialog: Pointer;
property SaveDocumentDialog: Pointer read GetSaveDocumentDialog;
function GetDocPath: String;
property DocPath: String read GetDocPath;
function GetDocType: TDocType;
function GetCurrentDocName: String;
end;
Свойство DocPath возвращает путь к файлу текущего документа. Если это журнал, то DocPath = ‘’.
Функция GetDocType возвращает тип текущего документа.
TDocType = (dtLog, dtArchive, dtReport, dtOther);
И последняя функция GetCurrentDocName возвращает имя текущего документа.
Интерфейс INewQSOForm
Интерфейс позволяет осуществить доступ к окну «Новое QSO». Назначение свойств вполне понятно из объявления интерфейса. Процедура SetVisible управляет видимостью формы без генерации событий OnHide и OnShow.
INewQSOForm = interface(IRoexForm)
['{ED48A729-418D-4DF0-8BEC-B54EE6F3772E}']
function GetBandField: Pointer;
function GetModeField: Pointer;
function GetCallsignField: Pointer;
function GetQTHField: Pointer;
function GetNameField: Pointer;
function GetRSTTField: Pointer;
function GetRSTRField: Pointer;
function GetQSLViaField: Pointer;
procedure SetVisible(const Value: Boolean);
{ TComboBox }
property BandField: Pointer read GetBandField;
{ TComboBox }
property ModeField: Pointer read GetModeField;
{ TEdit }
property CallsignField: Pointer read GetCallsignField;
{ TComboBox }
property QTHField: Pointer read GetQTHField;
{ TComboBox }
property NameField: Pointer read GetNameField;
{ TEdit }
property RSTTField: Pointer read GetRSTTField;
{ TEdit }
property RSTRField: Pointer read GetRSTRField;
{ TEdit }
property QSLViaField: Pointer read GetQSLViaField;
{ TEdit }
function GetQTHLocField: Pointer;
property QTHLocField: Pointer read GetQTHLocField;
end;
Интерфейс IExData
Интерфейс позволяет осуществлять доступ к дополнительным источникам данных приложения таким как, список префиксов, список регулярных выражений префиксов, список QSL-менеджеров и QSL-бюро. Кроме того имеет процедуры, свойства и функции облегчающие работу с этим интерфейсом.
IExData = interface
['{873F0EF0-C4D-DD870BAAA4BD}']
function GetConnection: Pointer;
function GetPrefixesDataSet: Pointer;
function GetRegExpDataSet: Pointer;
function GetQSLViaDataSet: Pointer;
function GetQSLBuroDataSet: Pointer;
function GetFreqModeMapDataSet: Pointer;
function GetTimeZone: Double;
function GetQSLVia(Callsign: String): String;
function GetQSLBuro(Callsign: String): String;
function GetFreqModeMap(const Freq: Integer; out Mode, Band: String): Boolean;
{ TADOConnection }
property Connection: Pointer read GetConnection;
{ TADOQuery }
property PrefixesDataSet: Pointer read GetPrefixesDataSet;
{ TADOQuery }
property RegExpDataSet: Pointer read GetRegExpDataSet;
{ TADOQuery }
property QSLViaDataSet: Pointer read GetQSLViaDataSet;
{ TADOQuery }
property QSLBuroDataSet: Pointer read GetQSLBuroDataSet;
{ TADOQuery }
property FreqModeMapDataSet: Pointer read GetFreqModeMapDataSet;
property TimeZone: Double read GetTimeZone;
function AddNewQSLVia(Callsign, Manager: String; Note: String = '';
ShowException: Boolean = True): Boolean;
function GetCurrentStdCallsign: String;
property CurrentStdCallsign: String read GetCurrentStdCallsign;
function GetCallsignInfo(Callsign: String; var IsFind: Boolean;
const ShortMode: Boolean = False): TCallsignInfo; overload;
function GetCallsignInfo(Callsign: String; QSODate: TDateTime;
var IsFind: Boolean; const ShortMode: Boolean = False): TCallsignInfo; overload;
procedure ShowDataEditor(DataSet: Pointer);
end;
GetQSLVia | Функция возвращает позывной QSL-менеджера для позывного Callsign. |
GetQSLBuro | Функция возвращает адрес QSL-бюро для позывного Callsign. |
GetFreqModeMap | Функция в параметрах Mode и Band возвращает вид модуляции и название диапазона для частоты Freq согласно сетке распределения частот и видов модуляций. |
Connection | Указатель на объект типа TADOConnection, который подключён к базе данных dataex. mdb. |
PrefixesDataSet | Указатель на объект типа TADOQuery – список префиксов стран. |
RegExpDataSet | Указатель на объект типа TADOQuery – список регулярных выражений для префиксов стран. |
QSLViaDataSet | Указатель на объект типа TADOQuery – список QSL-менеджеров. |
QSLBuroDataSet | Указатель на объект типа TADOQuery – список QSL-бюро. |
FreqModeMapDataSet | Указатель на объект типа TADOQuery – сетка частот и видов модуляций. |
TimeZone | Временная зона для текущего позывного, для которого получается информация. |
AddNewQSLVia | Функция добавляет QSL-менеджера для позывного Callsign. Если параметр Manager = ‘’, то менеджер для этого позывного удаляется. |
CurrentStdCallsign | Текущий позывной, для которого получается информация. При этом префикс позывного заменяется на DXCC-префикс. Например, RA3GBV будет заменён на UA3GBV. |
GetCallsignInfo | Функция возвращает информацию о позывном. Структура TCallsignInfo описана ниже. Если параметр ShortMode = True, то возвращаются только основные данные (DXCC, Континент). |
ShowDataEditor | Процедура отображает редактор данных. В параметре DataSet передаётся указатель на редактируемый объект типа TDataSet. |
{ Информация о позывном }
TCallsignInfo = record
dLat, dLong: Double; // широта и долгота корреспондента
dBearing : Double; // азимут корреспондента
dTimeZone : Double; // часовой пояс корресапондента
sTerritory : String; // название территории
sITU, sCQ : String; // зоны
sDXCC : String; // префикс DXCC
sContinent : String; // континент
sDistance : String; // расстояние до корреспондента
sManager : String; // QSL - менеджер корреспондента
sGrid : String; // QTH - локатор
end;
Интерфейс ILogs
Интерфейс позволяет читать имена таблиц журналов, имена журналов. Осуществляет доступ к DataSet текущего журнала (через свойство CurrentLog).
ILogs = interface
['{CC0BD663-AA79A-D849EC36424B}']
{ TStrings }
function GetTables: Pointer;
function GetCurrentTableName: String;
function GetCurrentLog: Pointer;
property CurrentTableName: String read GetCurrentTableName;
{ TADOQuery }
property CurrentLog: Pointer read GetCurrentLog;
procedure ContinentAndDXCCRepiat(const Continent, DXCC: String;
const AllLogs: Boolean; out Result1, Result2: Boolean);
procedure UpdateContinentDXCCRepiat;
end;
Функция GetTables возвращает указатель на объект типа TStrings, в котором находятся имена всех таблиц журналов. Процедура ContinentAndDXCCRepiat позволяет проверять континент и DXCC на повтор. Процедура UpdateContinentDXCCRepiat обновляет данные о повторах по континентам и DXCC.
Интерфейс IRepiats
Интерфейс позволяет осуществлять доступ к данным о повторных QSO. При помощи функции InstallRepeatFilter можно проверить позывной на повтор. При этом информация отобразиться в таблице повторных QSO главного окна приложения. Процедура Clear очищает эту таблицу.
IRepiats = interface
['{790046B9-392E-47AE-9303-2D6155A291FD}']
function GetDataSet: Pointer;
{ TADOQuery }
property DataSet: Pointer read GetDataSet;
function InstallRepeatFilter(const TableName, ID, Callsign: String; NotOne, AllLogs: Boolean): Boolean;
procedure Clear;
end;
Интерфейс IDxClusterForm
Интерфейс позволяет осуществлять доступ к данным и компонентам окна «DX-кластер».
IDxClusterForm = interface(ITab)
['{E0BEF533-518B-4E26-A724-6A2B3254ACF9}']
{ TMemo }
function GetTerminal: Pointer;
property Terminal: Pointer read GetTerminal;
{ TIdTelnet }
function GetIdTelnet: Pointer;
property IdTelnet: Pointer read GetIdTelnet;
{ TDBGrid }
function GetDBGrid: Pointer;
property DBGrid: Pointer read GetDBGrid;
{ TClientDataSet }
function GetDataSet: Pointer;
procedure SetDataSet(Value: Pointer);
property DataSet: Pointer read GetDataSet write SetDataSet;
{ TStrings }
function GetMenu: Pointer;
property Menu: Pointer read GetMenu;
{ TStrings }
function GetClusterList: Pointer;
property ClusterList: Pointer read GetClusterList;
function GetClusterItemIndex: Integer;
property ClusterItemIndex: Integer read GetClusterItemIndex;
function GetSpotsStopped: Boolean;
property SpotsStopped: Boolean read GetSpotsStopped;
function GetSendSpotData: String;
property SendSpotData: String read GetSendSpotData;
{ Сообщение другим плагинам о приёме спота. }
procedure SendSpotNotify;
{ Переместить спот в окно "Новое QSO" }
procedure MoveSpot(Grid: Pointer);
{ Показать контекстное меню }
procedure ShowPopupMenu;
procedure ShowHiddedInfo(const Callsign: String; const Distance: Integer);
function GetStatusBarText(const Index: Integer): String;
procedure SetStatusBarText(const AText: String; const Index: Integer);
{ Опции кластера }
function GetSelectedColor1: TColor;
property _SelectedColor1: TColor read GetSelectedColor1;
function GetSelectedColor2: TColor;
property _SelectedColor2: TColor read GetSelectedColor2;
function GetAutoConnectToCluster: Boolean;
property _AutoConnectToCluster: Boolean read GetAutoConnectToCluster;
function GetClusterAutoScroll: Boolean;
property _ClusterAutoScroll: Boolean read GetClusterAutoScroll;
function GetClusterNotCarryComment: Boolean;
property _ClusterNotCarryComment: Boolean read GetClusterNotCarryComment;
function GetClusterMarkCarrying: Boolean;
property _ClusterMarkCarrying: Boolean read GetClusterMarkCarrying;
function GetMaxDistance: Integer;
property _MaxDistance: Integer read GetMaxDistance;
function GetSelectedSpotByDistance: Boolean;
property _SelectedSpotByDistance: Boolean read GetSelectedSpotByDistance;
end;
Terminal | Указатель на поле терминала TMemo. |
IdTelnet | Указатель на компонент TIdTelnet. |
DBGrid | Указатель на таблицу принятых спотов. |
DataSet | Указатель на компонент TClientDataSet. |
Menu | Указатель на объект TStrings – список команд меню. Работа с меню описана для интерфейса IMainForm. |
ClusterList | Указатель на объект TStrings – список доступных кластеров. |
ClusterItemIndex | Индекс выбранного кластера из списка кластеров ClusterList. |
SpotsStopped | True, если приём спотов остановлен. |
SendSpotData | Содержит передаваемую в кластер информацию. |
SendSpotNotify | Вызов этой процедуры сообщает всем плагинам, что принят очередной спот. |
MoveSpot | Процедура перемещает спот из таблицы в окно «Новое QSO». Параметр Grid – это указатель на таблицу принятых спотов. Может быть nil, но в этом случае перемещённый спот не выделиться цветом, если эта опция включена в настройках. |
ShowPopupMenu | Отображает контекстное меню. |
ShowHiddedInfo | Выводит информацию во всплывающем окне, если окно «DX-кластер» скрыто. |
GetStatusBarText | Возвращает текст панели с индексом Index строки состояния. Index не может иметь значение более чем два. |
SetStatusBarText | Задаёт текст панели с индексом Index строки состояния. Index не может иметь значение более чем два. |
_SelectedColor1 | Цвет выделенной строки при переносе спота в окно «Новое QSO». |
_SelectedColor2 | Цвет выделенной строки, если расстояние до DX больше заданного. |
_AutoConnectToCluster | True, если включена опция автоматического подключения к выбранному кластеру. |
_ClusterAutoScroll | True, если включена опция автопрокрутки принятых спотов в таблице. |
_ClusterNotCarryComment | False, если запрещён перенос комментария при переносе спота в окно «Новое QSO». |
_ClusterMarkCarrying | True, если включена опция выделения цветом спота в таблице при переносе его в окно «Новое QSO». |
_MaxDistance | Максимальное расстояние, свыше которого принятый спот следует выделять цветом. |
_SelectedSpotByDistance | True, если в опциях разрешено выделять принятый спот при превышении максимального расстояния. |
Интерфейс ISendSpotForm
Этот интерфейс позволяет осуществлять доступ к окну передачи спота в кластер и к его и компонентам. Имеет два свойства в виде указателей на компоненты TEdit.
ISendSpotForm = interface(IRoexForm)
['{88927E51-1B4E-4D1EADBBFB14}']
function GetFreqField: Pointer;
function GetCommentField: Pointer;
{ TEdit }
property FreqField: Pointer read GetFreqField;
{ TEdit }
property CommentField: Pointer read GetCommentField;
end;
Интерфейс ITransceiver
Интерфейс обеспечивает доступ к системе управления трансивером через CAT или PTT. Управление через CAT возможно в том случае, если установлен соответствующий плагин.
ITransceiver = interface
['{EED75C00-F296-42CE-98E0-B70223D234AE}']
function GetTx: Boolean;
procedure SetTx;
procedure SetRx;
property Tx: Boolean read GetTx;
function GetFreq: Integer;
procedure SetFreq(const Value: Integer);
function GetOnFreqChange: TNotifyEvent;
procedure SetOnFreqChange(Value: TNotifyEvent);
property Freq: Integer read GetFreq write SetFreq;
property OnFreqChange: TNotifyEvent read GetOnFreqChange write SetOnFreqChange;
function GetPTTCW: Boolean;
procedure SetPTTCW(const Value: Boolean);
property PTTCW: Boolean read GetPTTCW write SetPTTCW;
function GetPTTCWPin: Integer;
procedure SetPTTCWPin(const Value: Integer);
property PTTCWPin: Integer read GetPTTCWPin write SetPTTCWPin;
function GetRigNumber: Integer;
procedure SetRigNumber(const Value: Integer);
property RigNumber: Integer read GetRigNumber write SetRigNumber;
end;
Tx | Если True, то трансивер в режиме передачи. |
SetTx | Переводит трансивер на передачу. |
SetRx | Переводит трансивер на приём. |
Freq | Текущая частота. |
OnFreqChange | Событие возникающее при смене частоты. Должна генерироваться CAT – плагином. |
PTTCW | Разрешает или запрещает CW-манипуляцию через один порт совместно с CAT. |
PTTCWPin | Номер ножки порта для передачи CW-манипуляции. |
RigNumber | Номер управляемого через CAT трансивера 1 или 2. |
Интерфейс ICWForm
Интерфейс обеспечивает доступ к окну «CW». Свойство TextInputMemo возвращает указатель на компонент TMemo – поле ввода передаваемого текста. Процедура SendText передаёт текст заданный в параметре Text. Если передача текста завершена то CwDone = True.
ICWForm = interface(IRoexForm)
['{7920EB5E-420C-481B-8DD7-560D53A37A7B}']
function GetCwDone: Boolean;
function GetTextInputMemo: Pointer;
procedure SendText(Text: String);
property CwDone: Boolean read GetCwDone;
{ TMemo }
property TextInputMemo: Pointer read GetTextInputMemo;
end;
Интерфейс ICallBookForm
Интерфейс обеспечивает доступ к окну «База данных позывных» и к его компонентам.
ICallBookForm = interface(ITab)
['{A8ED0729-B165-42AA-A40E-182B718D3ACF}']
function Find(const Callsign: String; out AName, QTH: String): Boolean;
procedure SetResult(const Value: Boolean);
procedure SetAName(const Value: String);
procedure SetQTH(const Value: String);
function GetResult: Boolean;
function GetAName: String;
function GetQTH: String;
function GetCallsign: String;
property Result: Boolean read GetResult write SetResult;
property Name: String read GetAName write SetAName;
property QTH: String read GetQTH write SetQTH;
property Callsign: String read GetCallsign;
end;
Функция Find осуществляет поиск по всем имеющимся колбукам (основной и плагины). Если позывной найден, то функция возвращает True. При этом в параметрах будут возвращены имя и QTH корреспондента. Если вы пишите плагин-колбук, то в теле функции RoexSendNotify должны обрабатывать сообщение SNPN_SEARCHCALLBOOK. При этом свойство Callsign возвращает позывной, который необходимо найти. Если в вашем плагине позывной найден, то свойству Result следует присвоить значение True. При необходимости следует свойствам имя и QTH присвоить соответствующие значения.
Интерфейс IQSLViaForm
Интерфейс обеспечивает доступ к окну «QSL – менеджеры». Пока в интерфейсе всего одно свойство – указатель на компонент TEdit поля ввода информации для поиска.
IQSLViaForm = interface(ITab)
['{402D5BD5-759F-4437-A679-0E260F18B9F2}']
{ TEdit }
function GetCallField: Pointer;
property CallField: Pointer read GetCallField;
end;
Интерфейс IAwardsForm
Интерфейс обеспечивает доступ к форме анализа дипломных программ. Эта форма отображается в виде таблицы в окне «Новое QSO».
IAwardsForm = interface(IRoexForm)
['{E2F7F72D-AB8A-4FB8-9C96-04A49CF97AE8}']
function GetAwardName: String;
procedure SetState(const Value: String);
function GetCallsign: String;
property AwardName: String read GetAwardName;
property Callsign: String read GetCallsign;
procedure Reload;
procedure SetResult(const Value: Boolean);
end;
AwardName | Имя текущего диплома, для которого ведётся анализ позывного. |
Callsign | Анализируемый позывной. |
Reload | Процедура перечитывает условия всех имеющихся дипломных программ. |
Freq | Текущая частота. |
SetResult | Процедура предназначена для принудительной установки результата анализа позывного на текущую дипломную программу. |
Интерфейс IMapsForm
Интерфейс обеспечивает доступ к окну «Карты» и к егопроцедурам и свойствам.
IMapsForm = interface(ITab)
['{659B08E1-3C35-42BEF36C814D}']
procedure ClearCoordinates;
procedure ViewCallsignCoordinates(const Callsign: String);
function GetCallsign: String;
property Callsign: String read GetCallsign;
end;
Процедура ClearCoordinates очищает текущие координаты корреспондента. Процедура ViewCallsignCoordinates отображает координаты корреспондента с позывным Callsign. Свойство Callsign возвращает текущий позывной, координаты которого отображаются в данный момент.
Интерфейс IQSLPrintForm
Интерфейс обеспечивает доступ к окну «Печать QSL – карточек», к его компонентам и процедурам.
IQSLPrintForm = interface(IRoexForm)
['{5DAFFF0B-9BB0-4FD2-BE85-23CDC43F6724}']
function GetDBGrid: Pointer;
property DBGrid: Pointer read GetDBGrid;
function GetDataSet: Pointer;
property DataSet: Pointer read GetDataSet;
procedure SendToeQSL(const AOnlySelected: Boolean);
procedure RefreshData;
procedure RemoveFromQSLSend;
procedure Printed(const Selected: Boolean);
end;
DBGrid | Возвращает указатель на таблицу окна. |
DataSet | Возвращает указатель на TDataSet, содержащий данные. |
SendToeQSL | Процедура отправляет QSO на сервер eQSL. |
RefreshData | Процедура обновляет данные в таблице главного окна приложения. |
RemoveFromQSLSend | Процедура удаляет все QSO, для которых карточки были отправлены или напечатаны. |
Printed | Процедура отображает окно предварительного просмотра/печати. |
Интерфейс IAntennasForm
Интерфейс обеспечивает доступ к окну управления антеннами, к его компонентам, процедурам и свойствам.
IAntennasForm = interface(IRoexForm)
['{CD147B15-B8B1-48EC-AA2CCF34C}']
{ TEdit }
function GetAzimutField: Pointer;
property AzimutField: Pointer read GetAzimutField;
procedure RotationByBearing(const Bearing: Double);
procedure Rotation(const Direction: Byte);
procedure Switch(const Index: Integer);
procedure ClearANTData;
procedure SendANTData(const Mode, Callsign, DXCC, Cont: String; const ID, Dist, Az: Integer);
procedure GetSpots(DataSet: Pointer);
function GetAntIndex: Integer;
property _AntIndex: Integer read GetAntIndex;
function GetDBGrid: Pointer;
property DBGrid: Pointer read GetDBGrid;
{ TClientDataSet }
function GetDataSet: Pointer;
property DataSet: Pointer read GetDataSet;
end;
AzimutField | Указатель на компонент TEdit. |
RotationByBearing | Процедура поворачивает антенну на заданный угол. |
Rotation | Процедура управляет поворотом антенны (влево, вправо, стоп). |
Switch | Процедура переключает антенны (управляет антенным коммутатором). |
ClearANTData | Процедура очищает таблицу принятых спотов. |
SendANTData | Процедура добавляет новый спот в таблицу принятых спотов. |
GetSpots | Процедура заполняет таблицу принятых спотов на основе данных DataSet. |
_AntIndex | Текущий индекс включённой антенны. |
DBGrid | Возвращает указатель на таблицу окна. |
DataSet | Указатель на компонент TClientDataSet. В этом компоненте содержаться данные принятых спотов. |


