 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Hunter
Зарегистрирован: 29.08.2006 Сообщения: 9 Откуда: Belarus
|
Добавлено: Пн 11 Сен 2006 22:49 Заголовок сообщения: Как правильно обработать событие |
|
|
Снова у меня два вопроса, над которыми сижу и думаю, помогите, пожалуйста, на них ответить!
1) Хочу обработать событие нажатия мыши (например, вывести координаты, при нажатии левой кнопки мыши).
Создать Объект IIngeoApplicationSink?? Но как мне можно написать к нему обработчик(например, на MouseDown).
Писал по-разному, но постоянно возникают ошибки, или просто не работает...
А может что-то я не правильно думаю??
unit MifAddon;
interface
uses Windows, ActiveX, SysUtils, M2Addon, M2AddonD, M2AddonImp, Ingeo_TLB;
type
TMyAddon = class(TM2CustomAddon)
private
FIngeoApplication: IIngeoApplication;
// FIngeoMapEditorsSink: IIngeoMapEditorsSink;{???}
public
procedure Initialize(const aManager: IM2AddonManager); override;
procedure Uninitialize; override;
property IngeoApplication: IIngeoApplication read FIngeoApplication;
end;
var gMyAddon: TMyAddon = nil;
implementation
procedure TMyAddon.Initialize(const aManager: IM2AddonManager);
begin
inherited Initialize(aManager);
FIngeoApplication := aManager as IIngeoApplication;
end;
procedure TMyAddon.Uninitialize;
begin
FIngeoApplication := nil;
inherited Uninitialize;
end;
initialization
gMyAddon := TMyAddon.Create;
finalization
gMyAddon.Free;
end.
2) Можно ли добавить команды панель инструментов ГИС в виде SpeedButton'ов используя VBScript.
 |
|
Вернуться к началу |
|
 |
rvm
Зарегистрирован: 03.07.2008 Сообщения: 9
|
Добавлено: Пн 27 Окт 2008 17:40 Заголовок сообщения: |
|
|
Я обрабатывал события одним из двух способов:
1. Писал модуль на VBScript, отлавливал там событие и передавал управление вместе с найденными координами в модуль, созданный на основе ActiveX и написанный на Делфи. Все работало. Все это описано в соответсвующей документации.
2.Библиотека AddOnLib, которая есть на сайте ИнГео, позволяет в редакторе карты (модуль Edit) отлавливать событие и передават при необходимости в подключенную Dll-ку.
Успехов.
Владимир. |
|
Вернуться к началу |
|
 |
Расуль

Зарегистрирован: 05.09.2008 Сообщения: 5 Откуда: Уфа ЦСИ. Интегро
|
Добавлено: Ср 29 Окт 2008 11:10 Заголовок сообщения: |
|
|
Вот примерчик
Код: |
uses Windows, ActiveX, SysUtils, M2Addon, M2AddonD, M2AddonImp, Ingeo_TLB;
const
// Генерируйте GUID всегда заново, дабы избежать ситуаций когда ваш аддон
//пересечется с другим
CLSID_First: TGUID = '{FD578124-AC3B-4323-942B-03E31415F132}';
TYouAddon = class(TM2CustomAddon)
private
FApplication: IIngeoApplication;
FMacroCommands: array of TTemplateData;
FAddonDataLoaded: boolean ;
protected
procedure InitMacroList;
function FindTemplate(const aCommand: Integer): TMapObjectLinkTemplate;
public
constructor Create;
destructor Destroy; override;
procedure Initialize(const AManager: IM2AddOnManager); override;
procedure Uninitialize; override;
function GetBitmap(const aStm: IStream; aBitmap: Longint): Boolean; override;
function GetMacroList: IM2MacroAttrsList; override;
procedure ExecuteMacro(aCmd: Longint; const aParams: TM2String); override;
procedure Notify(AnAdvise: TM2Notify; const AParams: IM2ParamsList); override;
end;
var
gAddon: TYouAddon = nil;
DefaultMacros: array [0..0] of TM2MacroAttrs = (
( Command: cmEditTempletes;
Name: 'EditMapObjectFileLinkEditTemplate';
Hint: 'ммм ...';
MenuPath: 'Сервис\Мой Модуль\ммм '; // Месторасположение вызова модуля в главном меню
MenuShortCut: 0;
ToolbarName: 'Документы';
ToolbarGroup: '';
Bitmap: 0
)
);
constructor TYouAddon.Create;
begin
// Текст мой первый модуль будет отображаться в списке аддонов
inherited Create(CLSID_First, 'FirstAddon', 'Мой первый модуль',
advMapObjectSelected or advMapObjectDeselected or advMapObjectModified or advMapObjectDeleted
or advMapObjectNotifications
or advProjectClosing or advProjectClosing);
FAddonDataLoaded := False;
end;
destructor TYouAddon.Destroy;
begin
FManager.Free;
FManager := nil;
FApplication:= nil;
inherited Destroy;
end;
procedure TYouAddon.InitMacroList;
begin
//Задаем количество кнопок на панели
SetLength(FMacroCommands, 1);
end;
function FindApplicationWindow(aWND:Hwnd; aFoundWND: Pointer):Bool;stdcall;
const AppClassName='TApplication';
var
aClassName: array [0..15] of Char;
aProcessID: dword;
aLength: Integer;
begin
GetWindowThreadProcessId(aWND, @aProcessID);
if aProcessID= GetCurrentProcessId then begin
aLength := GetClassName(aWND, aFoundWND, sizeof(aFoundWND));
if (aLength = Length(AppClassName)) and SameText(AppClassName, aClassName) then begin
HWND(aFoundWND^):= aWND;
Result := False;
Exit;
end;
end;
Result := True;
end;
function FindApplicationHandle: HWnd;
begin
if EnumWindows(@FindApplicationWindow, Integer(@Result)) then
Result := 0;
end;
procedure TYouAddon.ExecuteMacro(aCmd: Integer; const aParams: TM2String);
begin
// Здесь обрабатывается вызов конкретной кнопки на меню, к примеру вызов вашей формы
// Естейственно нужно будет ввести переменную типа TForm
// А еще лучше TNonModalForm. Поищите на сайте, библиотеки для работы с Инего
// Вызвается примерно так
// MyForm := TNonModalForm.CreateWithParent(Handle)
// Можно конечно создать и один раз форму в Create, а переменную типа TNonModalForm
// агрегировать в класс TYouAddon, ну соответственно не забыв ее уничтожить в Destroy.
// И тогда в обработке команд вызвать только MyForm.Show
// Еще одна Фишка, для получения Handle нужно воспользоваться кодом поиска окна, и выхватывания его Handle-а
// Код Данной функций чуть выше FindApplicationHandle :)
case aCmd of
1:;// MyForm.Show
2:;
end;
end;
function TYouAddon.GetMacroList: IM2MacroAttrsList;
var
aList: TM2MacroAttrsList;
aTemplate: TMapObjectLinkTemplate;
i: Integer;
begin
aList.OleObject := inherited GetMacroList;
// Это нужно для того что бы задать рисунок на панели интсрументов для вашей кнопки, то бишь открываете
// рисунок и подаете его Hanlde
// HotKey понятно для чего нужно, горячие клавиши :)
DefaultMacros[0].Bitmap := Bitmap.Handle;
DefaultMacros[0].MenuShortCut := HotKey;
aList.Add(DefaultMacros[i]);
Result := aList.OleObject;
end;
procedure TYouAddon.Initialize(const AManager: IM2AddOnManager);
var
aDocument: IXmlDocument;
begin
inherited Initialize(AManager);
InitMacroList;
FAddonDataLoaded := True;
end;
// Пример обработки событий Инего
// Когда в Ингео возникает какое либо события
// Она дергает данную процедуру
//функция BeforeEvent не обязательная, необходима для совместимости версий
procedure TYouAddon.Notify(AnAdvise: TM2Notify; const AParams: IM2ParamsList);
function BeforeEvent(aParams: TM2ParamsList): Boolean;
begin
if not aParams.Contains(kndIsBefore) then
Result := False
else begin
Result := XStrToBool(aParams.Items(kndIsBefore), False);
end;
end;
var
Params: TM2ParamsList;
begin
Params.OleObject := AParams;
case AnAdvise of
advMapObjectSelected: begin
if not BeforeEvent(Params) then begin
// Тут вешаете свой обработчик события
// Для начала можете поставить сюда showmessage и изучить как все работает
//А так можно и обработчик на своей форме сделать. Напрмер будет
// вызываться MyForm.Select //
// type
// TMyForm = class(TNonModalForm)
// Label: TLAbel;
// public
// Select()
// end;
// Select()
// begin
// LAbel.Caption := 'Выделен обьект'
//
// end;
end;
end;
advMapObjectDeselected: begin
// Тут вешаете свой обработчик события
end;
advMapObjectModified: begin
if not BeforeEvent(Params) then begin
// Тут вешаете свой обработчик события
end;
end;
advMapObjectDeleted: begin
// Тут вешаете свой обработчик события
end;
advProjectClosing: begin
// Тут вешаете свой обработчик события
end;
advGisUninitializing: begin
// Тут вешаете свой обработчик события
end;
end;
end;
function TYouAddon.GetBitmap(const aStm: IStream; aBitmap: Integer): Boolean;
begin
Result := aBitmap <> 0;
if Result then begin
Result := False;
try
SaveBitmapToIStream(aBitmap, aStm);
Result := true;
except
end;
end;
end;
procedure TYouAddon.Uninitialize;
begin
Application.Handle := 0;
inherited;
end;
initialization
gAddon := TYouAddon.Create;
finalization
gAddon.Free;
gAddon:=nil;
end.
|
_________________ Расуль |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|