Конференция "Corba" » Обработка событий COM-объекта [Delphi, Windows]
 
  • bhm (30.07.09 17:29) [0]
    Добрый день!
    Занимаюсь разработкой торгового бота в торговой системе АЛОР
    www.alor.ru
    Программа и документация на странице http://www.alor.ru/technologies/atcom/
    Текущая задача - Необходимо получить данные из таблиц, желательно считывать целую таблицу и выводить на экран.
    Проблема состоит в том, что не смог разобраться обработкой событий от COM-объектов...
    Жду ответа!
  • Romkin © (31.07.09 11:17) [1]
    И в чем именно трудности? Книжки надо почитать.
    Вообще просто делается импорт библиотеки типов на клиента с "Generate component wrapper", и получается обычный класс с поддержкой событий. Что здесь сложного-то?
  • bhm (31.07.09 17:55) [2]
    Цитирую из "ATEAPI.doc":
    Для работы с библиотекой в среде разработки Delphi (5, 6, 7…) следует выбрать Project  Import Type Library главного меню, а затем из списка доступных библиотек типов выбрать TEClient 1.0 Type LIbrary, убрать отметку из опции Generate Component Wrapper и нажать кнопку Create Unit. Это приведет к созданию файла TEClientLib_TLB.PAS, содержащего интерфейс библиотеки TEClient. После чего необходимо добавить ссылку на этот файл в предложении Uses главного модуля проекта.

    Соответственно я убирал галочку...
  • bhm (31.07.09 19:08) [3]
    Компоненты создал... События обрабатываю... тут-то без проблем... :)
    Дока в заблуждение ввела...
    Вчера вечером начал вручную компоненту создавать на примере.... :)
    Я с COM-технологией в первые столкнулся.
    Какие книги и линки посоветуете?
    Спасибо за своевременную подсказку!
    Будут вопросы непременно обращусь...
  • Romkin © (03.08.09 10:48) [4]
  • bhm (10.08.09 12:20) [5]
    Добрый день уважаемые Мастера!
    Возникает ошибка 'Invalid variant type conversion' при обработке следующего события:

    procedure TForm1.SlotTable1AddRow(Sender: TObject; OpenID, RowID: Integer;
     Fields: OleVariant);
    begin
     Memo1.Lines.Add('SlotTable OpenID:'+IntToStr(OpenID)+' Event onAddRow...');
    end;

    Подскажите пожалуйста в чем может быть проблема и в каком направлении её искать?
  • bhm (13.08.09 19:25) [6]
    Проблема остается открытой...
    Скажите хоть какой-либо предполагаемый вариант решения проблемы, а дальше сам уж разберусь....
    Вот текст компоненты:
    // *********************************************************************//
    // The Class CoSlotTable provides a Create and CreateRemote method to          
    // create instances of the default interface ISlotTable exposed by              
    // the CoClass SlotTable. The functions are intended to be used by            
    // clients wishing to automate the CoClass objects exposed by the        
    // server of this typelibrary.                                            
    // *********************************************************************//
     CoSlotTable = class
       class function Create: ISlotTable;
       class function CreateRemote(const MachineName: string): ISlotTable;
     end;

     TSlotTablePing = procedure(Sender: TObject; OpenID: Integer; TableID: Integer) of object;
     TSlotTableOpened = procedure(Sender: TObject; OpenID: Integer) of object;
     TSlotTableClosed = procedure(Sender: TObject; OpenID: Integer) of object;
     TSlotTablePropertyChanged = procedure(Sender: TObject; OpenID: Integer;
                                                            var PropertyName: OleVariant;
                                                            NewValue: OleVariant) of object;
     TSlotTableFormat = procedure(Sender: TObject; OpenID: Integer; Names: OleVariant;
                                                   Formats: OleVariant) of object;
     TSlotTableClear = procedure(Sender: TObject; OpenID: Integer) of object;
     TSlotTableAddRow = procedure(Sender: TObject; OpenID: Integer; RowID: Integer; Fields: OleVariant) of object;
     TSlotTableUpdateRow = procedure(Sender: TObject; OpenID: Integer; RowID: Integer;
                                                      Fields: OleVariant) of object;
     TSlotTableDeleteRow = procedure(Sender: TObject; OpenID: Integer; RowID: Integer) of object;
     TSlotTableReplBegin = procedure(Sender: TObject; OpenID: Integer) of object;
     TSlotTableReplEnd = procedure(Sender: TObject; OpenID: Integer) of object;
     TSlotTableError = procedure(Sender: TObject; OpenID: Integer; Code: Integer;
                                                  var Description: OleVariant) of object;
  • bhm (13.08.09 19:26) [7]
    // *********************************************************************//
    // OLE Server Proxy class declaration
    // Server Object    : TSlotTable
    // Help String      : SlotTable Class
    // Default Interface: ISlotTable
    // Def. Intf. DISP? : No
    // Event   Interface: _ISlotTableEvents
    // TypeFlags        : (2) CanCreate
    // *********************************************************************//
    {$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
     TSlotTableProperties= class;
    {$ENDIF}
     TSlotTable = class(TOleServer)
     private
       FOnPing: TSlotTablePing;
       FOnOpened: TSlotTableOpened;
       FOnClosed: TSlotTableClosed;
       FOnPropertyChanged: TSlotTablePropertyChanged;
       FOnFormat: TSlotTableFormat;
       FOnClear: TSlotTableClear;
       FOnAddRow: TSlotTableAddRow;
       FOnUpdateRow: TSlotTableUpdateRow;
       FOnDeleteRow: TSlotTableDeleteRow;
       FOnReplBegin: TSlotTableReplBegin;
       FOnReplEnd: TSlotTableReplEnd;
       FOnError: TSlotTableError;
       FIntf:        ISlotTable;
    {$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
       FProps:       TSlotTableProperties;
       function      GetServerProperties: TSlotTableProperties;
    {$ENDIF}
       function      GetDefaultInterface: ISlotTable;
     protected
       procedure InitServerData; override;
       procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
       function  Get_ID: Integer;
       function  Get_Code: Integer;
       function  Get_Name: WideString;
       function  Get_Params: WideString;
       function  Get_AllFieldNames: WideString;
       function  Get_FieldNames: WideString;
       procedure Set_FieldNames(const pVal: WideString);
       function  Get_UseSfx: WordBool;
       procedure Set_UseSfx(pVal: WordBool);
       function  Get_FreeReplication: WordBool;
       procedure Set_FreeReplication(pVal: WordBool);
     public
       constructor Create(AOwner: TComponent); override;
       destructor  Destroy; override;
       procedure Connect; override;
       procedure ConnectTo(svrIntf: ISlotTable);
       procedure Disconnect; override;
       function  Open(SlotID: Integer; const Name: WideString; const Params: WideString): Integer;
       function  Close(OpenID: Integer): SCODE;
       function  Activate(SlotID: Integer; const Name: WideString; const Params: WideString): Integer;
       function  Deactivate(SlotID: Integer; const Name: WideString; const Params: WideString): Integer;
       function  OpenOrderbook(SlotID: Integer; const SecBoard: WideString; const SecCode: WideString): Integer;
       property  DefaultInterface: ISlotTable read GetDefaultInterface;
       property ID: Integer read Get_ID;
       property Code: Integer read Get_Code;
       property Name: WideString read Get_Name;
       property Params: WideString read Get_Params;
       property AllFieldNames: WideString read Get_AllFieldNames;
       property FieldNames: WideString read Get_FieldNames write Set_FieldNames;
       property UseSfx: WordBool read Get_UseSfx write Set_UseSfx;
       property FreeReplication: WordBool read Get_FreeReplication write Set_FreeReplication;
     published
    {$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
       property Server: TSlotTableProperties read GetServerProperties;
    {$ENDIF}
       property OnPing: TSlotTablePing read FOnPing write FOnPing;
       property OnOpened: TSlotTableOpened read FOnOpened write FOnOpened;
       property OnClosed: TSlotTableClosed read FOnClosed write FOnClosed;
       property OnPropertyChanged: TSlotTablePropertyChanged read FOnPropertyChanged write FOnPropertyChanged;
       property OnFormat: TSlotTableFormat read FOnFormat write FOnFormat;
       property OnClear: TSlotTableClear read FOnClear write FOnClear;
       property OnAddRow: TSlotTableAddRow read FOnAddRow write FOnAddRow;
       property OnUpdateRow: TSlotTableUpdateRow read FOnUpdateRow write FOnUpdateRow;
       property OnDeleteRow: TSlotTableDeleteRow read FOnDeleteRow write FOnDeleteRow;
       property OnReplBegin: TSlotTableReplBegin read FOnReplBegin write FOnReplBegin;
       property OnReplEnd: TSlotTableReplEnd read FOnReplEnd write FOnReplEnd;
       property OnError: TSlotTableError read FOnError write FOnError;
     end;
  • bhm (13.08.09 19:27) [8]
    {$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
    // *********************************************************************//
    // OLE Server Properties Proxy Class
    // Server Object    : TSlotTable
    // (This object is used by the IDE's Property Inspector to allow editing
    //  of the properties of this server)
    // *********************************************************************//
    TSlotTableProperties = class(TPersistent)
     private
       FServer:    TSlotTable;
       function    GetDefaultInterface: ISlotTable;
       constructor Create(AServer: TSlotTable);
     protected
       function  Get_ID: Integer;
       function  Get_Code: Integer;
       function  Get_Name: WideString;
       function  Get_Params: WideString;
       function  Get_AllFieldNames: WideString;
       function  Get_FieldNames: WideString;
       procedure Set_FieldNames(const pVal: WideString);
       function  Get_UseSfx: WordBool;
       procedure Set_UseSfx(pVal: WordBool);
       function  Get_FreeReplication: WordBool;
       procedure Set_FreeReplication(pVal: WordBool);
     public
       property DefaultInterface: ISlotTable read GetDefaultInterface;
     published
       property FieldNames: WideString read Get_FieldNames write Set_FieldNames;
       property UseSfx: WordBool read Get_UseSfx write Set_UseSfx;
       property FreeReplication: WordBool read Get_FreeReplication write Set_FreeReplication;
     end;
    {$ENDIF}
  • bhm (13.08.09 19:38) [9]
    При успешном выполнении метода Open генерируется цепочка событий: Opened, Format, Clear, ReplBegin, [AddRow, … ,] ReplEnd. В случае ошибки генерируется событие Error.

    все события генерируются кроме Format и AddRow, тк эти события в качестве передаваемых параметров содержат переменные типа oleVariant.
  • bhm (17.08.09 10:52) [10]
    Проблему решил....
    Всё оказалось гораздо проще...
    Поставил Delphi2005 - всё заработало, а разработку вёл в среде Delphi6...
  • имя (18.08.09 21:00) [11]
    Удалено модератором
 
Конференция "Corba" » Обработка событий COM-объекта [Delphi, Windows]
Есть новые Нет новых   [118648   +59][b:0][p:0.001]