Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизВызов функции в основной форме из BPL Найти похожие ветки
← →
Виктор © (2004-11-10 13:03) [0]Доброго всем дня Ув. Мастера.
Есть основная формы которая создает форму из BPL.
С прямой звязью MainForm->BPLForm нет проблем. Не получается осуществить обратную связь MainForm<-BPLForm. Отдаю хандл
MainForm-ы в BPLForm, а даже найти адрес функции которую хочу
вызвать.
← →
Юрий Зотов © (2004-11-10 13:24) [1]1. Можно использовать Application.MainForm.
2. Можно найти форму по ее хэндлу (FindControl).
3. Можно передавать не хэндл, а ссылку на саму форму.
← →
Виктор © (2004-11-10 13:57) [2]Не хотелось бы использовать 1-2 вариант поскольку
прийдется прилинковывать модуль vcl к bpl что протеворечит технологии.
А насчет 3 не уверен что по ссылке не будет того же самого: если можно по подробнее?
← →
Юрий Зотов © (2004-11-10 14:11) [3]> Виктор © (10.11.04 13:57) [2]
> прийдется прилинковывать модуль vcl к bpl
Это как?
Скажем, написан пакет, в котором использован модуль Forms. Вы считаете, что код модуля Forms войдет в этот пакет?
VCL в Delphi 7 состоит почти из 30 пакетов. Уверен, что большинство из них используют модуль SysUtils. Предположим, таких пакетов 20. Значит ли это, что бинарный код модуля SysUtils продублирован в бинарном коде VCL 20 раз?
← →
Виктор © (2004-11-10 14:23) [4]Технология заключается в том что я описываю в другой библиотеке
новый класс который является потомком класса TForm и некоторые методы которые я часто использую в других формах.
Далее создаю библ. в которой создаваемая форма явл. класса описанного в основной библиотеке. Таким образом я в дополнительных BPL избавляюсь от лишних модулей.
Этот метод позволяет мне исп. библ. как Plugin`s.
Надеюсь понятно зачем мне это надо. Но наладить связь MainForm<-BPLForm без использования COM, у меня вызвали затруднения если можно, то поясните как мне вызвать процедуру
по ссылке на главную форму.
← →
Юрий Зотов © (2004-11-10 15:20) [5]Насколько я понял, проблема в том, что в BPL класс главной формы неизвестен?
Способ 1 - сделать его известным. То есть, написать его в каком-то еще BPL (доступном и Вашему BPL, и EXEшнику) и снабдить всеми нужными методами, а главную форму наследовать от него, а не от TForm. Тогда в BPL приводим Application.MainForm к известному классу (предку главной формы) и спокойно вызываем любой метод этого класса.
Способ 2 - использовать интерфейсы (не обязательно COM). Похоже на способ 1, только известным в BPL должен быть уже интерфейс, а не предок главной формы. Запрашиваем у главной формы ссылку на интерфейс и вызываем его методы.
Способ 3 - искать метод по его строковому имени.
Главная форма:
published // или в безымянном разделе после объявления класса
procedure MyMethod(параметры);
end;
BPL:
type
TMyMethod = procedure(параметры) of object;
TBPLForm = class(...)
...
procedure CallMyMethod;
end;
procedure TBPLForm.CallMyMethod;
var
M: TMethod;
begin
M.Data := Application.MainForm;
M.Code := Application.MainForm.MethodAddress("MyMethod");
if M.Code <> nil then
TMyMethod(M)(параметры)
end;
← →
Виктор © (2004-11-11 17:30) [6]Я прошу прощенья за назойливость, но уже нету сил.
Перепробовал кажется всё:
По 1) никакого Application в BPL нет. А по наследуемой форме на MainForm компилятор ругается что такого тоже нет.
Попробовал TChildFormClass(FindClass("TMainForm")); но TMainForm не находит.
Главну форму описал как наследок от TChildForm такой же в BPL.
FindControl тоже не находит или же не то ищет, я уже запутался как правильно.
По 2 - отпадает поскольку чтобы реализовать интерфейсы в BPL нужны модули которые я вынес в общую BPL, кажется так.
По 3 хотелось бы применить, но тоже самое не могу сдвинутся с места пока уменя нет Application в BPL. Что я не так делаю?
← →
Виктор © (2004-11-12 13:10) [7]Юрий Зотов © (10.11.04 15:20) [5]
Огромное спасибо за помощь я сделал как Вы мне и посоветовали, немного преобразовал код и добился результата:
////////////// Передаю в модуль хэндл формы
FChildForm.GetCaption(MainForm.Handle);
/////////// В модуле ////////////
var M: TMethod;
begin
M.Data := FindControl(HWNDMain);
M.Code := FindControl(HWNDMain).MethodAddress("FFShowConnect");
TMyMethod(M);
Я же ошибался когда передавал
FChildForm.GetCaption(Application.Handle);
и получал нарушение доступа по адресу... .
До скорых встреч!
← →
Юрий Зотов © (2004-11-12 14:10) [8]> Виктор © (11.11.04 17:30) [6]
> никакого Application в BPL нет.
Добавьте Forms в Uses - и сразу появится.
:о)
← →
Виктор © (2004-11-21 16:39) [9]Если Вы про эту строчку
uses Forms;
То она была с самого начала. А вообще к сказанному нечего добавить кроме того, что хочу ещё раз Вас поблагодорить за содействие.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c