![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов функции в основной форме из BPL [D7, Win95/98, Win2k]
Виктор © (2004-11-10 13:03:00)Доброго всем дня Ув. Мастера.
Есть основная формы которая создает форму из BPL.
С прямой звязью MainForm->BPLForm нет проблем. Не получается осуществить обратную связь MainForm<-BPLForm. Отдаю хандл
MainForm-ы в BPLForm, а даже найти адрес функции которую хочу
вызвать.
Виктор (2004-11-21 16:39:00) [1]Если Вы про эту строчку
uses Forms;
То она была с самого начала. А вообще к сказанному нечего добавить кроме того, что хочу ещё раз Вас поблагодорить за содействие.
Юрий Зотов (2004-11-12 14:10:00) [2]> Виктор © (11.11.04 17:30) [6]
> никакого Application в BPL нет.
Добавьте Forms в Uses - и сразу появится.
:о)
Виктор (2004-11-12 13:10:00) [3]Юрий Зотов © (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-11 17:30:00) [4]Я прошу прощенья за назойливость, но уже нету сил.
Перепробовал кажется всё:
По 1) никакого Application в BPL нет. А по наследуемой форме на MainForm компилятор ругается что такого тоже нет.
Попробовал TChildFormClass(FindClass('TMainForm')); но TMainForm не находит.
Главну форму описал как наследок от TChildForm такой же в BPL.
FindControl тоже не находит или же не то ищет, я уже запутался как правильно.
По 2 - отпадает поскольку чтобы реализовать интерфейсы в BPL нужны модули которые я вынес в общую BPL, кажется так.
По 3 хотелось бы применить, но тоже самое не могу сдвинутся с места пока уменя нет Application в BPL. Что я не так делаю?
Юрий Зотов (2004-11-10 15:20:00) [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-10 14:23:00) [6]Технология заключается в том что я описываю в другой библиотеке
новый класс который является потомком класса TForm и некоторые методы которые я часто использую в других формах.
Далее создаю библ. в которой создаваемая форма явл. класса описанного в основной библиотеке. Таким образом я в дополнительных BPL избавляюсь от лишних модулей.
Этот метод позволяет мне исп. библ. как Plugin`s.
Надеюсь понятно зачем мне это надо. Но наладить связь MainForm<-BPLForm без использования COM, у меня вызвали затруднения если можно, то поясните как мне вызвать процедуру
по ссылке на главную форму.
Юрий Зотов (2004-11-10 14:11:00) [7]> Виктор © (10.11.04 13:57) [2]
> прийдется прилинковывать модуль vcl к bpl
Это как?
Скажем, написан пакет, в котором использован модуль Forms. Вы считаете, что код модуля Forms войдет в этот пакет?
VCL в Delphi 7 состоит почти из 30 пакетов. Уверен, что большинство из них используют модуль SysUtils. Предположим, таких пакетов 20. Значит ли это, что бинарный код модуля SysUtils продублирован в бинарном коде VCL 20 раз?
Виктор (2004-11-10 13:57:00) [8]Не хотелось бы использовать 1-2 вариант поскольку
прийдется прилинковывать модуль vcl к bpl что протеворечит технологии.
А насчет 3 не уверен что по ссылке не будет того же самого: если можно по подробнее?
Юрий Зотов (2004-11-10 13:24:00) [9]1. Можно использовать Application.MainForm.
2. Можно найти форму по ее хэндлу (FindControl).
3. Можно передавать не хэндл, а ссылку на саму форму.