Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];




Вниз

Подскажите пожалуйста! Код TForm2.Create(nil) вовсе не помещает создаваемую форму на панель задач! (он ее помещает на РАБОЧИЙ СТОЛ) 


Kettle of delphi   (2002-03-04 17:05) [0]

субж ... при свертке формы, этот код лишь создает иконку на РАБОЧЕМ СТОЛЕ!!! при этом, если свернуть ОСНОВНУЮ ФОРМУ, то свертка Form2 вообще пропадает!

ВОПРОС:
как правильно создать Form2 так, чтобы эта форма2 имела свою кнопку (как любая программа) на ПАНЕЛЕ ЗАДАЧ (где меню ПУСК) и не пропадала при свертке основной формы (Form1)???



lipskiy   (2002-03-04 18:53) [1]

Насколько я понимаю, одно приложение может иметь только одну кнопку на панели задач. Чтобы поиметь вторую - надо из своего приложения запустить другое свое приложение. Все IMHO, могу ошибаться.



Kettle of delphi   (2002-03-04 20:07) [2]

А как же поступают разные чатовые системы? Там этот принцип реализован, а файл один!



y-soft   (2002-03-04 22:55) [3]

>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 на панели задач по умолчанию отображались все формы, что было весьма неудобно :)



lipskiy   (2002-03-04 23:58) [4]

To y-soft
Этого я не знал, спасибо.
Но вот попробовал приведенный код - ерунда какая-то, на панели всегда висят две кнопки - одна с названием ехешника, другая с заголовком главной формы. И никогда это не меняется, ни при включении новых форм, ни при оставлении только главной. В чем может быть дело?



Kettle of delphi   (2002-03-05 03:19) [5]

2 y-soft:
Спасибо, код реально создает кнопки форм на панеле задач. Это то, что мне нужно.
Но! При сворачивании основной формы (Form1), все формы (Form2, Form3, Form4, ...), которые я успел открыть из этой основной формы, тоже сворачиваются!!!
Как этого избежать? Я думаю, нужно перехватить и отфильтровать специальное системное сообщение? Я не знаю, как это практически реальзовать! Пожалуйста, у кого есть желание, приведите пример попроще (но что бы не висло через раз из-за простоты)))!



Slava   (2002-03-05 09:02) [6]

> 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;



Slava   (2002-03-05 09:04) [7]

а самом деле,
Params.WndParent := 0;
необязательно



y-soft   (2002-03-05 09:19) [8]

>lipskiy
Не совсем понял, что Вам нужно. Чтобы на панели задач не было окна приложения? Или еще чего-нибудь?

> Kettle of delphi
Это происходит потому, что в Delphi по умолчанию форма, которая создается первой, становится главной и обрабатывается не так, как остальные. Необходимо переписать код так, чтобы все формы были равноправными. Сейчас из-за нехватки времени пример привести не могу, может ближе к вечеру...:(



y-soft   (2002-03-05 11:38) [9]

Обещанный пример приложения без главной формы:

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.



lipskiy   (2002-03-05 13:33) [10]

2 y-soft
Просто у меня всегда две кнокпи отображаются на панели задач, даже когда одна форма активна. Предполагалось то вроде - одна кнопка на одну форму - так вроде? А у меня всегда две кнопки, даже когда я три формы включил, две формы, одну форму...
Я наверное что-то криво сделал, посмотрю еще сам, отвечать не надо:).



Kettle of delphi   (2002-03-05 14:50) [11]

хмм... А если перехватить нажатие кнопки "свертка" на Form1 и обработать это сообщение так: Form1.Visible := false;
А Form1.Visible := true повесить на перехватчик сообщения "нажата кнопка приложения на панеле задач"?

На сколько "кривой" такой подход?
Если он не "кривой", то как перехватить сообщение "нажата кнопка приложения на панеле задач"?



Slava   (2002-03-05 15:21) [12]

> Kettle of delphi

Чем тебе не подходит мой ответ?



Kettle of delphi   (2002-03-05 15:37) [13]

2 Slava ©:

В твоем ответе, который, кстати, подходит :) требуется дописывать по процедуре к каждой форме. Вот:

>в *.dfm остальных форм достаточно
>procedure CreateParams(var Params: TCreateParams); override;

А тот вариант, который я придумал сегодня утром (Visible) - пишется только в главной форме. Единственно, я не знаю, на сколько это "грамотно", так делать? :)



Pete   (2002-03-05 15:41) [14]

>Просто у меня всегда две кнокпи отображаются на панели задач, >даже когда одна форма активна. Предполагалось то вроде - одна >кнопка на одну форму - так вроде? А у меня всегда две кнопки, >даже когда я три формы включил, две формы, одну форму...
>Я наверное что-то криво сделал, посмотрю еще сам, отвечать не >надо:).

Ты наверно форму закрываешь Close???? то тогда она невидима, но существует, попробуй Release!!!



lipskiy   (2002-03-05 17:23) [15]

2Pete
А если закрытая Closeм форма (что я и делал, как ты правильно подметил :) существует, то почему нажатием кнопки на панели задач она не активируется? А кстати, Release уничтожает форму или что он с ней делает? Если уничтожает, то при следующем открытии надо создавать? А если она у меня в дизайн-тайме создана? (Сейчас Дельфы под рукой нет - самому не проверить).




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.036 c
7-67023           Leviathan             2001-12-17 18:14  2002.03.21  
PlaySound


14-66974          Alibaba               2002-02-06 17:25  2002.03.21  
Простая страничка


4-67050           DNT                   2001-12-30 20:43  2002.03.21  
Как определить handle активного окна?


1-66810           Stexen                2002-03-04 19:45  2002.03.21  
Захват изображения


7-67026           Snake                 2001-12-19 15:46  2002.03.21  
Как узнать дату выпуска BIOS?