![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите пожалуйста! Код TForm2.Create(nil) вовсе не помещает создаваемую форму на панель задач! (он ее помещает на РАБОЧИЙ СТОЛ)
Kettle of delphi © (2002-03-04 17:05:00)субж ... при свертке формы, этот код лишь создает иконку на РАБОЧЕМ СТОЛЕ!!! при этом, если свернуть ОСНОВНУЮ ФОРМУ, то свертка Form2 вообще пропадает!
ВОПРОС:
как правильно создать Form2 так, чтобы эта форма2 имела свою кнопку (как любая программа) на ПАНЕЛЕ ЗАДАЧ (где меню ПУСК) и не пропадала при свертке основной формы (Form1)???
lipskiy (2002-03-05 17:23:00) [1]2Pete
А если закрытая Closeм форма (что я и делал, как ты правильно подметил :) существует, то почему нажатием кнопки на панели задач она не активируется? А кстати, Release уничтожает форму или что он с ней делает? Если уничтожает, то при следующем открытии надо создавать? А если она у меня в дизайн-тайме создана? (Сейчас Дельфы под рукой нет - самому не проверить).
Pete (2002-03-05 15:41:00) [2]>Просто у меня всегда две кнокпи отображаются на панели задач, >даже когда одна форма активна. Предполагалось то вроде - одна >кнопка на одну форму - так вроде? А у меня всегда две кнопки, >даже когда я три формы включил, две формы, одну форму...
>Я наверное что-то криво сделал, посмотрю еще сам, отвечать не >надо:).
Ты наверно форму закрываешьClose???? то тогда она невидима, но существует, попробуйRelease!!!
Kettle of delphi (2002-03-05 15:37:00) [3]2 Slava ©:
В твоем ответе, который, кстати, подходит :) требуется дописывать по процедуре к каждой форме. Вот:
>в *.dfm остальных форм достаточно
>procedure CreateParams(var Params: TCreateParams); override;
А тот вариант, который я придумал сегодня утром (Visible) - пишется только в главной форме. Единственно, я не знаю, на сколько это "грамотно", так делать? :)
Slava (2002-03-05 15:21:00) [4]> Kettle of delphi
Чем тебе не подходит мой ответ?
Kettle of delphi (2002-03-05 14:50:00) [5]хмм... А если перехватить нажатие кнопки "свертка" на Form1 и обработать это сообщение так: Form1.Visible := false;
А Form1.Visible := true повесить на перехватчик сообщения "нажата кнопка приложения на панеле задач"?
На сколько "кривой" такой подход?
Если он не "кривой", то как перехватить сообщение "нажата кнопка приложения на панеле задач"?
lipskiy (2002-03-05 13:33:00) [6]2 y-soft
Просто у меня всегда две кнокпи отображаются на панели задач, даже когда одна форма активна. Предполагалось то вроде - одна кнопка на одну форму - так вроде? А у меня всегда две кнопки, даже когда я три формы включил, две формы, одну форму...
Я наверное что-то криво сделал, посмотрю еще сам, отвечать не надо:).
y-soft (2002-03-05 11:38:00) [7]Обещанный пример приложения без главной формы:
program SeparateForms;
uses
Windows,
Forms,
SUnit1 in "SUnit1.pas" {Form1},
SUnit2 in "SUnit2.pas" {Form2};
procedure ApplicationRun; //Замена Application.Run
begin
repeat
Application.HandleMessage
until Application.Terminated;
end;
{$R *.RES}
begin
Application.Initialize;
//Самостоятельно создаем формы
Form1 := TForm1.Create(Application);
Form2 := TForm2.Create(Application);
Form1.Update;
Form1.Show;
Form2.Update;
Form2.Show;
//Скрываем окно приложения
ShowWindow(Application.Handle,SW_HIDE);
//Запускаем цикл обработки сообщений
ApplicationRun;
end.
unit SUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
S : Longint;
begin
S := GetWindowLong(Handle, GWL_EXSTYLE);
S := S or WS_EX_APPWINDOW;
SetWindowLong(Handle, GWL_EXSTYLE, S);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Завершаем приложение после закрытия последней формы
if Screen.FormCount = 1 then
Application.Terminate;
Action := caFree;
end;
end.
unit SUnit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.FormCreate(Sender: TObject);
var
S : Longint;
begin
S := GetWindowLong(Handle, GWL_EXSTYLE);
S := S or WS_EX_APPWINDOW;
SetWindowLong(Handle, GWL_EXSTYLE, S);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Завершаем приложение после закрытия последней формы
if Screen.FormCount = 1 then
Application.Terminate;
Action := caFree;
end;
end.
y-soft (2002-03-05 09:19:00) [8]>lipskiy
Не совсем понял, что Вам нужно. Чтобы на панели задач не было окна приложения? Или еще чего-нибудь?
> Kettle of delphi
Это происходит потому, что в Delphi по умолчанию форма, которая создается первой, становится главной и обрабатывается не так, как остальные. Необходимо переписать код так, чтобы все формы были равноправными. Сейчас из-за нехватки времени пример привести не могу, может ближе к вечеру...:(
Slava (2002-03-05 09:04:00) [9]а самом деле,
Params.WndParent := 0;
необязательно
Slava (2002-03-05 09:02:00) [10]> Kettle of delphi
в *.dpr:
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
Application.Run;
в *.dfm главной формы объявить две процедуры:
procedure CreateParams(var Params: TCreateParams); override;
procedure WMSysCommand(var m: TMessage); message WM_SYSCOMMAND;
в implementation
procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
procedure TfmMain.WMSysCommand(var m: TMessage);
begin
m.Result := DefWindowProc(Handle, m.Msg, m.wParam, m.lParam);
end;
в *.dfm остальных форм достаточно
procedure CreateParams(var Params: TCreateParams); override;
в implementation
procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
Kettle of delphi (2002-03-05 03:19:00) [11]2 y-soft:
Спасибо, код реально создает кнопки форм на панеле задач. Это то, что мне нужно.
Но! При сворачивании основной формы (Form1), все формы (Form2, Form3, Form4, ...), которые я успел открыть из этой основной формы, тоже сворачиваются!!!
Как этого избежать? Я думаю, нужно перехватить и отфильтровать специальное системное сообщение? Я не знаю, как это практически реальзовать! Пожалуйста, у кого есть желание, приведите пример попроще (но что бы не висло через раз из-за простоты)))!
lipskiy (2002-03-04 23:58:00) [12]To y-soft
Этого я не знал, спасибо.
Но вот попробовал приведенный код - ерунда какая-то, на панели всегда висят две кнопки - одна с названием ехешника, другая с заголовком главной формы. И никогда это не меняется, ни при включении новых форм, ни при оставлении только главной. В чем может быть дело?
y-soft (2002-03-04 22:55:00) [13]>lipskiy
Это не так. По умолчанию в Delphi не панели задач отображается окно приложения. Вот пример, как заставить отображается на панели задач любую форму приложения:
procedure TClientForm.FormCreate(Sender : TObject);
var
S : Longint;
begin
S := GetWindowLong(Handle, GWL_EXSTYLE);
S := S or WS_EX_APPWINDOW;
SetWindowLong(Handle, GWL_EXSTYLE, S);
S := GetWindowLong(Handle, GWL_STYLE);
S := (S or WS_POPUP) and not WS_CHILD;
SetWindowLong(Handle, GWL_STYLE, S);
end;
Кстати, в Delphi 1 на панели задач по умолчанию отображались все формы, что было весьма неудобно :)
Kettle of delphi (2002-03-04 20:07:00) [14]А как же поступают разные чатовые системы? Там этот принцип реализован, а файл один!
lipskiy (2002-03-04 18:53:00) [15]Насколько я понимаю, одно приложение может иметь только одну кнопку на панели задач. Чтобы поиметь вторую - надо из своего приложения запустить другое свое приложение. Все IMHO, могу ошибаться.