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

Вниз

Если в пакете есть форма, то гл. форма не показывается на TaskBar   Найти похожие ветки 

 
Kolan ©   (2007-07-08 14:46) [0]

Здравствуйте,
 Есть форма(пусть будет главная). Она динамически(LoadPackage) загружает пакеты(*.bpl). Среди пакетов есть пакет с формой и таким кодом:
initialization
 Form1 := TForm1.Create(Application);
 Form1.Show;


Так вот если этот пакет загружается, то гл. форма не отображается на ТаскБаре Windows. Если её свернуть, развернуть — то она появляется(прям как D2006 при установленом D2007).

Вопросы:
 1. Почему так происходит?
 2. Как исправить?


 
Юрий Зотов ©   (2007-07-08 15:31) [1]

Попробуйте владельцем формы из пакета сделать НЕ Application, а, например, nil, или Application.MainForm.


 
Kolan ©   (2007-07-08 15:37) [2]

initialization
 Form1 := TForm1.Create(nil);
 Form1.Show;
finlization
 Form1.Free;

Никакого эффекта.

initialization
 Form1 := TForm1.Create(Application.MainForm);
 Form1.Show;

Никакого эффекта + круто вешает все при выхоже из приложения.


 
Kolan ©   (2007-07-08 15:40) [3]

Если сделать так:


 
Kolan ©   (2007-07-08 15:40) [4]

Если сделать так:
{initialization
 Form1 := TForm1.Create(Application);
 Form1.Show;  }

То все нормально появляется.


 
Юрий Зотов ©   (2007-07-08 15:43) [5]

> Kolan ©   (08.07.07 15:40) [4]

Откуда (из какого места кода) вызывается LoadPackage?


 
Kolan ©   (2007-07-08 15:45) [6]

Гл. форма:

procedure TCustomColleagueMainForm.FormCreate(Sender: TObject);
begin
 ReportMemoryLeaksOnShutdown := True;
 LoadColleaguesLoader;
 MenuLoader := TMenuInsertColleague.Create(MainMenu1);
 Application.ProcessMessages;
end;


В LoadColleaguesLoader; загружаются пакеты. Если надо подробнее при веду всю цепочку&#133


 
Юрий Зотов ©   (2007-07-08 15:48) [7]

И код DPR дайте глянуть


 
Kolan ©   (2007-07-08 16:55) [8]

> И код DPR дайте глянуть


Гл. форма:
program KPluginMainForm;

uses
 Forms,
 KPluginMainFormUnit in "KPluginMainFormUnit.pas" {CustomColleagueMainForm},
 KColleaguesInitializator in "KColleaguesInitializator.pas",
 KMainMenuColleague in "KMainMenuColleague.pas";

{$R *.res}

begin
 Application.Initialize;
 
 Application.CreateForm(TCustomColleagueMainForm, CustomColleagueMainForm);

 Application.Run;

end.


Пакет с формой:

package KTestColleagueSender;

{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$RUNONLY}
{$IMPLICITBUILD OFF}

requires
 rtl,
 KMediator,
 vcl,
 KFrameworkCommands;

contains
 KTestColleagueSenderForm in "KTestColleagueSenderForm.pas" {Form1};

end.


ЗЫ
 Извените что долго, в клиенте страница не обновлялась оказывается :(


 
Юрий Зотов ©   (2007-07-08 17:26) [9]

> Kolan ©   (08.07.07 16:55) [8]

1. Зачем в DPR вот эти 2 строчки:

uses
 ...
KColleaguesInitializator in "KColleaguesInitializator.pas",
KMainMenuColleague in "KMainMenuColleague.pas";

Попробуйте их убрать.

2. Перекрывались ли в главной форме конструктор, CreateParams, CreateWnd и WndProc. Если да - давайте код.


 
Kolan ©   (2007-07-08 17:42) [10]

> Зачем в DPR вот эти 2 строчки:

Компилятор видимо добавил. Я не ковырял DPR.

Попробуйте их убрать.

Убрал — тоже самое, нет в таск баре. Я их наззад верну, зачем то их же добалили.


> Перекрывались ли в главной форме конструктор, CreateParams,
> CreateWnd и WndProc. Если да — давайте код.

Нет, нет. :

TCustomColleagueMainForm = class(TForm)
   BitBtn1: TBitBtn;
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   asdsads: TMenuItem;
   BitBtn2: TBitBtn;
   BitBtn3: TBitBtn;
   BitBtn4: TBitBtn;
   BitBtn5: TBitBtn;
   XPManifest1: TXPManifest;
   procedure BitBtn6Click(Sender: TObject);
   procedure BitBtn5Click(Sender: TObject);
   procedure BitBtn4Click(Sender: TObject);
   procedure BitBtn3Click(Sender: TObject);
   procedure BitBtn2Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   MenuLoader: TMenuInsertColleague;
   FEdit: TEdit;
   procedure MyEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

 end;


 
Юрий Зотов ©   (2007-07-08 17:55) [11]

> Kolan ©   (08.07.07 17:42) [10]

А без загрузки пакет - все ок?


 
Kolan ©   (2007-07-08 18:14) [12]

> [11] Юрий Зотов ©   (08.07.07 17:55)
> > Kolan ©   (08.07.07 17:42) [10]
>
> А без загрузки пакет — все ок?

В смысле если его вообще не загружать?
-Да, удаляю его из папки — все отлично&#133


 
Kolan ©   (2007-07-08 18:15) [13]


> —Да, удаляю его из папки — все отлично…

Кладу назад, опять не показывается :(.


 
Юрий Зотов ©   (2007-07-08 18:17) [14]

Пробуем дальше. Уберите в пакете строчку Form1.Show. Если все станет ОК, то причина, видимо, в том, что эта форма показывается раньше главной.


 
Kolan ©   (2007-07-08 18:30) [15]

> Уберите в пакете строчку Form1.Show.

Да — нормально.

А с Form1.ShowModal; Сначала показывается форма из пакета и все. Как только её закрышаешь появляется главная и на таск баре тоже появляется.

Варианты лечения? У меня есть, но он связан с конкретной программой&#133


 
Юрий Зотов ©   (2007-07-08 19:05) [16]

> Kolan ©   (08.07.07 18:30) [15]

> Варианты лечения?

Вытекают из причины. Form1.Show (или ShowModal, если нужен модальный показ) надо вызывать не при загрузке пакета, а уже ПОСЛЕ того, как на экране появится главная форма. То есть, из какого-то метода ГЛАВНОЙ формы (например, из ее обработчика OnShow).


 
Kolan ©   (2007-07-08 19:14) [17]

> То есть, из какого-то метода ГЛАВНОЙ формы (например, из
> ее обработчика OnShow).

Ну ясно, я так и предпологал. Сделаю так. Гл. форма просто как-бы будет говорить пакету: «Уже можно паказывать формы», а пакет пусть хочет показывает, хочет нет — его проблеммы&#133


 
Kolan ©   (2007-07-08 19:14) [18]

Благодарю за помощь. :)


 
Юрий Зотов ©   (2007-07-08 19:19) [19]

> Kolan ©   (08.07.07 19:14) [17]

Можно и так. Это зависит от логики организации взамодействия программы и плагина. Один вариант - плагин предоставляет необходимые ресурсы, а управляет ими программа. Другой вариант - программа только грузит плагин, а далее он выполняет свою задачу самостоятельно.


 
engine ©   (2007-07-08 19:26) [20]

> [19] Юрий Зотов ©   (08.07.07 19:19)
> Другой вариант - программа только грузит плагин, а далее
> он выполняет свою задачу самостоятельно.

Тогда в его случае, пакеты грузить не в обработчике OnCreate, а в OnShow например


 
Kolan ©   (2007-07-08 21:40) [21]

> Юрий Зотов ©   (08.07.07 19:19)

Ясно — буду думать.


 
Kolan ©   (2007-07-08 21:52) [22]

Сделал самым простым способом. Думаю он не плох:

procedure TCustomColleagueMainForm.FormShow(Sender: TObject);
begin
 if FIsCreation then
 begin
   LoadColleaguesLoader;
   MenuLoader := TMenuInsertColleague.Create(MainMenu1);
   FIsCreation := False;
 end;
end;


Зато каждому «пакету» не нужно знать о проблемах создания&#133



Страницы: 1 вся ветка

Текущий архив: 2007.08.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
2-1184119709
Biggelow
2007-07-11 06:08
2007.08.05
RC4


15-1183659935
Rouse_
2007-07-05 22:25
2007.08.05
WNetEnumCachedPasswords


2-1183471462
Слава-17
2007-07-03 18:04
2007.08.05
Запись и чтение строк в FileStream


15-1183813273
Тень отца Гамлта
2007-07-07 17:01
2007.08.05
Медленно удаляются файлы


15-1184102234
Суслик
2007-07-11 01:17
2007.08.05
VirtualPC