Code:

{ Избавление от ScrollBar'ов в MDI-форме. (С) Peter Below (TeamB)              }

{ Не надо VCL переписывать :-)                                                 }

 

unit MainForm;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus;

 

type

TfMain = class(TForm)

   MainMenu1: TMainMenu;

   Newchild1: TMenuItem;

   Newchild2: TMenuItem;

   procedure Newchild2Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

var

fMain: TfMain;

 

implementation

 

uses ChildForm;

 

{$R *.DFM}

 

procedure TfMain.Newchild2Click(Sender: TObject);

begin

with TfChild.Create(Application) do

   Show();

end;

 

function ClientWindowProc( wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;

var

f: Pointer;

begin

f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));

case msg of

WM_NCCALCSIZE:

   if ( GetWindowLong( wnd, GWL_STYLE ) and

                      (WS_HSCROLL or WS_VSCROLL)) <> 0 then

     SetWindowLong( wnd, GWL_STYLE, GetWindowLong( wnd, GWL_STYLE )

                                  and not (WS_HSCROLL or WS_VSCROLL));

end;

Result := CallWindowProc( f, wnd, msg, wparam, lparam );

end;

 

procedure TfMain.FormCreate(Sender: TObject);

begin

if ClientHandle <> 0 then begin

   if GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 then

     Exit;  {cannot subclass client window, userdata already in use}

   SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong( ClientHandle,

                               GWL_WNDPROC, integer( @ClientWindowProc)));

end;

 

end;

 

end.

 

 

Как выполнить код после создания MDIChild-формы но до появления ее на экране?
Как отобразить MDIChild-форму модально?

1.Убераешь свою MDIChild форму из автосоздания: (MainMenu) Project->Options->Forms. Там её перебрасываешь в: Available forms

 

2. Переключаешься на свою MDIChild форму и дописываеш в описание класса(пусть например твой класс формы для MDIChild называется TForm2):

 

Code:

private

  Procedure WMSize( Var msg: TWMSize ); Message WM_SIZE;

...

Procedure TChildForm.WMSize( Var msg: TWMSize );

Begin

inherited;

If msg.SizeType = SIZE_MINIMIZED Then

   ...

End;

 

Ваpиант 1. CoolBar.

Code:

procedure TMainForm.SetBands(AControls: array of TWinControl;

ABreaks: array of boolean);

var

i: integer;

begin

with CoolBar do

begin

   for i:=0 to High(AControls) do

   begin

     if Bands.Count=succ(i) then

       TCoolBand.Create(Bands);

     with Bands[succ(i)] do

     begin

       if Assigned(Control) then

         Control.Hide;

       MinHeight:=AControls[i].Height;

       Break:=ABreaks[i];

       Control:=AControls[i];

       Control.Show;

       Visible:=true;

     end

   end;

   for i:=High(AControls)+2 to pred(Bands.Count) do

     Bands[i].Free

end

end;

 

Так как MDI-приложения всегда объединяют меню дочерних окон с главным меню родительского окна, вы можете установить определенное значение для указания позиции элементов меню в новой, объединенной строке меню. Это называется индексом группы. Но работает оно только для видимых пунктов меню.

 

Так, например, если ваше MDI-меню имеет:

[Файл] [Вид] [О программе] (со значениями индексов групп 1 5 10) (Значения не имеют никакого значения (извините за невольный каламбур), они используются только лишь для сортировки),

 

Для того чтобы сделать это выполните следующие шаги:

     Создайте новый проект.

     Установите FormStyle формы в fsMDIForm

     Разместите Image на форме и загрузите в него картинку.

     Найдите { Private Declarations } в объявлении формы и добавьте следующие строки:

 

Когда во время разработки вы устанавливаете "DataSource"-свойство в БД-компонентах для указания на модуль данных, VCL во время выполнения приложения будет пытаться создать связь с существующим TDataModule, основываясь на его свойтсве Name. Так, если вы добавите модуль данных к вашему проекту и переместите его в свойстве проекта из колонки автоматически создаваемых форм в колонку доступных, вы сможете разработать форму, содержащую элементы управления для работы с базами данных, после чего несколькими строчками кода можете создать экземпляр формы, имеющий экземпляр собственного модуля данных.

 

С помощью Репозитория создайте "standard MDI application" (стандартное MDI-приложение), в котором модуль TMDICHild будет похож на приведенный ниже. Добавленные строки имеют комментарий {!}. Хитрости спрятаны в конструкторе create и задании другого порядка следования операторов.

 

 

Code:

procedure TCustomForm.VisibleChanging;

begin

if (FormStyle = fsMDIChild) and Visible then

   raise EInvalidOperation.Create(SMDIChildNotVisible);

end;

 

 

 

Code:

var

ProjectWindow: TWndProject;

begin

If ProjectActive=false then

begin

   LockWindowUpdate(ClientHandle);

   ProjectWindow:=TWndProject.Create(self);

   ProjectWindow.Left:=10;

   ProjectWindow.Top:=10;

   ProjectWindow.Width:=373;

   ProjecTwindow.Height:=222;

   ProjectWindow.Show;

   LockWindowUpdate(0);

end;

end;

 

 

Используйте LockWindowUpdate перед созданием окна и после того, как создание будет завершено.

 

Если в дочерней форме MDI установить BorderStyle в bsNone, то заголовок формы не исчезнет. (Об этом сказано в хелпе). А вот следующий пример решает эту проблему:

Code:

type

... = class(TForm)

{ other stuff above }

   procedure CreateParams(var Params: TCreateParams); override;

{ other stuff below }

end;

...

procedure tMdiChildForm.CreateParams(var Params: tCreateParams);

begin

inherited CreateParams(Params);

Params.Style := Params.Style and (not WS_CAPTION);

end;

 

Автор: Richard Cox

 

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

 

У меня была аналогичная проблема -- она проявлялась при условии, когда свойство главной формы WindowState устанавливалось на wsMinimized.

 

Вот мое решение: добавьте этот небольшой метод к вашей главной форме: