powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / поведение немодальных окон как в 1С
37 сообщений из 37, показаны все 2 страниц
поведение немодальных окон как в 1С
    #37476143
demav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В windows если одно немодальное окно распахнуть (wsMaximized), то все остальные немодальные окна тоже становятся распахнутым.
А в 1C такое не наблюдается.

Есть ли какой-то готовый обработчик окон с подобной технологией? Чтобы не изобретать самому.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37476823
*keeper*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
demav...
А в 1C такое не наблюдается.
...


Вы уверены?
в 1С v7.7 точно наблюдается.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477019
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477069
maratvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

в базовой дочерней форме:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 procedure  TChildForm.WMGetMinMaxInfo( var  Message: TWMGetMinMaxInfo);
 var 
  R: TRect;
 begin 
   inherited ;
  Windows.GetClientRect(Application.MainForm.ClientHandle, R);
  OffsetRect(R, -R.Left, -R.Top);
  Message.MinMaxInfo.ptMaxPosition := Point(-GetSystemMetrics(SM_CXSIZEFRAME), -GetSystemMetrics(SM_CYSIZEFRAME));
  Message.MinMaxInfo.ptMaxSize := Point(R.Right +  2  * GetSystemMetrics(SM_CXSIZEFRAME),
    R.Bottom +  2  * GetSystemMetrics(SM_CYSIZEFRAME));
 end ;

 procedure  TChildForm.WMSize( var  Message: TWMSize);
 begin 
   // Maximized - пропертя дочерней формы 
  Maximized := Message.SizeType = SIZE_MAXIMIZED;
   if  Message.SizeType = SIZE_MAXIMIZED  then 
    Message.SizeType := SIZE_RESTORED;
   inherited ;
 end ;

в главной MDI форме:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 procedure  TMainForm.FormResize(Sender: TObject);
 var 
  R: TRect;
  I: Integer;
 begin 
  Windows.GetClientRect(ClientHandle, R);
  OffsetRect(R, -R.Left, -R.Top);
  R.Left := -GetSystemMetrics(SM_CXSIZEFRAME);
  R.Top := -GetSystemMetrics(SM_CYSIZEFRAME);
    R.Right := R.Right + GetSystemMetrics(SM_CXSIZEFRAME);
    R.Bottom := R.Bottom + GetSystemMetrics(SM_CYSIZEFRAME);
     for  I :=  0   to  MDIChildCount -  1   do 
       if  (MDIChildren[I]  is  TChildForm)  and  TChildForm(MDIChildren[I]).Maximized  then 
        TChildForm(MDIChildren[I]).BoundsRect := R;
   end ;
 end ;
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477192
xen2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если решите сами делать, может пригодиться:
Simulating MDI without MDI OverheadThe reason I bought Delphi in the first place was to make a Win95 version of my favorite file manager, XTree for Windows 2.0. I'd never programmed before and realized soon that such a project was beyond my abilities. Two years later I've tried again, and this time I got it done ( http://www.fyi.net/~abass/domino/free.htm if you're interested).

One of the things I needed to to do was to get a MDI setup that didn't show scrollbars in the parent window if a child was moved partially 'offscreen.' The nature of MDI won't allow that, however. I also wanted to have the child's title bar and min/max buttons appear in the client area of the parent when the child was maximized, instead of having the titlebar disappear and the buttons appended below the parent's buttons. Again, not allowed with MDI.

Then, while searching for something else, I stumbled across a great article and sample program that did it all. The author is Brendan Delumpa and he has a great site of Delphi tips at www.delumpa.com. Check it out. This particular article I didn't find at his site, however. It is instead at The Cobb Group's website (not reproduced here for fear of copyright problems :-)
http://www.cobb.com/ddj/9704/ddj9741.htm.
I recommend reading this article before you get going with the code below but I guess it isn't really necessary as the code does do all that you need and if you just use it as a base to build on, you'll get your desired results. Still, the article is a good read and details very well how Delumpa "Tricked Windows" into letting him do what he wanted.

The downside? Well, there's a little work involved, and you'll be responsible for all other MDI niceties such as the Window Menu. But it can be done and it results in a pretty slick interface (look to DTree above, seriously).

Below is the code for a 'parent' and 'child' form ala Brendan Delumpa. There are no controls on the child and only a "new child" button on the parent form so you can easily create them in Delphi and just drop this code into them. NOTE that this code will not get you everything you'll see in DTree; I put a whole lot of extra stuff in and around this base.

THE CHILD FORM:

{===========================================================
Copyright © 1997 Brendan V. Delumpa All Rights Reserved
Program : Child Form
Author : Brendan V. Delumpa
Description : This is a demonstration of creating a pseudo-MDIChild
form, without the MDI overhead or complexities.
Everything you can do with a top-level form can be
applied to this child form, which is actually not

possible with a MDI application because of the child
constraints.

One thing that you should note. I've brute forced
form activation here by sending WM_NCACTIVATE to
change the color of an "active" child form's caption
bar. This is Windows trickery at its best. In all
actuality, none of the "child" forms is active, nor
focused, even though they appear to be. Pretty neat, huh?

===========================================================}
unit ChildFor;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;

type
TChildFrm = class(TForm)
Label1: TLabel;
private
ChildHndl : THandle;
protected
procedure CreateParams(var Params : TCreateParams); override;
procedure WndProc(var Msg : TMessage); override;
procedure ActivateForm; virtual;

public
{ Public declarations }
end;

var
ChildFrm: TChildFrm;

implementation
uses Unit1;
{$R *.DFM}

{===========================================================
This procedure overrides the default CreateParams procedure to set
the form up as a Child window. This is done through the Style param.
Note that when you set a form to be a child, it cannot have WS_POPUP
as a style parameter as well, so it's AND'ed out. Setting WndParent

and Parent to Application.MainForm notifies Delphi and Windows
respectively, of the relationship. ===========================================================}
procedure TChildFrm.CreateParams(var Params : TCreateParams);
begin
inherited CreateParams(Params);
with Params do begin
{Set the child window's style - WS_CHILD is absolutely required
but you can optionally set other flags as well.}
Style := (Style OR WS_CHILD) AND (NOT WS_POPUP);

{The following should be added to the line above if you want to
make an expert form.
AND (NOT WS_CAPTION) AND (NOT WS_THICKFRAME);}
{Designate the child form's parent}
WndParent := Application.MainForm.Handle;
end;
Parent := Application.MainForm;
end;

{===========================================================
WndProc is a wrapper for a Windows WindowProc which is the message
dispatcher for all messages sent to a window. It's an ideal place to

trap and process several messages in one fell swoop.

This one little routine is responsible for making the form act like
a MDIChild form, by trapping WM_CREATE, WM_LBUTTONDOWN, and
WM_NCLBUTTONDOWN messages. What it does is it tricks Windows into
thinking that the form is a top-level window by sending a WM_ACTIVATE
message to. This essentially makes the form's caption turn to the
default Active form color. Then the call is made to ActivateForm
to make all the other "Child" windows of the same class inactive. ===========================================================}

procedure TChildFrm.WndProc(var Msg : TMessage);
begin
{Call the default Window procedure so all default
actions are taken on all messages}
inherited WndProc(Msg);

{If the following occur, take further action}
if (Msg.Msg = WM_CREATE) OR {window create}
(Msg.Msg = WM_LBUTTONDOWN) OR {left-click in client area}
(Msg.Msg = WM_RBUTTONDOWN) OR {right-click in client area}
(Msg.Msg = WM_NCLBUTTONDOWN) OR {left-click in non-client area}

(Msg.Msg = WM_NCRBUTTONDOWN) then{right-click in non-client area}
begin
{"Trick" Windows into thinking this is an active, top-level form.}
Perform(WM_NCACTIVATE, Ord(True), 0);
{Change all other forms of the same class to look inactive.}
ActivateForm;
end
end;

{===========================================================
ActivateForm is the workhorse for WndProc. I probably could have
embedded this code in WndProc itself, but thought the better of it

since I wanted WndProc to maintain its identity as a dispatcher.
This procedure first assigns an interface (therefore global) variable
the value of the current form's handle, then iterates through all the
forms on the screen using the Screen global variable Forms property.
If it finds a form of the same class as the current form, it checks
to see if its handle is equal to the value of the global variable. If
it's not, then WM_NCACTIVATE is sent with a wParam of false to make

the form "inactive." This is actually necessary because the dispatcher
sets the form to "active" and it will stay that way regardless of
focus. So I needed to find a way to "inactivate" the other forms of the
same class.
==========================================================}
procedure TChildFrm.ActivateForm;
var
I : Integer;
begin
inherited;
{Set the private ChildHndl variable to Self.Handle,
so we know which form is active}

ChildHndl := Self.Handle;
Self.BringToFront;
{I use the red code instead of Delumpa's blue code below.
My code deactivates ALL other forms except for the 'parent' form.}
for i := 0 to screen.formcount -1 do
if (screen.Forms[i].ClassName <> parentfor.ClassName)
then SendMessage(screen.Forms[i].Handle, WM_NCACTIVATE, Ord(False), 0);
with Screen do begin
{Go through all the forms on screen.}
for I := 0 to FormCount - 1 do
if (Forms[I].ClassName = Self.ClassName) then

if (Forms[I].Handle <> ChildHndl) then
{If a "Child" is of the same type, but not the current one,
as specified by ChildHndl then make it inactive}
SendMessage(Forms[I].Handle, WM_NCACTIVATE, Ord(False), 0);
end;
end;

end.


THE PARENT FORM:

unit Parentfor;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type

TParentFrm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ParentFrm: TParentFrm;

implementation
uses
ChildFor;
{$R *.DFM}

procedure TParentFrm.Button1Click(Sender: TObject);
var
frm : TChildFrm;
begin
frm := TChildFrm.Create(Application);

with frm do begin
Left := 50;
Top := 50;
Show;
end;
end;

end.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477247
xen2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри, про тег SRC забыл
Код: 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.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
 {===========================================================
Copyright © 1997 Brendan V. Delumpa All Rights Reserved
 Program      : Child Form
 Author       : Brendan V. Delumpa
 Description  : This is a demonstration of creating a pseudo-MDIChild
                form, without the MDI overhead or complexities.
                Everything you can do with a top-level form can be
                applied to this child form, which is actually not

                possible with a MDI application because of the child
                constraints.

                One thing that you should note. I've brute forced
                form activation here by sending WM_NCACTIVATE to
                change the color of an "active" child form's caption
                bar. This is Windows trickery at its best. In all
                actuality, none of the "child" forms is active, nor
                focused, even though they appear to be. Pretty neat, huh?

 ===========================================================} 
 unit  ChildFor;

 interface 

 uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls;

 type 
  TChildFrm =  class (TForm)
    Label1: TLabel;
   private 
    ChildHndl : THandle;
   protected 
     procedure  CreateParams( var  Params : TCreateParams); override;
     procedure  WndProc( var  Msg : TMessage); override;
     procedure  ActivateForm; virtual;

   public 
     { Public declarations } 
   end ;

 var 
  ChildFrm: TChildFrm;

 implementation 
 uses  Unit1;
 {$R *.DFM} 

 {=========================================================== 
This procedure overrides the default CreateParams procedure to set
 the form up as a Child window. This is done through the Style param.
 Note that when you set a form to be a child, it cannot have WS_POPUP
 as a style parameter as well, so it's AND'ed out. Setting WndParent

 and Parent to Application.MainForm notifies Delphi and Windows
 respectively, of the relationship. ===========================================================} 
 procedure  TChildFrm.CreateParams( var  Params : TCreateParams);
 begin 
   inherited  CreateParams(Params);
   with  Params  do   begin 
     {Set the child window's style - WS_CHILD is absolutely required
     but you can optionally set other flags as well.}
    Style := (Style OR WS_CHILD) AND (NOT WS_POPUP);

    {The following should be added to the line above if you want to
     make an expert form.
     AND (NOT WS_CAPTION) AND (NOT WS_THICKFRAME);}
    {Designate the child form's parent} 
    WndParent := Application.MainForm.Handle;
   end ;
  Parent := Application.MainForm;
 end ;

 {=========================================================== 
WndProc is a wrapper for a Windows WindowProc which is the message
 dispatcher for all messages sent to a window. It's an ideal place to

 trap and process several messages in one fell swoop.

 This one little routine is responsible for making the form act like
 a MDIChild form, by trapping WM_CREATE, WM_LBUTTONDOWN, and
 WM_NCLBUTTONDOWN messages. What it does is it tricks Windows into
 thinking that the form is a top-level window by sending a WM_ACTIVATE
 message to. This essentially makes the form's caption turn to the
 default Active form color. Then the call is made to ActivateForm
 to make all the other "Child" windows of the same class inactive. ===========================================================} 

 procedure  TChildFrm.WndProc( var  Msg : TMessage);
 begin 
   {Call the default Window procedure so all default
   actions are taken on all messages} 
   inherited  WndProc(Msg);

   {If the following occur, take further action} 
   if  (Msg.Msg = WM_CREATE)  OR           {window create} 
     (Msg.Msg = WM_LBUTTONDOWN)  OR      {left-click in client area} 
     (Msg.Msg = WM_RBUTTONDOWN)  OR      {right-click in client area} 
     (Msg.Msg = WM_NCLBUTTONDOWN)  OR    {left-click in non-client area} 

     (Msg.Msg = WM_NCRBUTTONDOWN)  then  {right-click in non-client area} 
     begin 
       {"Trick" Windows into thinking this is an active, top-level form.} 
      Perform(WM_NCACTIVATE, Ord(True),  0 );
       {Change all other forms of the same class to look inactive.} 
      ActivateForm;
     end 
 end ;

 {=========================================================== 
ActivateForm is the workhorse for WndProc. I probably could have
 embedded this code in WndProc itself, but thought the better of it

 since I wanted WndProc to maintain its identity as a dispatcher.
 This procedure first assigns an interface (therefore global) variable
 the value of the current form's handle, then iterates through all the
 forms on the screen using the Screen global variable Forms property.
 If it finds a form of the same class as the current form, it checks
 to see if its handle is equal to the value of the global variable. If
 it's not, then WM_NCACTIVATE is sent with a wParam of false to make

 the form "inactive." This is actually necessary because the dispatcher
 sets the form to "active" and it will stay that way regardless of
 focus. So I needed to find a way to "inactivate" the other forms of the
 same class.
 ==========================================================}  
 procedure  TChildFrm.ActivateForm;
 var 
  I : Integer;
 begin 
   inherited ;
   {Set the private ChildHndl variable to Self.Handle,
   so we know which form is active} 

  ChildHndl := Self.Handle;
  Self.BringToFront;
  {I use the red code instead of Delumpa's blue code below. 
 My code deactivates ALL other forms except for the 'parent' form.} 
  for  i :=  0   to  screen.formcount - 1   do 
   if  (screen.Forms.ClassName <> parentfor.ClassName)
     then  SendMessage(screen.Forms[i].Handle, WM_NCACTIVATE, Ord(False),  0 );
  with  Screen  do   begin 
     [i]{Go through all the forms on screen.} 
     for  I :=  0   to  FormCount -  1   do 
       if  (Forms.ClassName = Self.ClassName)  then 

         if  (Forms[I].Handle <> ChildHndl)  then 
           [i]{If a "Child" is of the same type, but not the current one,
           as specified by ChildHndl then make it inactive} 
          SendMessage(Forms.Handle, WM_NCACTIVATE, Ord(False),  0 );
   end ;
 end ;

 end .


THE PARENT FORM:

 unit  Parentfor;

 interface 

 uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

 type 

  TParentFrm =  class (TForm)
    Button1: TButton;
     procedure  Button1Click(Sender: TObject);
   private 
     [i]{ Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
 ParentFrm: TParentFrm;

 implementation 
 uses  
  ChildFor;
 {$R *.DFM} 

 procedure  TParentFrm.Button1Click(Sender: TObject);
 var 
  frm : TChildFrm;
 begin 
  frm := TChildFrm.Create(Application);

   with  frm  do   begin 
    Left :=  50 ;
    Top  :=  50 ;
    Show;
   end ;
 end ;

 end .
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477359
Вау!!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CyberMaxВ восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.
Где где? в Windows 8 ?
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477410
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вау!!!CyberMaxВ восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.
Где где? в Windows 8 ?

Евгений Ваганыч, у вас авторизация слетела.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37477742
Pavel Kurakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще вот здесь посмотреть.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37496448
DrMengele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
demavВ windows если одно немодальное окно распахнуть (wsMaximized), то все остальные немодальные окна тоже становятся распахнутым.
А в 1C такое не наблюдается.

Есть ли какой-то готовый обработчик окон с подобной технологией? Чтобы не изобретать самому.
А в 1С они вроде псевдомодальные.
Я у себя использую MDIChild которые выглядят как модальные.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #37496547
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrMengeleА в 1С они вроде псевдомодальные.в 7-ке точно они псевдо
т.к. позволяют кликать на приложение мимо себя
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
поведение немодальных окон как в 1С
    #40109368
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо забытое старое.
Увидел сейчас сам такое в 1С и стало прямо интересно.
Собственная реализация MDI вообще сложное дело?

Очень нравится сама идея с основным окном приложения, но не хочется использовать MDI (например, ограничения разные, да и просто отказ от поддержки).

Чтобы также можно было свернуть, развернуть, минимизировать...

Спасибо.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109373
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Собственная реализация MDI вообще сложное дело?

Зависит от версии VCL, в которой будете это делать. В последних мне делать не приходилось, но когда у GetParentForm появился второй аргумент - я понадеялся, что они разобрались хотя бы с частью глюков такого режима.

А так - сделать-то не сложно, но в прежних версиях появлялось дикое количество артефактов, с которыми приходилось бороться. Например: у дочернего окна переставал отрисовываться active caption (оно было перманентно серым), отваливался вызов action-ов по горячим клавишам, отваливались хинты с контролов и т. д. и т. п.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109377
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не думаю, что мне по плечу такое самому.
Не занете ,есть модет какая-либо библитека / компонент?
Или простенький пример использования?
Спсибо
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109403
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bzums,

1. пустой проект (TForm1).
2. создай в IDE форму (TForm2).
3. создание дочерней, как MDI:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm1.Button1Click(Sender: TObject);
var childForm: TForm2;
begin
    childForm := TForm2.Create(form1);
    childForm.Parent := form1;
    childForm.Show;
end;
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109404
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109410
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHDD,

к сожалению в чайлдформе нет одной из самых полезных фич mdi: автоматического раскладывания плиткой/лестницей
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109419
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Код: pascal
1.
2.
3.
4.
procedure TForm1.Button2Click(Sender: TObject);
begin
    TileWindows(Handle, MDITILE_VERTICAL, nil, 0, nil);
end;



и так далее.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109421
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
    CascadeWindows(Handle, MDITILE_VERTICAL, nil, 0, nil);
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109422
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я просто стал смотреть всякие лохматые примеры (реализованные еще лет 20 назад), один из них тут выше.
Например, всякие компоненты типа MultiDoc, MultiFrame....
Ужас один.
А тут получается все намного проще.


А как тогда быть с поведением форм-детей, когда они:
прилипают к краям и растягиваются вслед за формой-предком
меню их пропадает (сливается) и появляется

Спасибо.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109425
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bzums,

прилипают к краям и растягиваются вслед за формой-предком
меню их пропадает
Код: pascal
1.
2.
           childForm.Align := alClient;
           childForm.BorderStyle := bsNone;



меню сливать тоже ручками прописать.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109439
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
к сожалению в чайлдформе нет одной из самых полезных фич mdi: автоматического раскладывания плиткой/лестницей

Честно говоря, никогда не понимал полезности этих операций, но вот уж что делается за пять минут, так это как раз эти убер-фичи.

P.S. Имхо, главная полезная фича - это window menu / mdi bar (и раскладывание лесенкой - просто неудачный паллиатив для этого). Иногда полезно деление экрана (либо половины экрана) между двумя-тремя окнами (и плитка - неудачный паллиатив для этого). Нередко хороша возможность прилепить окно к краю и сделать его неперекрываемым, то есть оставить для других окон оставшуюся область.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109441
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerглавная полезная фича - это window menu

И это делается VCL вручную.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109442
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

softwarerглавная полезная фича - это window menu

И это делается VCL вручную.

Да всё псевдо-mdi легко делается вручную лучше, чем в дельфе и очень быстро. Как я уже сказал выше - вопрос только в том, чтобы это не вызывало глюков VCL. В пятой дельфе - не вызывало, было всё отлично. В 2007-й - пришлось убить изрядно времени на откровенно хакерские решения некоторых проблем (ну то есть некоторые - решались только патчем кода VCL в оперативной памяти).
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109447
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДа всё псевдо-mdi легко делается вручную лучше, чем в дельфе и очень быстро.
авторИ это делается VCL вручную.

Я уже потерял понимание того, как и что и где делается.
В Дельфи, вручную в VCL....
Поясните пожалуйста.

В принципе меня такое решение удовлетворяет, ещё бы закладки добавить или какое-то подобие вкладок. Ну может доступ к дочерние формам, счётчик, ну и такое.

Как интересно будет вести себя Showmodal?

Спасибо
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109448
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Как интересно будет вести себя Showmodal?

Никто не мешает попробовать. Ну либо посмотреть в исходник Showmodal-а, и исходя из этого предсказать.

P.S. Подозреваю - плохо. Думаю, он заблокирует все остальные окна, включая главное, и в результате интерфейс намертво залипнет, так как модальное окно станет недоступным из-за недоступности родителя. Впрочем, можно поставить на главном окне примерно такой обработчик:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
type
  TFormBaseDebug = class(TDCFBaseForm)
    ...
    { Чихаем на попытки всяких ShowModal-ов нас заблокировать }
    procedure WmEnable(var Msg: TWMEnable); message WM_ENABLE;
    ...
  end;

{ Чихаем на попытки всяких ShowModal-ов нас заблокировать }
procedure TFormBaseDebug.WmEnable(var Msg: TWMEnable);
begin
  inherited;
  if not Msg.Enabled then EnableWindow(Self.Handle, true);
end;


и всё станет нормально, я так думаю.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109466
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
А потенциально , если возьму этот вариант на вооружение, с чем у меня могут быть проблемы?
Требования только два - главная форма и окна в ней все дочерние, но не МДИ.
Формы могут быть как те, что только один экземпляр ( справочники), так и допускающие многие экземпляры ( например по каждому виду документа ; расходная ведомость, приходная ).


Большое спасибо.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109468
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, пришла в голову мысль прятать заголовок формы при разворачивании на весь экран через bsNone. Это можно так реализовать?
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109569
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHDD,

О как :) Не знал что оно так умеет.
авторЧестно говоря, никогда не понимал полезности этих операций, но вот уж что делается за пять минут, так это как раз эти убер-фичи.
Так то всё можно сделать, вопросов нет. Но если оно так и так умеет, то зачем возится. А с меню, как уже сказали VCL разбирается.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109581
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
Но если оно так и так умеет, то зачем возится

Затем, что реализация MDI в дельфе имеет кучу врождённых недостатков, и пользоваться ей - удовольствие для свежепрочитавших "освой за 21 день". Потом хочется более вменяемого поведения.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109670
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

Затем, что реализация MDI в дельфе имеет кучу врождённых недостатков
Хочется более вменяемого поведения


Напишите мне, пожалуйста, про эти недостатки.
О чём идёт разговор? Очень надо.
Спасибо большое.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109862
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums,

то ли мне повезло, то ли я на их пока не попадал. главный и единственный из известных - что MDI форма может существовать только одна. хотя на уровне операционки этого запрета не существует.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109900
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Напишите мне, пожалуйста, про эти недостатки. О чём идёт разговор? Очень надо.

Я уже плохо помню, потому что отказался от MDI где-то с 99-го года. Первый и наиболее очевидный - уже упоминавшийся идиотизм, согласно которому mdi-ное окно всегда и сразу видимо. В результате приходится ставить ему FormStyle = fsNormal и делать fsMDIChild там, где хочешь, чтобы окно стало видимым. Насколько я помню, mdi-ное окно не могло иметь собственного main menu, надо было имитировать его через тулбары. Насколько я помню, были проблемы с вызовом клавиатурных action-ов - возможно, в случае, если открыты несколько однотипных окон. Итд.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109931
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть у меня программка на д7+мди
работает уже лет 18, с декабря 2003-его. Раз в год пересобираю, добавляю какую-нить фигню
юзеры не нудят
но одна такая. Была вторая, со временем умерла
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40109984
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Провел тест
В принципе то что нужно.
Одно но - при сворачивании вниз и изменении размеров главной формы в большую сторону, эти свернутые формы висят на том же месте (куда были первоначально свернуты).
Стандартного варианта, например, закладок или ленты какой-то внизу не нашел.
Некрасиво.

Спасибо.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40110365
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как сделать, чтобы главная форма сама отрисовывала скроллбары, если дочерняя выходит за ее границы.
Если у дочерней формы родитель - главная форма, то все нормально.
У меня же на клавной форме еще панель / лист / сроллбокс (пока не выбрал), если я дочернюю двигаю за пределы, ничего не происходит до тех пор, пока я у родителя вручную не поменяю размеры.

СПасибо.
...
Рейтинг: 0 / 0
поведение немодальных окон как в 1С
    #40112978
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bzums,

Хотя никто мне и не дал совета, я так и не пробовал решить эту проблему.

Возник вопрос, который можно наверное в этой же ветке и опубликовать.

А для МДИ формы нельзя провернуть такой фокус - кинуть например панель на задний план? Или любой другой контрол. Получается, форма перерисовывается принудительно и всегда то, что должно какбы по задумке на фоне, оно как раз сверху. То есть дочерние формы получаются под панелью.

Это как так?

Хочу на главной форме, например, кнопки ьыстрог доступа или виджет...

Спасибо.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / поведение немодальных окон как в 1С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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