Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как правильно обработать событие

 
Начать новую тему   Ответить на тему    Список форумов 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.
Shocked Question Question Question
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
rvm



Зарегистрирован: 03.07.2008
Сообщения: 9

СообщениеДобавлено: Пн 27 Окт 2008 17:40    Заголовок сообщения: Ответить с цитатой

Я обрабатывал события одним из двух способов:
1. Писал модуль на VBScript, отлавливал там событие и передавал управление вместе с найденными координами в модуль, созданный на основе ActiveX и написанный на Делфи. Все работало. Все это описано в соответсвующей документации.
2.Библиотека AddOnLib, которая есть на сайте ИнГео, позволяет в редакторе карты (модуль Edit) отлавливать событие и передават при необходимости в подключенную Dll-ку.

Успехов.
Владимир.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Расуль



Зарегистрирован: 05.09.2008
Сообщения: 5
Откуда: Уфа ЦСИ. Интегро

СообщениеДобавлено: Ср 29 Окт 2008 11:10    Заголовок сообщения: Ответить с цитатой

Вот примерчик Smile

Код:


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.

_________________
Расуль
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB