Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки / 16 сообщений из 16, страница 1 из 1
02.12.2018, 19:11
    #39741737
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
В 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
02.12.2018, 19:56
    #39741743
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
У главной формы отключить AutoScroll пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2018, 20:05
    #39741744
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
Dimitry Sibiryakov, AutoScroll главной формы false
...
Рейтинг: 0 / 0
02.12.2018, 20:08
    #39741745
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
...
Рейтинг: 0 / 0
02.12.2018, 20:35
    #39741756
SimplTsar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как полностью отображать дочернюю форму в главной форме MDI-приложении, без прокрутки
Для доступа к клиентской области MDIForm используют ClientHandle
Windows.GetClientRect(fMain.ClientHandle, clRect) , где clRect: TRect
Для дочерних окон можно выставить WindowState = wsMaximazed

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

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

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


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

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

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

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

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


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