Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.034 c
3-1089797728
CAMCOH
2004-07-14 13:35
2004.08.08
немогу разобратся с try...except...


1-1090421004
курсор
2004-07-21 18:43
2004.08.08
Про мышку


14-1090486247
syte_ser78
2004-07-22 12:50
2004.08.08
Загадка


1-1090628404
nick_mas
2004-07-24 04:20
2004.08.08
Подскажите, как лучше закодировать информацию?


4-1088158566
MetalFan
2004-06-25 14:16
2004.08.08
"повисшее" приложение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский