Форум: "Потрепаться";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
ВнизActiveX в компонент Найти похожие ветки
← →
J_S (2002-07-22 11:52) [0]Есть следующий вопросик.
Имеецца active-x - он, по идее визуальный - форма - в ней поле для подачи запроса, кнопка. По нажатию кнопки результаты по запросу выводяцца в мемо...
Мне же нужно это дело преобразовать к дельфевому компоненту так что бы он был невизульный - для строки запроса отдельное свойство, а для получения ответа по этому запросу отдельный метод...
Подскажите, если кто сталкивался.
← →
Kapusto (2002-07-22 12:44) [1]Не совсем понятна постановка задачи...
Необходимо создать свою обертку для данного компонента, или что? Доступен ли исходный текст ActiveX"a? От ответов на эти вопросы зависят и
дальнейшие действия...
← →
Romkin (2002-07-22 12:48) [2]Это dll или ocx?
вообще-то обычно достаточно сделать import type library
← →
J_S (2002-07-22 13:56) [3]это *.ocx.
а сделать надо именно обертку..:)
еще кстати вопрос - но это скорее техника - этот актив-х вроде инсталлируецца, как сообщает дельфи, но не ActiveX, ни на Samples, и вообще ни на одной из вкладок его нет...
← →
Kapusto (2002-07-22 16:56) [4]После Import ActiveX Control по умолчанию в Imports должен лежать файл-обертка _TLB, который и представляет собой компонент. Посмотри в самом конце файла должен быть вызов RegisterComponents, который и должен инсталлить компонент...
А насчет обертки - можно действительно import type library и смотреть, какие методы есть у компонента... Если есть проперти, или методы, эквивалентные едиту, куда вводится запрос и нажатию кнопки, то тебе повезло... Создаешь класс этого компонента в своей обертке и работаешь с ним...
← →
J_S (2002-07-22 17:25) [5]файл смотрела - процедуры RegisterComponents не нашла - хотя она должна там быть..это-то действительно странно.
в чем фишка?
← →
Romkin (2002-07-22 18:05) [6]Component -> Import ActiveX Control -> (Найти в списке либо в файле) -> Install
Создастся компонент, у которого Visible есть
или Import Type Library with Generate Component wrapper (Install - пойдет на палитру)
← →
J_S (2002-07-22 18:33) [7]Ребята, все это правильно...
делаю как вы и говорите.. да тока не выходит ничего - RegisterComponents у него по отсутствует... Причем любым из двух способов - результат одинаковый - компилиться без проблем, а вот устанавливаться не хотит..
Вернее, что устанавливаться не хотит он тоже не сообщает.. его просто не видно, ну а не видно естессно за отсутсвием Register.
подскажите чего делать?..
уже пробовала и в другой пакет, и на другую вкладку поместить - не получаецца...:(
← →
J_S (2002-07-23 10:12) [8]Пробовала поставить его (ActiveX) на MFC. Поставился...
Вопрос - почему же этот конкретный OCX дельфи воспринимать не хочет?.
← →
Romkin (2002-07-23 10:17) [9]Если нужен невизуальный компонент, то зачем мучиться?
Должен получиться модуль Delphi, в нем компонент. Register можно и вручную написать, только зачем?
Просто создавать в run-time и пользоваться
← →
J_S (2002-07-23 10:45) [10]Register я вручную пробовала прописывать - тока все равно когда пакет формируешь оно все перетираецца.
я посмотрела описание которое дельфя создает - различие состоит еще в том что она к тому же не гинирит описание класса - тока интерфейсы
← →
Romkin (2002-07-23 11:26) [11]а Generate component wrapper?
ВЫшли мне этот ocx, посмотрю, как это вообще модет быть....
← →
J_S (2002-07-23 11:44) [12]Generate component wrapper - он тоже дает такой же результат как и Import ActiveX...
то есть описание создаецца - но оно какое-то урезанное - как я говорила отсутсвует Register - это раз, и сам класс - это два.
присутствуют тока компоненты...
interface
uses ActiveX, Classes, Graphics, OleCtrls, OleServer, StdVCL, Variants,
Windows;
// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
axAmdProWebMajorVersion = 2;
axAmdProWebMinorVersion = 0;
LIBID_axAmdProWeb: TGUID = "{BE32B240-16C0-4D49-BAF5-7FB7EBB57AD4}";
IID__ctlAmdProWeb: TGUID = "{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}";
DIID___ctlAmdProWeb: TGUID = "{91D6D5B5-F289-4464-9A86-FA176E50C744}";
CLASS_ctlAmdProWeb: TGUID = "{12DBEE5C-9A88-4143-9FD8-A01854AE0F24}";
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
_ctlAmdProWeb = interface;
_ctlAmdProWebDisp = dispinterface;
__ctlAmdProWeb = dispinterface;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
ctlAmdProWeb = _ctlAmdProWeb;
// *********************************************************************//
// Interface: _ctlAmdProWeb
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {9E22D3E7-0B99-42D9-A1AC-7CB838297B63}
// *********************************************************************//
_ctlAmdProWeb = interface(IDispatch)
["{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}"]
procedure GhostMethod__ctlAmdProWeb_28_0; safecall;
procedure GhostMethod__ctlAmdProWeb_32_1; safecall;
...................
дальнейшее описание интерфейсов
..................
procedure GhostMethod__ctlAmdProWeb_1952_481; safecall;
function Disconnect: OleVariant; safecall;
function Reconnect: OleVariant; safecall;
function Get_GetConnectStatus: WordBool; safecall;
function MyQuery(const sQuery: WideString): WideString; safecall;
property GetConnectStatus: WordBool read Get_GetConnectStatus;
end;
// *********************************************************************//
// DispIntf: _ctlAmdProWebDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {9E22D3E7-0B99-42D9-A1AC-7CB838297B63}
// *********************************************************************//
_ctlAmdProWebDisp = dispinterface
["{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}"]
procedure GhostMethod__ctlAmdProWeb_28_0; dispid 1610743808;
procedure GhostMethod__ctlAmdProWeb_32_1; dispid 1610743809;
.................................
procedure GhostMethod__ctlAmdProWeb_1952_481; dispid 1610744289;
function Disconnect: OleVariant; dispid 1610809346;
function Reconnect: OleVariant; dispid 1610809347;
property GetConnectStatus: WordBool readonly dispid 1745027072;
function MyQuery(const sQuery: WideString): WideString; dispid 1610809349;
end;
// *********************************************************************//
// DispIntf: __ctlAmdProWeb
// Flags: (4240) Hidden NonExtensible Dispatchable
// GUID: {91D6D5B5-F289-4464-9A86-FA176E50C744}
// *********************************************************************//
__ctlAmdProWeb = dispinterface
["{91D6D5B5-F289-4464-9A86-FA176E50C744}"]
end;
implementation
uses ComObj;
end.
← →
Kapusto (2002-07-23 12:29) [13]Ну и все замечательно...
делаешь свой компонент (хотя я сделал бы просто свой класс), в Create которого вызываешь получение интерфейса _ctlAmdProWeb,
и гоняешь его function MyQuery(const sQuery: WideString): WideString;
(естественно, в uses указываешь данную TLB)
2Romkin: я не уверен, что сие получится, ибо у интерфейса стоит флаг hidden?...
← →
Romkin (2002-07-23 13:37) [14]Не делает, потому что интерфейсы не начинаются с "I"
У меня через _ctlAmdProWebDisp сделалось, его hidden не сделаешь
А так, конечно, непонятно, как этим пользоваться.
И непонятно, зачем еще явный dispinterface, у основного-то Dual
← →
Romkin (2002-07-23 13:43) [15]Упс! Ошибка, wrapper все равно, как интерфейс называется, а не делает компенент, имхо, потому, что Hidden
← →
J_S (2002-07-23 16:28) [16]Можно немного подробнее? (про Create которого вызывает получение интерфейса _ctlAmdProWeb) и вообще что сделать в исходнике (VB) чтоб таких приколов не было?
← →
Kapusto (2002-07-23 17:45) [17]TMyClass = class(TObject)
private
intf: _ctlAmdProWeb;
public
constructor Create; override;
function Query(q: string): string;
end;
TMyClass.Create
begin
intf := CreateComObject(CLASS_ctlAmdProWeb) as _ctlAmdProWeb;
end;
TMyClass.Query(q: string): string;
begin
Result := intf.MyQuery(q);
end
PS: а насчет Басика - не в курсах...
2Romkin: проверь, вроде бы должно прокатить...
← →
Romkin (2002-07-23 18:08) [18]я вроде письмо послал...
uses axAmdProWeb_TLB, ComObj;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Amd: _ctlAmdProWebDisp;
ifi: BOOL;
begin
amd := CreateComObject(CLASS_ctlAmdProWeb) as _ctlAmdProWebDisp;
ifi := amd.GetConnectStatus;
if ifi then
ShowMessage("Connected")
else
ShowMessage("Not Connected");
end;
← →
J_S (2002-07-23 18:58) [19]спасибки:))
сегодня обязательно попробую...
← →
J_S (2002-07-24 15:29) [20]No such interface supported
вот такая вот штука возникает при вызове метода
function TMyClass.GetResponse: String;
begin
Result := Self.FObj.MyQuery(Self.GetQuery);
end;
Self.GetQuery - возвращает строку запроса..
и вообще такая ошибка возникает при любой попытке использования функций _ctlAmdProWeb.
подскажите как бороться
← →
J_S (2002-07-24 15:53) [21]а теперь
EOleException
"OLE error 800A01A9"
← →
Romkin (2002-07-24 15:58) [22]Используй не _ctlAmdProWeb, а _ctlAmdProWebDisp, у меня код (выше) проходит без ошибки, если Disp
← →
J_S (2002-07-24 16:13) [23]да спасибо большое:) - а в чем различие?
← →
Romkin (2002-07-24 16:37) [24]Это Dispinterface, и обращение происходит не через vtable, а через вызовы invoke
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c