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

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

Как скрыть заголовой в панели задач у "ничейной" формы


Страницы:   1 2

NeyroSpace ©   (2004-07-23 14:10:00) 

Форма создана динамически и ей назначены:
Form1.Parent := nil;
Form1.ParentWindow := 0;
В панели задач появился ее заголовок, как его убрать?


Ega23   (2004-07-23 17:20:00) [1]

Интересно почему?

А вот это не знаю. Не обращал внимания как-то...


NeyroSpace   (2004-07-23 17:13:00) [2]

И еще один вопрос:

   Dll_Form.WindowState := wsMinimized;
   DLL_Form.Hide;

Этот код приводит к тому, что в диспетчере задач память занимаемая приложением уменьшается с 2000кб до 400кб, при этом заголовок окна иногда на мгновение проскакивает над ПУСКом. А вот этот код не приводит к уменьшению занимаемой памяти:

   DLL_Form.Hide;
   Dll_Form.WindowState := wsMinimized;

Интересно почему?


NeyroSpace   (2004-07-23 17:02:00) [3]

читат как SetForegroundWindow(DLL_Form.Handle);


NeyroSpace   (2004-07-23 16:53:00) [4]

Хотя и сработало, я не врубаюсь что произошло!
Еще раз мой код, как он выполняется:

ЕХЕ:
DLL_Form := TForm(Init(Form1, Application));
//(т.е. DLL_Form это просто указатель в ехе, для того чтобы из ехе можно было контролировать форму DLL)

DLL:
function Init(MainExeForm: TComponent;
...
MainApplication:TApplication):TComponent;
Form := TForm.CreateParented(MainExeForm.handle);
//изначально родитель у длл_формы скрытая форма из ехе
//это чтобы при создании она не вылезла на экран и в панель
srtlist.LoadFromFile('Form.txt');
StringToComponent(Form, srtlist.Text);

application.ShowMainForm := false;
MainApplication.ShowMainForm := false;
Application.Handle := MainApplication.Handle;
result := Form;//возвращаем указатель на созданную форму в ЕХЕ
end

EXE
DLL_Form.Parent := nil;
DLL_Form.ParentWindow := 0;
//иначе ее не засветить на экране до тех пор пока не отобразится скрытый родитель Form1

ну а дальше в обработчике систрея в ЕХЕ я
OnClick...
begin
...
DLL_Form.WindowState := wsNormal;
DLL_Form.Show;
SetForegroundWindow(Vis_Form.Handle);
DLL_Form.BringToFront;
//появился заголовок ЕХЕшника на панели
ShowWindow(Application.Handle, SW_HIDE);//убиваем его
...
end


Ega23   (2004-07-23 16:35:00) [5]

Но тогда у меня следующий вопрос, при таком переназначении указатель на объект Application DLL не будет потерян? Я этот объект не создавал, значит и не мне его разрушать, но если я переназначил его хендел, то перед концом работы с DLL нужно его на место возвращать?

[17]-й пост был цитатой из
"Валерий Васильевич Фаронов
Delphi: заметки программиста. Часть 4"

Ему в общем доверяю.

Ну а что тебе мешает сохранить этот хендл?


NeyroSpace   (2004-07-23 16:25:00) [6]

Хех теперь вылазит заголовок главного приложения! Забавно!
Ладно подавил его
ShowWindow(Application.Handle, SW_HIDE);
в ехешнике.
Но тогда у меня следующий вопрос, при таком переназначении указатель на объект Application DLL не будет потерян? Я этот объект не создавал, значит и не мне его разрушать, но если я переназначил его хендел, то перед концом работы с DLL нужно его на место возвращать?


s999   (2004-07-23 16:23:00) [7]

To Ega23:
 Да отвлекись ты от Dll. Если у любого окна ты обнулишь Parent, то оно появится на TaskBar-е, это и в ситуации только одного Application. Проблемы задвоения кнопок на TB у него нет, у него проблема одной кнопки.


Ega23   (2004-07-23 16:16:00) [8]

В DLL можно не только выполнять вычисления, но и показывать формы, например диалоги. Для показа диалога в DLL следует открыть проект реализации DLL,  создать модуль с формой и поместить на нее необходимые элементы управления вместе с обработчиками событий. Затем следует создать экспортируемый метод, который выполнит диалог:

function ExecDialog(AppHandle:THandle; var PictName:pchar):boolean; stdcall;    export;
var  
 FDialog:TForm1;  
begin  
 FDialog:=nil;  
 PictName:=nil;  
 Result:=False;  
 Application.Handle:=AppHandle; {Two icons are arisen at taskbar without this operator. Warning while dynamic loading!}  
 try  
   FDialog:=TForm1.Create(Application);  
   if FDialog.ShowModal=mrOK then begin  
     FillMemory(@C[0],1000,0);  
     if length(FDialog.Edit1.Text)>0 then  
     StrPCopy(C,FDialog.Edit1.Text);  
     PictName:=@C[0];  
     Result:=True;  
   end;  
   FDialog.Release;  
   FDialog:=nil;  
   {!!! Case dynamic loading, one has to use method Free instead of Release!}  
 except  
   On E:exception do begin  
     ShowMessage(E.Message);  
     if Assigned(FDialog) then FDialog.Release;  
   end;  
 end;  
end;  

Данный код вызова диалога следует применять только при статической загрузке DLL. При выполнении диалога в DLL нужно учитывать, что формы в DLL не могут создаваться вместе с запуском DLL, как это возможно в приложении при установке опции Auto-Create Form в разделе Project/Options/Forms. Поэтому форму необходимо создавать динамически, вызывая ее конструктор Create из кода. Соответственно перед выходом из процедуры, вызывающей форму, необходимо вызвать ее деструктор (в нашем примере — FDialog.Release). Необходимо учитывать, что в DLL создается объект типа TApplication. Поскольку и само приложение имеет данный объект, то (если не принимать никаких мер) на экране в панели приложений появятся две пиктограммы: одна — для приложения, другая — для DLL, выполняющей диалог (рис. 2).


Ega23   (2004-07-23 16:14:00) [9]

Application.Handle здесь особо не причем.

Ну да? А от какого application ты создаёшь форму внутри DLL?


s999   (2004-07-23 16:12:00) [10]

Application.Handle здесь особо не причем. Причина здесь одна, правило MS - если окно не дочернее, то оно появляется на TaskBar-е.  
Думаю, что можно поиграться с мессагами типа TB_XXX, но не уверен.


Ega23   (2004-07-23 15:53:00) [11]

А ты внутри DLL набери Application :о)


NeyroSpace   (2004-07-23 15:49:00) [12]

Что имеется ввиду под экземпляр Application DLL?
У меня в DLL не создается Application. Или я чего-то не понимаю...


Ega23   (2004-07-23 15:45:00) [13]

что это за объект?

Это не объект, это юнит.

Идея следующая: тебе надо в качестве параметра в DLL передать Application.Handle твоей программы. Потом внутри DLL-ки экземпляру Application.Handle для DLL приравнять Application.Handle твоей программы.
Короче, блин, как-то сложно в двух словах. В общем у тебя 2 экземпляра Application - один твоего приложения, второй - твоей DLL. Приравняй один к другому.


NeyroSpace   (2004-07-23 15:40:00) [14]

хм не совсем...
uPreviewCard.PrintCard(Dev,LPSTR,H);
что это за объект?
А сама идея в чем состоит? (В виде ф-ций я потом сам реализую)


Ega23   (2004-07-23 15:05:00) [15]

О! Я так и думал. Тебе Application DLL надо приравнять к Application программы.

Смотри:

function PrintCard(Dev:Integer;LPSTR:PChar;H:HWND):Integer; StdCall;
begin
Result:=uPreviewCard.PrintCard(Dev,LPSTR,H);
end;

exports
PrintCard      name    'PrintCard';

Это хидер DLL-ки.
Теперь сама функция uPreviewCard.PrintCard(Dev,LPSTR,H):

function PrintCard(Dev:Integer;LPSTR:PChar;AppHandle:THandle):Integer;
begin
Result:=1;
Application.Handle:=AppHandle;

.....
end;

А теперь вызов из самой программы:

i:=PrintCard(1,PChar(CardInfo),MainForm.Handle)

Понимаешь?


NeyroSpace   (2004-07-23 14:56:00) [16]

В том то и дело что главная форма скрыта. Эту форму я создаю динамически в DLL. Чтобы в момент создания она не промелькнула в панели задач, делаю:
Form := TForm.CreateParented(ParentForm.handle);

т.к. главная форма скрыта она тоже создается скрытно, но потом  при выборе пункта меню в систрее ее нужно показать. Чтобы показать, переназначаю ей родителя.
Form.Parent := nil;
Form.ParentWindow := 0;

Она появляется, но и в панеле задач тоже. Как теперь убрать только ее заголовок из панели задач? (на экране ес-но оставить :-)


Ega23   (2004-07-23 14:51:00) [17]

Или даже так. У меня, по крайней мере, так отлично создаётся форма без дополнительных заголовков в TaskBare

Application.CreateForm(TForm,Form);


Ega23   (2004-07-23 14:47:00) [18]

Создается так:
Form := TForm.CreateParented(ParentForm.handle);

Попробуй так:

Form := TForm.Create(Application.handle);


REA   (2004-07-23 14:47:00) [19]

Куда убрать? Совсем уничтожить или спрятать на время?
Уничтожить Form.Free, спрятать Form.Hide;


NeyroSpace   (2004-07-23 14:40:00) [20]

>Ega23 ©   (23.07.04 14:22) [4]
Компонент создается из текста DFM формата. Код не мой, он с простор инета, поэтому гениален :-). В яндексе статья есть.

Создается так:
Form := TForm.CreateParented(ParentForm.handle);
srtlist.LoadFromFile('Form.txt');
StringToComponent(Form, srtlist.Text);
Form.Visible := true;

- "У тебя потрясающая память!"
- "Сейчас не об этом!"
Ирония судьбы(с)

Как убрать-то ее с панельки задач? Я уже много сообщений перепробовал...


Страницы:   1 2

Наверх

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