Форум: "Основная";
Текущий архив: 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 уничтожает форму или что он с ней делает? Если уничтожает, то при следующем открытии надо создавать? А если она у меня в дизайн-тайме создана? (Сейчас Дельфы под рукой нет - самому не проверить).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c