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

Вниз

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

 
NeyroSpace ©   (2004-07-23 14:10) [0]

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


 
Ega23 ©   (2004-07-23 14:12) [1]

Форма создана динамически

Как? Просто есть несколько способов, какой именно у тебя?


 
NeyroSpace ©   (2004-07-23 14:16) [2]

procedure StringToComponent(Component: TComponent; Value: string);
var
 StrStream:TStringStream;
 ms: TMemoryStream;
begin
 StrStream := TStringStream.Create(Value);
 try
   ms := TMemoryStream.Create;
   try
     ObjectTextToBinary(StrStream, ms);
     ms.position := 0;
     ms.ReadComponent(Component);
   finally
     ms.Free;
   end;
 finally
   StrStream.Free;
 end;
end;


 
Iconka ©   (2004-07-23 14:19) [3]


> NeyroSpace ©   (23.07.04 14:16) [2]


Что значит это код? Где создается форма??


 
Ega23 ©   (2004-07-23 14:22) [4]

NeyroSpace ©   (23.07.04 14:16) [2]

Интересное решение!  :о)
Вопросы такие: Когда ты вызываешь данную процедуру, какие параметры ты ей передаёшь?


 
NeyroSpace ©   (2004-07-23 14:40) [5]

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

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

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

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


 
REA ©   (2004-07-23 14:47) [6]

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


 
Ega23 ©   (2004-07-23 14:47) [7]

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

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

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


 
Ega23 ©   (2004-07-23 14:51) [8]

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

Application.CreateForm(TForm,Form);


 
NeyroSpace ©   (2004-07-23 14:56) [9]

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

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

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


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

О! Я так и думал. Тебе 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 15:40) [11]

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


 
Ega23 ©   (2004-07-23 15:45) [12]

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

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

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


 
NeyroSpace ©   (2004-07-23 15:49) [13]

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


 
Ega23 ©   (2004-07-23 15:53) [14]

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


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

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


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

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

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


 
Ega23 ©   (2004-07-23 16:16) [17]

В 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).


 
s999   (2004-07-23 16:23) [18]

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


 
NeyroSpace ©   (2004-07-23 16:25) [19]

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


 
Ega23 ©   (2004-07-23 16:35) [20]

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

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

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

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


 
NeyroSpace ©   (2004-07-23 16:53) [21]

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

ЕХЕ:
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


 
NeyroSpace ©   (2004-07-23 17:02) [22]

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


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

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

   Dll_Form.WindowState := wsMinimized;
   DLL_Form.Hide;

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

   DLL_Form.Hide;
   Dll_Form.WindowState := wsMinimized;

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


 
Ega23 ©   (2004-07-23 17:20) [24]

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

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



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

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

Наверх




Память: 0.53 MB
Время: 0.023 c
14-1090726590
Gero
2004-07-25 07:36
2004.08.08
Вопрос по HTML: реалистичная тень


3-1089630354
Artem123
2004-07-12 15:05
2004.08.08
Разъясните еще раз про DBGrid (рисунки, Canvas и т.д.)


14-1090261194
Sphinx
2004-07-19 22:19
2004.08.08
Правильная установка


1-1090847248
Protoss
2004-07-26 17:07
2004.08.08
Извините, еще вопросик - а как сохранить элементы ListView1


3-1089902393
KETT
2004-07-15 18:39
2004.08.08
Как суммировать значения полей двух таблиц получить третию ?