Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 поведение немодальных окон как в 1С  [new]
demav
Member

Откуда:
Сообщений: 122
В windows если одно немодальное окно распахнуть (wsMaximized), то все остальные немодальные окна тоже становятся распахнутым.
А в 1C такое не наблюдается.

Есть ли какой-то готовый обработчик окон с подобной технологией? Чтобы не изобретать самому.
10 окт 11, 19:09    [11415612]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
*keeper*
Member

Откуда:
Сообщений: 79
demav
...
А в 1C такое не наблюдается.
...


Вы уверены?
в 1С v7.7 точно наблюдается.
11 окт 11, 11:45    [11418372]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
CyberMax
Member

Откуда: Хабаровск
Сообщений: 1525
В восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.
11 окт 11, 13:01    [11419200]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
maratvg
Member

Откуда: 74
Сообщений: 120
CyberMax,

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

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 форме:

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;
11 окт 11, 13:25    [11419523]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
xen2
Guest
если решите сами делать, может пригодиться:
+ Simulating MDI without MDI Overhead
The 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.
11 окт 11, 14:09    [11419894]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
xen2
Guest
+ сорри, про тег SRC забыл
{===========================================================
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.
11 окт 11, 14:33    [11420191]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
Вау!!!
Guest
CyberMax
В восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.

Где где? в Windows 8 ? Картинка с другого сайта.
11 окт 11, 15:19    [11420665]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
CyberMax
Member

Откуда: Хабаровск
Сообщений: 1525
Вау!!!
CyberMax
В восьмерке - раздельная максимизация. Самого интересует, как это сделать. Где-то находил информацию, что 1С сделала собственную реализацию MDI-интерфейса.

Где где? в Windows 8 ? Картинка с другого сайта.

Евгений Ваганыч, у вас авторизация слетела.
11 окт 11, 15:41    [11420928]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
Pavel Kurakin
Member

Откуда: Россия, Калининград
Сообщений: 513
Можно еще вот здесь посмотреть.
11 окт 11, 18:41    [11422656]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DrMengele
Member

Откуда:
Сообщений: 18
demav
В windows если одно немодальное окно распахнуть (wsMaximized), то все остальные немодальные окна тоже становятся распахнутым.
А в 1C такое не наблюдается.

Есть ли какой-то готовый обработчик окон с подобной технологией? Чтобы не изобретать самому.

А в 1С они вроде псевдомодальные.
Я у себя использую MDIChild которые выглядят как модальные.
25 окт 11, 09:56    [11493011]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58406
DrMengele
А в 1С они вроде псевдомодальные.
в 7-ке точно они псевдо
т.к. позволяют кликать на приложение мимо себя
25 окт 11, 11:00    [11493497]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Хорошо забытое старое.
Увидел сейчас сам такое в 1С и стало прямо интересно.
Собственная реализация MDI вообще сложное дело?

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

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

Спасибо.

Сообщение было отредактировано: 5 ноя 21, 11:43
5 ноя 21, 11:40    [22392136]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
bzums
Собственная реализация MDI вообще сложное дело?

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

А так - сделать-то не сложно, но в прежних версиях появлялось дикое количество артефактов, с которыми приходилось бороться. Например: у дочернего окна переставал отрисовываться active caption (оно было перманентно серым), отваливался вызов action-ов по горячим клавишам, отваливались хинты с контролов и т. д. и т. п.
5 ноя 21, 12:14    [22392146]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Не думаю, что мне по плечу такое самому.
Не занете ,есть модет какая-либо библитека / компонент?
Или простенький пример использования?
Спсибо
5 ноя 21, 12:34    [22392150]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DHDD
Member

Откуда:
Сообщений: 134
bzums,

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

procedure TForm1.Button1Click(Sender: TObject);
var childForm: TForm2;
begin
    childForm := TForm2.Create(form1);
    childForm.Parent := form1;
    childForm.Show;
end;


Сообщение было отредактировано: 5 ноя 21, 14:24
5 ноя 21, 14:23    [22392195]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DHDD
Member

Откуда:
Сообщений: 134


К сообщению приложен файл. Размер - 21Kb
5 ноя 21, 14:25    [22392197]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
DHDD,

к сожалению в чайлдформе нет одной из самых полезных фич mdi: автоматического раскладывания плиткой/лестницей
5 ноя 21, 14:57    [22392210]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DHDD
Member

Откуда:
Сообщений: 134
makhaon,

procedure TForm1.Button2Click(Sender: TObject);
begin
    TileWindows(Handle, MDITILE_VERTICAL, nil, 0, nil);
end;


и так далее.

К сообщению приложен файл. Размер - 11Kb
5 ноя 21, 16:13    [22392223]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DHDD
Member

Откуда:
Сообщений: 134
    CascadeWindows(Handle, MDITILE_VERTICAL, nil, 0, nil);


К сообщению приложен файл. Размер - 22Kb
5 ноя 21, 16:15    [22392225]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Я просто стал смотреть всякие лохматые примеры (реализованные еще лет 20 назад), один из них тут выше.
Например, всякие компоненты типа MultiDoc, MultiFrame....
Ужас один.
А тут получается все намного проще.


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

Спасибо.
5 ноя 21, 16:29    [22392226]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
DHDD
Member

Откуда:
Сообщений: 134
bzums,

прилипают к краям и растягиваются вслед за формой-предком
меню их пропадает

           childForm.Align := alClient;
           childForm.BorderStyle := bsNone;


меню сливать тоже ручками прописать.
5 ноя 21, 16:48    [22392230]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
makhaon
к сожалению в чайлдформе нет одной из самых полезных фич mdi: автоматического раскладывания плиткой/лестницей

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

P.S. Имхо, главная полезная фича - это window menu / mdi bar (и раскладывание лесенкой - просто неудачный паллиатив для этого). Иногда полезно деление экрана (либо половины экрана) между двумя-тремя окнами (и плитка - неудачный паллиатив для этого). Нередко хороша возможность прилепить окно к краю и сделать его неперекрываемым, то есть оставить для других окон оставшуюся область.

Сообщение было отредактировано: 5 ноя 21, 18:02
5 ноя 21, 18:00    [22392248]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

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

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

Posted via ActualForum NNTP Server 1.5

5 ноя 21, 18:02    [22392250]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
Dimitry Sibiryakov

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

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

Да всё псевдо-mdi легко делается вручную лучше, чем в дельфе и очень быстро. Как я уже сказал выше - вопрос только в том, чтобы это не вызывало глюков VCL. В пятой дельфе - не вызывало, было всё отлично. В 2007-й - пришлось убить изрядно времени на откровенно хакерские решения некоторых проблем (ну то есть некоторые - решались только патчем кода VCL в оперативной памяти).
5 ноя 21, 18:04    [22392251]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
автор
Да всё псевдо-mdi легко делается вручную лучше, чем в дельфе и очень быстро.

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


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

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

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

Спасибо
5 ноя 21, 18:20    [22392257]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
bzums
Как интересно будет вести себя Showmodal?

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

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

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;

и всё станет нормально, я так думаю.

Сообщение было отредактировано: 5 ноя 21, 18:29
5 ноя 21, 18:25    [22392259]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Спасибо.
А потенциально , если возьму этот вариант на вооружение, с чем у меня могут быть проблемы?
Требования только два - главная форма и окна в ней все дочерние, но не МДИ.
Формы могут быть как те, что только один экземпляр ( справочники), так и допускающие многие экземпляры ( например по каждому виду документа ; расходная ведомость, приходная ).


Большое спасибо.
5 ноя 21, 20:23    [22392282]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Кстати, пришла в голову мысль прятать заголовок формы при разворачивании на весь экран через bsNone. Это можно так реализовать?
5 ноя 21, 20:28    [22392284]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
DHDD,

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

Так то всё можно сделать, вопросов нет. Но если оно так и так умеет, то зачем возится. А с меню, как уже сказали VCL разбирается.

Сообщение было отредактировано: 6 ноя 21, 00:43
6 ноя 21, 00:43    [22392396]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
makhaon
Но если оно так и так умеет, то зачем возится

Затем, что реализация MDI в дельфе имеет кучу врождённых недостатков, и пользоваться ей - удовольствие для свежепрочитавших "освой за 21 день". Потом хочется более вменяемого поведения.
6 ноя 21, 01:29    [22392410]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
softwarer

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


Напишите мне, пожалуйста, про эти недостатки.
О чём идёт разговор? Очень надо.
Спасибо большое.
6 ноя 21, 16:57    [22392549]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
bzums,

то ли мне повезло, то ли я на их пока не попадал. главный и единственный из известных - что MDI форма может существовать только одна. хотя на уровне операционки этого запрета не существует.
7 ноя 21, 20:41    [22392870]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67456
Блог
bzums
Напишите мне, пожалуйста, про эти недостатки. О чём идёт разговор? Очень надо.

Я уже плохо помню, потому что отказался от MDI где-то с 99-го года. Первый и наиболее очевидный - уже упоминавшийся идиотизм, согласно которому mdi-ное окно всегда и сразу видимо. В результате приходится ставить ему FormStyle = fsNormal и делать fsMDIChild там, где хочешь, чтобы окно стало видимым. Насколько я помню, mdi-ное окно не могло иметь собственного main menu, надо было имитировать его через тулбары. Насколько я помню, были проблемы с вызовом клавиатурных action-ов - возможно, в случае, если открыты несколько однотипных окон. Итд.
7 ноя 21, 23:37    [22392919]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58406
есть у меня программка на д7+мди
работает уже лет 18, с декабря 2003-его. Раз в год пересобираю, добавляю какую-нить фигню
юзеры не нудят
но одна такая. Была вторая, со временем умерла
8 ноя 21, 09:09    [22392964]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
Провел тест
В принципе то что нужно.
Одно но - при сворачивании вниз и изменении размеров главной формы в большую сторону, эти свернутые формы висят на том же месте (куда были первоначально свернуты).
Стандартного варианта, например, закладок или ленты какой-то внизу не нашел.
Некрасиво.

Спасибо.
8 ноя 21, 13:34    [22393099]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

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

СПасибо.

К сообщению приложен файл. Размер - 149Kb
9 ноя 21, 16:25    [22393723]     Ответить | Цитировать Сообщить модератору
 Re: поведение немодальных окон как в 1С  [new]
bzums
Member

Откуда:
Сообщений: 191
bzums,

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

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

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

Это как так?

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

Спасибо.
18 ноя 21, 21:43    [22397701]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить