Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизЕсли в пакете есть форма, то гл. форма не показывается на 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;
загружаются пакеты. Если надо подробнее при веду всю цепочку…
← →
Юрий Зотов © (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]
>
> А без загрузки пакет — все ок?
В смысле если его вообще не загружать?
-Да, удаляю его из папки — все отлично…
← →
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;
Сначала показывается форма из пакета и все. Как только её закрышаешь появляется главная и на таск баре тоже появляется.
Варианты лечения? У меня есть, но он связан с конкретной программой…
← →
Юрий Зотов © (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).
Ну ясно, я так и предпологал. Сделаю так. Гл. форма просто как-бы будет говорить пакету: «Уже можно паказывать формы», а пакет пусть хочет показывает, хочет нет — его проблеммы…
← →
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;
Зато каждому «пакету» не нужно знать о проблемах создания…
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.047 c