  | 
				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.
 
 | 	 
  _________________ Расуль | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |