Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1100756936
gn
2004-11-18 08:48
2004.12.05
Билл Гейтс: пароль мертв


4-1098472040
Seamcat
2004-10-22 23:07
2004.12.05
Окна


6-1096199404
Ezhik
2004-09-26 15:50
2004.12.05
Передача переменной по сети


1-1100878506
PC
2004-11-19 18:35
2004.12.05
"Полный контроль"


3-1099827234
naum
2004-11-07 14:33
2004.12.05
Пробежка по всей базе MS Access (mdb)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский