powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
16 сообщений из 16, страница 1 из 1
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741737
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 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 но ничего не меняется.

Код: pascal
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.
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.


Код: pascal
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.
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
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741743
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У главной формы отключить AutoScroll пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741744
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, AutoScroll главной формы false
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741745
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741756
SimplTsar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для доступа к клиентской области MDIForm используют ClientHandle
Windows.GetClientRect(fMain.ClientHandle, clRect) , где clRect: TRect
Для дочерних окон можно выставить WindowState = wsMaximazed

И обратите внимание на создание дочерних форм - потенциальное место утечки памяти
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741778
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SimplTsarДля дочерних окон можно выставить WindowState = wsMaximazed
SimplTsar, так неправильно работает-во первых, не полностью помешается dbMemo, dbGrid дочерней формы на экран, во вторых, кнопки дочерней формы поднимаются в main menu главной формы.
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741799
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuтак неправильно работает-во первых, не полностью помешается dbMemo, dbGrid дочерней формы на экран, во вторых, кнопки дочерней формы поднимаются в main menu главной формыТаки как раз работает правильно. В винде это и есть самый что ни на есть нативный mdi. Все остальное только самописное. На правах рекламы, в наших компонентах есть такое - для создания "вкладочного" mdi 🙂
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741800
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, и эти люди через несколько лет придут на смену нормальным программистам?
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741802
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не было скроллов -- надо у дочерних форм корректно настроить расположение контролов, чтобы их размер подходил под любые окна. Например, выставить Align и Anchors.
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741803
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDiЧтобы не было скроллов -- надо у дочерних форм корректно настроить расположение контролов, чтобы их размер подходил под любые окна. Например, выставить Align и Anchors.
JaDi , убрал все контролы дочерней формы, пробовал align= alClient, alNone ничего не меняется.
Сделал дочернюю форму минимального размера- то же самое.
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741805
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

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

Как выглядит на XE6:


А это с компонентом DevExpress для MDI (раз уж выше его упомянули):
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741806
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

еще у самих форм типа TfChartAcc надо отключить Align в None, иначе они начинают глючить и не могут корректно менять размер. А заодно убрать свой код по смене размера. Короче, чисто формы по умолчанию оставить без своего велосипедного кода -- и всё заработает как надо.
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741807
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741808
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi, Если выставить WindowState на wsMaximized нижняя часть формы все равно не видна до конца. Кроме этого, в правом угле, на Main Menu накапливаются триады кнопок.
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741810
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

потому что надо отключить Align у создаваемых форм (см. пост выше).
...
Рейтинг: 0 / 0
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
    #39741980
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDibastibubu,

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

JaDi , WindowsState=maximized, align=none, убрал свой код установки размеров и заработал! Спасибо вам.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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