-
Всем привет!
Сделал:
1. Создал проект (File->New->ActiveX Library)
2. Добавил в проект объект COM 'SimpleCOM' (File->New->COM Object)
3. В Type Library Editor добавил новый метод ShowString в интерфейсах этого объекта. Сам метод состоит только из ShowMessage. Все компилируется в dll и вызывается из внешнего приложения (exe). НО!
Никак не получается вызвать форму находящуюся в dll.
Пробовал:
function TSimpleCOM.ShowString(const str: WideString ): HResult;
begin
Form2.Create(nil);
Form2.Show;
end;
В отладчике пропускает эти команды.
Передать Application для вызова Form2.Create(Application) не знаю как, т.к. при определении параметров метода ShowString в Type Library Editor не знаю какой тип указать у данного параметра.
В Интернете найти пока удалось немногое.
Пожалуйста подскажите КАК ВЫЗВАТЬ ФОРМУ находящуюся в dll?
-
Прежде чем браться за COM и ActiveX надо сначала разобраться как минимум с самыми элементарными основами.
-
> Form2.Create(nil);
Это и в обычном приложении работать не будет, не то что в AX
-
> Это и в обычном приложении работать не будет, не то что
> в AX
Прошу прощения за некорректный код. На самом деле текст выглядит так:
function TEditHierarchy.ViewEditHierarchy: HResult;
begin
MainGraphicForm:=TMainGraphicForm.Create(nil);
Form1:=TForm1.Create(nil);
Result:=Form1.ShowModal;
end;
Формы вызываются, но на панели задач выделяются отдельно. Мне же нужно чтобы все формы выходили в рамках одного приложения.
Проблема заключается в том, что я не знаю как через метод интерфейса ViewEditHierarchy передать ссылку на приложение-клиент Application (чтобы указать его вместо nil), ведь в Type Library Editor не могу найти подходящего типа для параметра.
Буду благодарен за совет.
-
> ведь в Type Library Editor не могу найти подходящего типа
> для параметра
Integer
подходит.
-
> я не знаю как через метод интерфейса ViewEditHierarchy передать
> ссылку на приложение-клиент Application
Какой нафих "Application" в приложении-клиенте, написанном на, к примеру, WinForth ?
-
> Integer подходит.
При компиляции пишет: Incompatible types 'TComponent' and 'Integer'
А TComponent в комбобоксе выбора типа параметра Type Library Editor просто нет :(
-
> TComponent в комбобоксе выбора типа параметра Type Library
> Editor просто нет
Откуда ж он там возьмется ?
COM-технология, коей ты решил воспользоваться, как раз и создана для обеспечения возможности взаимодействия модулей, созданных в различных средах программирования/разработки.
-
> Какой нафих "Application" в приложении-клиенте, написанном
> на, к примеру, WinForth ?
Как же иначе связывать форму из сервера dll с приложением, чтобы все это выглядело как одно приложение и чтобы форма не "болталась" отдельно?
-
> Как же иначе связывать форму из сервера dll с приложением,
> чтобы все это выглядело как одно приложение и чтобы форма
> не "болталась" отдельно?
Просто поставь ей borderStyle = bsDialog, bsToolWindow или bsSizeToolWindow. Полностью нормального поведения от формы все равно не добьешься. Можно правда то же самое и в CreateParams настроить, но эт лишняя возня.
-
> При компиляции пишет: Incompatible types 'TComponent' and
> 'Integer'
При компиляции какого кода? Надо ж типы приводить в нужных местах.
А если интерфейс не наследник
IDispatch
, то допустим тип
Pointer
. Опять таки, надо приводить типы в нужных местах.
-
> helloeverybody © (29.01.08 17:56) [8]
> чтобы форма не "болталась" отдельно
Отдельно "болтаются", в первую очередь, окна верхнего уровня.
Окно твоей формы как раз таковым и является.
Сделай его дочерним по отношению к окну вызывающего приложения.
см. TWinControl.CreateParented
-
>см. TWinControl.CreateParented
Сам пробовал? Я как-то пробовал, когда плагин делал для атмеловской студии, такая фигня получается - мама, не горюй. Особо правда не вникал финансово не располагало, на ресурсном диалоге быстрей было сделать:)) Поделись опытом.