MDI приложения
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. |
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Как выполнить код после создания MDIChild-формы но до появления ее на экране?
Как отобразить MDIChild-форму модально?
1.Убераешь свою MDIChild форму из автосоздания: (MainMenu) Project->Options->Forms. Там её перебрасываешь в: Available forms
2. Переключаешься на свою MDIChild форму и дописываеш в описание класса(пусть например твой класс формы для MDIChild называется TForm2):
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
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; |
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Ва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; |
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Так как MDI-приложения всегда объединяют меню дочерних окон с главным меню родительского окна, вы можете установить определенное значение для указания позиции элементов меню в новой, объединенной строке меню. Это называется индексом группы. Но работает оно только для видимых пунктов меню.
Так, например, если ваше MDI-меню имеет:
[Файл] [Вид] [О программе] (со значениями индексов групп 1 5 10) (Значения не имеют никакого значения (извините за невольный каламбур), они используются только лишь для сортировки),
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Для того чтобы сделать это выполните следующие шаги:
Создайте новый проект.
Установите FormStyle формы в fsMDIForm
Разместите Image на форме и загрузите в него картинку.
Найдите { Private Declarations } в объявлении формы и добавьте следующие строки:
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Когда во время разработки вы устанавливаете "DataSource"-свойство в БД-компонентах для указания на модуль данных, VCL во время выполнения приложения будет пытаться создать связь с существующим TDataModule, основываясь на его свойтсве Name. Так, если вы добавите модуль данных к вашему проекту и переместите его в свойстве проекта из колонки автоматически создаваемых форм в колонку доступных, вы сможете разработать форму, содержащую элементы управления для работы с базами данных, после чего несколькими строчками кода можете создать экземпляр формы, имеющий экземпляр собственного модуля данных.
С помощью Репозитория создайте "standard MDI application" (стандартное MDI-приложение), в котором модуль TMDICHild будет похож на приведенный ниже. Добавленные строки имеют комментарий {!}. Хитрости спрятаны в конструкторе create и задании другого порядка следования операторов.
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Code: |
procedure TCustomForm.VisibleChanging; begin if (FormStyle = fsMDIChild) and Visible then raise EInvalidOperation.Create(SMDIChildNotVisible); end; |
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
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 перед созданием окна и после того, как создание будет завершено.
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Если в дочерней форме 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; |
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Автор: Richard Cox
Проблема, с котороя я столкнулся, заключается в том, что нижняя часть дочерней формы загораживает панель состояния родительской формы...
У меня была аналогичная проблема -- она проявлялась при условии, когда свойство главной формы WindowState устанавливалось на wsMinimized.
Вот мое решение: добавьте этот небольшой метод к вашей главной форме:
- Подробности
- Родительская категория: TForm
- Категория: MDI приложения
Страница 1 из 2