Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Kolan ©   (2007-07-08 14:46:00) 

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


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

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


Kolan   (2007-07-08 21:52:00) [1]

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

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


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


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

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

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


engine   (2007-07-08 19:26:00) [3]

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

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


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

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

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


Kolan   (2007-07-08 19:14:00) [5]

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


Kolan   (2007-07-08 19:14:00) [6]

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

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


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

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

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

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


Kolan   (2007-07-08 18:30:00) [8]

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

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

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

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


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

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


Kolan   (2007-07-08 18:15:00) [10]


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

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


Kolan   (2007-07-08 18:14:00) [11]

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

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


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

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

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


Kolan   (2007-07-08 17:42:00) [13]

> Зачем в 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:26:00) [14]

> 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 16:55:00) [15]

> И код 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 15:48:00) [16]

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


Kolan   (2007-07-08 15:45:00) [17]

Гл. форма:

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


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


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

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

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


Kolan   (2007-07-08 15:40:00) [19]

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

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


Kolan   (2007-07-08 15:40:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо