Форум: "Основная";
Текущий архив: 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.041 c