-
Добрый день!
Занимаюсь разработкой торгового бота в торговой системе АЛОР
www.alor.ru
Программа и документация на странице
http://www.alor.ru/technologies/atcom/Текущая задача - Необходимо получить данные из таблиц, желательно считывать целую таблицу и выводить на экран.
Проблема состоит в том, что не смог разобраться обработкой событий от COM-объектов...
Жду ответа!
-
И в чем именно трудности? Книжки надо почитать.
Вообще просто делается импорт библиотеки типов на клиента с "Generate component wrapper", и получается обычный класс с поддержкой событий. Что здесь сложного-то?
-
Цитирую из "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 главного модуля проекта.
Соответственно я убирал галочку...
-
Компоненты создал... События обрабатываю... тут-то без проблем... :)
Дока в заблуждение ввела...
Вчера вечером начал вручную компоненту создавать на примере.... :)
Я с COM-технологией в первые столкнулся.
Какие книги и линки посоветуете?
Спасибо за своевременную подсказку!
Будут вопросы непременно обращусь...
-
-
Добрый день уважаемые Мастера!
Возникает ошибка '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;
Подскажите пожалуйста в чем может быть проблема и в каком направлении её искать?
-
Проблема остается открытой...
Скажите хоть какой-либо предполагаемый вариант решения проблемы, а дальше сам уж разберусь....
Вот текст компоненты:
// *********************************************************************//
// 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;
-
// *********************************************************************//
// 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;
-
{$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}
-
При успешном выполнении метода Open генерируется цепочка событий: Opened, Format, Clear, ReplBegin, [AddRow, … ,] ReplEnd. В случае ошибки генерируется событие Error.
все события генерируются кроме Format и AddRow, тк эти события в качестве передаваемых параметров содержат переменные типа oleVariant.
-
Проблему решил....
Всё оказалось гораздо проще...
Поставил Delphi2005 - всё заработало, а разработку вёл в среде Delphi6...
-
Удалено модератором