powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Для каждого окна своя кнопка на таскбаре
7 сообщений из 7, страница 1 из 1
Для каждого окна своя кнопка на таскбаре
    #32183724
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Есть SDI приложение. Нужно, чтобы каждое окно имело свою кнопку на таскбаре и вело себя как отдельное приложение(или что-то подобное).

Использование следующего и подобного не решает проблему:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

  Application.CreateForm( TForm1, Form1 );
  SetWindowLong(Form1.Handle, GWL_EXSTYLE,GetWindowLong(Form1.Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
  Form1.Show;

  Application.CreateForm( TForm1, Form1 );
  SetWindowLong(Form1.Handle, GWL_EXSTYLE,GetWindowLong(Form1.Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
  Form1.Show;


Окна создаются и все как надо до тех пор пока не захочется свернуть первое окно - сворачивается все и нет как надо.

ИЛИ У МЕНЯ НЕ ПОЛУЧИЛОСЬ :(

Эта задача в принципе решаема?
Если да, то подскажите куда копать.
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184033
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуйте не указывать родителя форм, т.е.

Application.CreateForm( TForm1, nil );
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184218
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to: Gold

Именно так не получиться:

> А попробуйте не указывать родителя форм, т.е.
> Application.CreateForm( TForm1, nil )

В CreateForm нельзя вторым параметром nil.

Может имелось ввиду это:
Form1 := TForm1.Create( nil );

Но это не помогает - просто за освобождение формы отвечаю я.

Вот, что у меня получаеться с используванием SetWindowLong:
1. У каждой формы своя кнопка на таскбаре. Каждая форма сворачивается и закрывается как положено, НО присутствует кнопка на таскбаре и для проекта, нажимая на которую сворачиваются все окна и ПРОПАДАЮТ кнопки форм. О!.

2. Если скрыть кнопку проекта, то первая же открытая форма становится как бы главной. Если ее закрыть - закрывается все.

3. и т.д.

Вопрос остается в силе.

Сейчас попробую в Application.MainForm динамически менять главную форму.
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184246
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы в исходниках поковырял, как делфя создает и контролирует окна в TApplication .... т.к. на самом деле TApplication видимое окно с нулевым размером ...
я когдато чтото подобное делал - но не помню где ето все лежит ... я просто вписал чтото в forms.pas вроде ы...
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184757
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем!

Вот, что у меня получилось!

FromMain.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
unit FormMain;

interface

uses
  Windows, FormParent, Classes, Controls, StdCtrls, Forms;

type
  TfmMain = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FWins: integer;
  public
    { Public declarations }
    procedure AddWin;
    procedure DeleteWin;
  end;

var
  fmMain: TfmMain;

implementation


{$R *.dfm}

procedure TfmMain.AddWin;
begin
  Inc( FWins );
end;

procedure TfmMain.DeleteWin;
begin
  Dec( FWins );
  
  if FWins =  0  then
    Close;
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin

  fmParent := TfmParent.Create( nil );
  fmParent.Show;

end;

end.


FormParent.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
unit FormParent;

interface

uses
  Windows, Classes, Controls, StdCtrls, Messages, Forms;

const
  TRASH_ME = wm_user+ 1 ;

type
  TfmParent = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure TrashMe( var message: tmessage ); message TRASH_ME;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure DoClose(var Action: TCloseAction); override;
  public
    { Public declarations }
    constructor Create( AOWner: TComponent ); override;
  end;

var
  fmParent: TfmParent;

implementation

uses FormMain;

{$R *.dfm}

{ TForm1 }

procedure TfmParent.CreateParams(var Params :TCreateParams); {override;}
begin
  inherited CreateParams(Params); {CreateWindowEx}

  Params.ExStyle  := Params.ExStyle or WS_Ex_AppWindow;

  //  Что бы по Alt+Tab иконки нормальные были
  Params.WndParent:= 0 ;
  //  Params.WindowClass.style;

end;

procedure TfmParent.DoClose(var Action: TCloseAction);
begin
  PostMessage( Handle, TRASH_ME,  0 ,  0  );
end;

procedure TfmParent.TrashMe(var message: tmessage);
begin
  Free;
  fmMain.DeleteWin;
end;

procedure TfmParent.Button1Click(Sender: TObject);
begin

  fmParent := TfmParent.Create( nil );
  fmParent.Show;

end;


constructor TfmParent.Create(AOWner: TComponent);
begin
  inherited;
  fmMain.AddWin;
end;

end.


Если есть вопросы, всегда пожалуйста.
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184763
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Dmitri Krizhanovski
СПАСИБО - ТЫ НАСТОЯЩИЙ ДРУГ...
пока вопросов нет - но оригинально ...
...
Рейтинг: 0 / 0
Для каждого окна своя кнопка на таскбаре
    #32184766
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, забыл файл проекта, вот:

program ISProject;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
uses
  Forms,
  Windows,
  FormParent in 'FormParent.pas' {fmParent},
  FormMain in 'FormMain.pas' {fmMain};

{$R *.res}

begin
  Application.Initialize;
  SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  Application.ShowMainForm := False;
  Application.CreateForm(TfmMain, fmMain);
  Application.Run;
end.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Для каждого окна своя кнопка на таскбаре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]