Вниз
Скачать: CL | DM;

Подскажите пожалуйста! Код 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 уничтожает форму или что он с ней делает? Если уничтожает, то при следующем открытии надо создавать? А если она у меня в дизайн-тайме создана? (Сейчас Дельфы под рукой нет - самому не проверить).



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

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.007 c
6-66952
Alex
2002-01-05 19:50
2002.03.21
Help Me!!!!


3-66763
Лёша
2002-02-22 03:58
2002.03.21
Динамический массив в Interbase.


3-66779
AAAPLE
2002-02-22 14:21
2002.03.21
Прокрутка в DBGrid


3-66759
- Andrew -
2002-02-21 18:45
2002.03.21
Как записать картинку (Tiff, Bmp) в BLOB-поле?


3-66782
Andrey V. Zuev
2002-02-22 14:05
2002.03.21
Передача переменных на MSSQL7 через ADOQuery




   Наверх