Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с MDIChildCount, Создаем MDIChild в Plug-In... 
:(
    Опции темы
remax
  Дата 3.2.2006, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



В библиотеке JEDI есть замечательная возможность легко создавать Plug-In и также легко подключать их к основному приложению. Все бы хорошо, но при попытке создать и использовать MDIChild получаем странный глюк - MDIChildCount показывает не общее количество всех дочерних окон, а только число окон данного Plug-In. Т.е. если в приложении мы запустим несколько окон, например: 5 из Plug-In-1, 3 из Plug-In-2 и 10 разнотипных MDIChild из основного приложения, то при вызове MDIChildCount получим не 18, а 3, 5 или 10 в зависимости из окна какого типа мы вызываем эту функцию. Что интересно, так это то, что окошки ведут себя прилично и подчиняются оконным командам по выравниванию и отображаются в меню WINDOWS1, как и положено. Может кто сталкивался с такой проблемой?

Код

procedure TuilMDIPluginSample.uilMDIPluginSampleCommands0Execute(Sender: TObject);
var FMDIChild : TFEditXY;
begin
  FMDIChild := TFEditXY.Create(application.MainForm); //- так я создаю MDIChild в Plug-In
end;

   // А это другие, "не работающие" варианты
  //  FMDIChild := TFEditXY.Create(nil);
  //  FMDIChild := TFEditXY.Create(application);
  //  FMDIChild := TFEditXY.Create(HostApplication);
  //  FMDIChild := TFEditXY.Create(HostApplication.MainForm);





--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
remax
  Дата 5.2.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Проблема возникает из-за задваивания Application и Screen. Но, если Application корректно корректируется при создании/уничтожении дочерней формы средствами JEDI, то со Screen ничего не предусмотрено. Не хочется исправлять стандартные JEDI бибиотеки (я использую версию 3: JVCL300CompleteJCL195-Build1848). Как еще можно с этим справиться? smile


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
remax
  Дата 26.8.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Если это кому-нибудь еще интересно, то

Проблема- не работает mdiChildCount
Причина – конфликт объектов TScreen основной программы и Plug-In.
Способ устранения – внести исправления в JvPluginManager.pas и JvPlugin.pas:
JvPlugin.pas
Код

TJvPlugIn = class(TDataModule)
  Private
…
FHostScreen: TScreen; {--------Добавить!!!! --------}
…
public
...
function Initialize2(Manager: TComponent; HostApplication: TApplication; HostScreen:TScreen; FileName: string): Boolean; virtual; stdcall; {--------Скорректировать!!!}
...
    property HostScreen: TScreen read FHostScreen;  ; {--------Добавить!!!! --------}
………..

function TJvPlugIn.Initialize(Manager: TComponent; HostApplication: TApplication; HostScreen:TScreen;FileName: string): Boolean; {--------Скорректировать!!!! --------}
begin
  Result := True;
  FHostApplication := HostApplication;
  FHostScreen:=HostScreen; {--------Добавить!!!! --------}
  FFileName := FileName;
  FManager := Manager;
  TriggerInitializeEvent(Result);
end;



JvPluginManager.pas
Код

В методе function TJvPluginManager.AddCustomPlugin(PlugIn: TJvPlugIn): Boolean; 

Заменить    Result := PlugIn.Initialize(Self, Application, 'CustomPlugin');
 На        Result := PlugIn.Initialize(Self, Application, Screen,'CustomPlugin');


И собственно, в Вашем модуле Plug-In должно быть примерно так
Код

unit MDIPluginU;

interface

uses
   Windows,
   Messages,
   SysUtils,
   Classes,
   Dialogs,
   Forms,
   JvPlugin,
   Ufirst;


type

  TuilMDIPluginSample = class( TJvPlugin )
    procedure uilMDIPluginSampleInitialize(Sender: TObject; var AllowLoad: Boolean);
    procedure uilMDIPluginSampleDestroy(Sender: TObject);
    procedure uilMDIPluginSampleCommands0Execute(Sender: TObject);
  private
    FMDIChild : Tffirst; 
  protected
    OldApplication : TApplication;
    OldScreen:TScreen; //!!!!!!
  end;

var
   uilMDIPluginSample: TJvPlugin;


function RegisterPlugin : TuilMDIPluginSample; stdcall;

implementation

{$R *.DFM}


function RegisterPlugin : TuilMDIPluginSample;

begin
  Result := TuilMDIPluginSample.Create(nil);
end;


procedure TuilMDIPluginSample.uilMDIPluginSampleInitialize(Sender: TObject;
  var AllowLoad: Boolean);
begin
   OldScreen:=Screen;  //!!!!!!
   Screen:=HostScreen;//!!!!!!
   OldApplication := Application;
   Application := HostApplication;
end;

procedure TuilMDIPluginSample.uilMDIPluginSampleDestroy(Sender: TObject);
begin
   Application := OldApplication;
   Screen:=OldScreen; //!!!!!!
end;

procedure TuilMDIPluginSample.uilMDIPluginSampleCommands0Execute(Sender: TObject);
begin
  FMDIChild:=Tffirst.Create(application.MainForm); 
end;

end.




 smile  smile  smile 

P.S. Самое интересное, что полностью аналогичная ситуация с Application, но это обычно все учитывают. А вот Screen - чем то провинился...



--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
rOOxus
Дата 10.5.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 95
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



2 remax
а вы не пробовали в контексте импользования JVCL решить проблему
  • с табуляцией на дочерней форме
  • с ошибкой 'cannot assign a TFont to a TFont' которая возникает при любых операциях со свойством Font у дочерней формы
решение первой проблемы я вроде нашел - она кроеться в редактировании Control.pas это подробно описанио тут


PM MAIL   Вверх
remax
Дата 10.5.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Да нет, как-то не доводилось решать такую проблему. А ссылка, предложенная Вами, интересная. Может удасться решить проблему с HINT в плагинах. А то, текущее работающее решение - вывод подсказки в нижней строке главной формы не всем удобно....


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.