Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
В MDI-приложении есть главная форма uMain и дочерние формы uChartAcc, uGas.
На дочерней форме сверху вниз расположены: Panel, Dbgrid, dbedit, dbmemo.
В клиентской области главной формы не видна нижняя часть дочерней формы(компоненты dbedit, dbmemo) и появляется вертикальная прокрутка. Хочу полностью отображать дочернюю форму в client area главной форме, без полосы прокрутки.

Главная форма:
Formstyle:MDIForm
WindowState: wsMaximized

дочерние формы:
Formstyle:MDIChild
Align- alClient или alCustom
Position-пробовал poDefaultPosOnly, poDefault, poDesigned
AutoSize:false
Пробовал установки размеров формы поместить в процедурах OnCreate, OnShow, OnResize но ничего не меняется.

+
unit Umain;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ComCtrls, Vcl.Tabs,
  Vcl.ToolWin;


type
  TFmain = class(TForm)
    ToolBar: TToolBar;
    MDIChildrenTabs: TTabSet;
    MainMenu1: TMainMenu;
    StatusBar: TStatusBar;
    NChartAcc: TMenuItem;
    realisatia1: TMenuItem;
    procedure NChartAccClick(Sender: TObject);
    procedure realisatia1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);


  private
    { Private declarations }

  public
    { Public declarations }
     procedure MDIChildCreated(const childHandle : THandle);
     procedure MDIChildDestroyed(const childHandle : THandle);
  end;

var
  Fmain: TFmain;
 
implementation

uses uChartAcc, uGas;



{$R *.dfm}


procedure TFmain.FormCreate(Sender: TObject);
begin

end;

procedure TFmain.MDIChildCreated(const childHandle : THandle);
begin
  mdiChildrenTabs.Tabs.AddObject(TForm(FindControl(childHandle)).Caption, TObject(childHandle));
  mdiChildrenTabs.TabIndex := -1 + mdiChildrenTabs.Tabs.Count;
end;

procedure TFmain.MDIChildDestroyed(const childHandle : THandle);
var
  idx: Integer;
begin
  idx := mdiChildrenTabs.Tabs.IndexOfObject(TObject(childHandle));
  mdiChildrenTabs.Tabs.Delete(idx);
end;



procedure TFmain.NChartAccClick(Sender: TObject);
begin
  application.CreateForm(TfChartAcc, fChartAcc);
 fChartAcc.Show;
end;

procedure TFmain.realisatia1Click(Sender: TObject);
begin
  application.CreateForm(TFgas, Fgas);
  Fgas.Show;
end;

end.

+
unit UChartAcc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBCtrls, DB, ibx.IBCustomDataSet, ibx.IBDatabase, Mask, StdCtrls, ComCtrls,
  ExtCtrls, ibx.IBSQL, Menus, Vcl.Buttons;

type
  TfChartAcc = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    edAcDescrpt: TDBMemo;
    Panel2: TPanel;
    edAccntNum: TDBEdit;
    edAccTitle: TDBEdit;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormShow(Sender: TObject);

  private
    { Private declarations }


  public
    { Public declarations }
  end;

var
  fChartAcc: TfChartAcc;
 
implementation

uses uMain;

{$R *.dfm}


procedure TfChartAcc.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 action:=caFree;
end;


procedure TfChartAcc.FormCreate(Sender: TObject);
begin
 Left:=0;
 Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
 Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
 Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);

  FMain.MDIChildCreated(self.Handle);
end;


procedure TfChartAcc.FormDestroy(Sender: TObject);
begin
 FMain.MDIChildDestroyed(self.Handle);
end;

procedure TfChartAcc.FormResize(Sender: TObject);
begin
 {
 Left:=0;
 Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
 Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
 Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
 }
end;

procedure TfChartAcc.FormShow(Sender: TObject);
begin
 {Left:=0;
 Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
 Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
 Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
}
end;

end.

https://drive.google.com/drive/folders/109sBbcJ5VBRE7V0iO_mEiobgPrfuzaTN?usp=sharing
2 дек 18, 19:11    [21751513]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
Dimitry Sibiryakov
Member

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

У главной формы отключить AutoScroll пробовал?

Posted via ActualForum NNTP Server 1.5

2 дек 18, 19:56    [21751535]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
Dimitry Sibiryakov, AutoScroll главной формы false
2 дек 18, 20:05    [21751537]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

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


К сообщению приложен файл. Размер - 11Kb
2 дек 18, 20:08    [21751538]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
SimplTsar
Member

Откуда:
Сообщений: 39
Для доступа к клиентской области MDIForm используют ClientHandle
Windows.GetClientRect(fMain.ClientHandle, clRect) , где clRect: TRect
Для дочерних окон можно выставить WindowState = wsMaximazed

И обратите внимание на создание дочерних форм - потенциальное место утечки памяти
2 дек 18, 20:35    [21751557]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
SimplTsar
Для дочерних окон можно выставить WindowState = wsMaximazed

SimplTsar, так неправильно работает-во первых, не полностью помешается dbMemo, dbGrid дочерней формы на экран, во вторых, кнопки дочерней формы поднимаются в main menu главной формы.

К сообщению приложен файл. Размер - 13Kb
2 дек 18, 22:41    [21751622]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1944
bastibubu
так неправильно работает-во первых, не полностью помешается dbMemo, dbGrid дочерней формы на экран, во вторых, кнопки дочерней формы поднимаются в main menu главной формы
Таки как раз работает правильно. В винде это и есть самый что ни на есть нативный mdi. Все остальное только самописное. На правах рекламы, в наших компонентах есть такое - для создания "вкладочного" mdi 🙂
3 дек 18, 00:51    [21751700]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
Док
Member

Откуда: Казань
Сообщений: 5868
блин, и эти люди через несколько лет придут на смену нормальным программистам?

К сообщению приложен файл. Размер - 2Kb
3 дек 18, 01:09    [21751706]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3934
Чтобы не было скроллов -- надо у дочерних форм корректно настроить расположение контролов, чтобы их размер подходил под любые окна. Например, выставить Align и Anchors.
3 дек 18, 02:29    [21751711]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
JaDi
Чтобы не было скроллов -- надо у дочерних форм корректно настроить расположение контролов, чтобы их размер подходил под любые окна. Например, выставить Align и Anchors.

JaDi, убрал все контролы дочерней формы, пробовал align= alClient, alNone ничего не меняется.
Сделал дочернюю форму минимального размера- то же самое.
3 дек 18, 02:39    [21751712]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3934
bastibubu,

Во-первых, формы там открываются в обычном режиме, т.е. не развернуты на всё mdi-окно. Надо открыть формы и выставить в них WindowState на wsMaximized (либо при создании эти настройки выставлять). После чего всё будет открываться корректно и никаких скроллов или доп настроек.

Как выглядит на XE6:
Картинка с другого сайта.

А это с компонентом DevExpress для MDI (раз уж выше его упомянули):
Картинка с другого сайта.
3 дек 18, 02:59    [21751714]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3934
bastibubu,

еще у самих форм типа TfChartAcc надо отключить Align в None, иначе они начинают глючить и не могут корректно менять размер. А заодно убрать свой код по смене размера. Короче, чисто формы по умолчанию оставить без своего велосипедного кода -- и всё заработает как надо.
3 дек 18, 03:15    [21751715]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
rgreat
Member

Откуда:
Сообщений: 4575
Картинка с другого сайта.
3 дек 18, 03:17    [21751716]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
JaDi, Если выставить WindowState на wsMaximized нижняя часть формы все равно не видна до конца. Кроме этого, в правом угле, на Main Menu накапливаются триады кнопок.

К сообщению приложен файл. Размер - 1Kb
3 дек 18, 03:31    [21751717]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3934
bastibubu,

потому что надо отключить Align у создаваемых форм (см. пост выше).
3 дек 18, 05:08    [21751721]     Ответить | Цитировать Сообщить модератору
 Re: Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки  [new]
bastibubu
Member

Откуда:
Сообщений: 91
JaDi
bastibubu,

потому что надо отключить Align у создаваемых форм (см. пост выше).


JaDi, WindowsState=maximized, align=none, убрал свой код установки размеров и заработал! Спасибо вам.
3 дек 18, 14:41    [21752112]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить