Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Вызов функции в основной форме из 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 2.808 c
8-1094305884
CyBeRBuGziLLa
2004-09-04 17:51
2004.12.05
ДАЙТЕ ПРОЦЕДУРУ СГЛАЖИВАНИЯ, ПЛИЗ


1-1100850456
Frozzen
2004-11-19 10:47
2004.12.05
Объявление массива


4-1098353983
Lingo
2004-10-21 14:19
2004.12.05
AddPrinterDriver


14-1100750611
alienserg
2004-11-18 07:03
2004.12.05
помогите потестировать мессенджер...


14-1100694450
syte_ser78
2004-11-17 15:27
2004.12.05
помогите с созданием интерфейса.