Сделать форму меньше 112 пикселей

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

In order to allow very small windows,

you need to override the default behavior for Windows message WM_GETMINMAXINFO.

This message is sent to your window by the OS in order to find out

the minimum and the maximum allowed window size.

You can do this by adding this method procedure to your form:

}

private

procedure GetMinMaxInfo(var Msg: TWMGETMINMAXINFO); message WM_GETMINMAXINFO;

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetMinMaxInfo(var Msg: TWMGETMINMAXINFO);

begin

inherited;

with Msg.MinMaxInfo^ do

begin

ptMinTrackSize.X := 0; // min. Width

ptMinTrackSize.Y := 0; // min. Height

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

{ no systemmenu }

BorderIcons := BorderIcons — [biSystemMenu];

{ set the form’s width

Рождение, жизнь и гибель формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Павел

(Перевод одноимённой статьи с сайта delphi.about.com)

В Windows основной элемент пользовательского интерфейса — форма. В Delphi каждый проект имеет по крайней мере одно окно — главное окно приложения. Все окна в Delphi основаны на объекте TForm. В данной статье мы рассмотрим основные события учавствующие в «жизни формы».

Форма

Формы имеют свои свойства, события и методы, при помощи которых Вы можете управлять видом и поведением формы. Форма, это обычный компонент Delphi, но в отличие от других, её нет на панели компонентов. Обычно форма создаётся при создании нового проекта (File | New Application). Вновь созданная форма будет главной формой приложения.

Дополнительные формы в проекте создаются через File | New Form. Так же существуют и другие способы создания форм, но здесь мы не будем рассматривать их…

Как и любой другой компонент (объект) форма имеет свои методы и реагирует на события. Давайте рассмотрим некоторые из этих событий…

Рождение

OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint …

OnCreate

Событие OnCreate возникает при создании TForm и только один раз. При создании формы (у каторой свойство Visible установлено в True), события произойдут в следующем порядке: OnCreate, OnShow, OnActivate, OnPaint. В обработчике события OnCreate можно сделать какие-либо инициализационные действия, однако, любые объекты созданные в OnCreate будут уничтожены в событии OnDestroy.

OnShow

Это событие генерируется, когда форма станет видимой. OnShow вызывается сразу перед тем, как форма станет видимой. Это событие случается, если установить свойство формы Visible в True, либо при вызове методов Show или ShowModal.

OnActivate

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

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

Жизнь

Когда форма создана и все её элементы ждут своих событий, чтобы обрабатывать их, жизнь формы продолжается до тех пор, пока кто-нибудь не нажмёт крестик в верхнем правом углу формы!

Уничтожение

При уничтожении формы, события генерируются в следующем порядке:

… OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy

OnCloseQuery

Если мы попытаемся закрыть форму при помощи метода Close либо другим доступным способом (Alt F4 либо через системное меню), то сгенерируется событие OnCloseQuery. Таким образом, это событие можно использовать, чтобы предотвратить закрытие формы. Обычно, событие OnCloseQuery используется для того, чтобы спросить пользователя — уверен ли он (возможно в приложении остались несохранённые данные).

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

if MessageDlg(‘Really close this window?’, mtConfirmation,

[mbOk, mbCancel], 0) = mrCancel then

CanClose := False;

end;

Обработчик события OnCloseQuery содержит переменную CanClose, которая определяет, можно ли форме закрыться. Изначальное значение этой переменной True. Однако в обработчике OnCloseQuery можно установить возвращаемое значение CloseQuery в False, чтобы прервать выполнение метода Close.

OnClose

Если OnCloseQuery вернул CanClose=True (что указывает на то, что форма должна быть закрыта), то будет будет сгенерировано событие OnClose. Событие OnClose даёт последний шанс, чтобы предотвратить закрытие формы. Обработчик OnClose имеет параметр Action со следующими четырьмя возможными значениями: caNone. Форме не разрешено закрыться. Всё равно, что мы установим CanClose в False в OnCloseQuery. caHide. Вместо закрытия, форма будет скрыта. caFree. Форма будет закрыта, и занятые ей ресурсы будут освобождены. caMinimize. Вместо закрытия, форма будет минимизирована. Это значение устанавливается поумолчанию у дочерних форм MDI.

Замечание: Когда пользователь шутдаунит Windows, то будет вызвано OnCloseQuery, а не OnClose. Если Вы не хотите, чтобы Windows завершила свою работу, то поместите свой код в обработчик события OnCloseQuery, хотя CanClose=False не сделает, того, что сделано здесь.

OnDestroy

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

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

{/codecitation}

Режимы разрешения для формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Steve

Я сделал довольно полный набор тестов, результаты которого показаны ниже:

режим показа формы

режим создания формы ————————-

——————— 640S 1024S 1024L

640S,s OK OK B

640S,u OK OK C

1024S,s OK OK B

1024S,u OK OK C

1024L,s A A OK

1024L,u OK OK OK

расшифровка:

640 -> 640x480x256

1024 -> 1024x768x256

S/L -> маленькие/большие шрифты

s/u -> Scaled := True/False

OK: вид выводимой формы такой же, как и во время ее

разработки

A: форма увеличивается относительно управляющих координат

B: форма сокращается относительно управляющих координат

C: форма и элементы управления слишком малы для текста

Вывод после проведенных экспериментов: для того, чтобы вероятность появления формы в том же виде, что она была при проектировании была высока, разработка ее дизайна должна производиться в системе с установленными большими шрифтами и со свойством формы Scaled := False.

{/codecitation}

Разукрасить свою форму

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Рудный Артем

Не самый рациональный, но один из самых простых способов разукрасить свою форму. В событии формы onPoint напишем следующее:

procedure TForm1.FormPaint(Sender: TObject);

var

i, j: Longint;

begin

with Canvas do

for i := 1 to Width do // для всех точек Формы по горизонтали

begin

Application.ProcessMessages;

for j := 1 to Height do // для каждой точки Формы по вертикали

Pixels[i, j] := random(9999); // задаём случайный цвет пиксела

end;

// получится мраморное окно

end;

// Теперь можно поэкспериментировать с цветом пикселей:

// Для этого выражение random(9999)заменим на другие к примеру

J * i

Sqr(i j)

Round(Sqr(i j) / Pi)

// Здесь можно издеваться как фантазия позволит!!!.

{/codecitation}

Просмотреть текст формы из запущенной программы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

procedure TForm1.Button1Click(Sender: TObject);

var

rs: TResourceStream;

ms: TMemoryStream;

begin

rs := TResourceStream.Create(HInstance, ClassName, RT_RCDATA);

try

ms := TMemoryStream.Create;

try

ObjectBinaryToText(rs, ms);

ms.Seek(0, 0);

memo1.Lines.LoadFromStream(ms);

finally

ms.Free;

end;

finally

rs.Free;

end;

end;

{/codecitation}

Просмотреть текст формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

unit FRForm;

interface

uses

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

ExtCtrls, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Panel1: TPanel;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

ResStr: TResourceStream;

MemStr: TMemoryStream;

begin

ResStr := TResourceStream.Create(

hInstance, ‘TFORM1’, RT_RCDATA);

try

MemStr := TMemoryStream.Create;

ResStr.Position := 0;

ObjectBinaryToText (ResStr, MemStr);

MemStr.Position := 0;

Memo1.Lines.LoadFromStream (

MemStr);

finally

ResStr.Free

end;

end;

end.

Загрузить весь проект

{/codecitation}

Проверить, содержит ли окно набор Unicode символов

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

The IsWindowUnicode function

determines whether the specified window is a native Unicode window

The character set of a window is determined by the use of the RegisterClass function.

If the window class was registered with the ANSI version of RegisterClass (RegisterClassA),

the character set of the window is ANSI. If the window class was registered with the Unicode

version of RegisterClass (RegisterClassW), the character set of the window is Unicode.

The system does automatic two-way translation (Unicode to ANSI) for window messages.

For example, if an ANSI window message is sent to a window that uses the Unicode character set,

the system translates that message into a Unicode message before calling the window procedure.

The system calls IsWindowUnicode to determine whether to translate the message.

}

procedure TForm1.Button1Click(Sender: TObject);

begin

{determine if the window is a Unicode window}

if (IsWindowUnicode(Form1.Handle)) then

Button1.Caption := ‘This window is a Unicode window’

else

Button1.Caption := ‘This window is not a Unicode window’

end;

{/codecitation}

Пример EnumWindows

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Paul Powers (Borland)

Создайте форму и разместите на ней два компонента ListBox.

Скопируйте код, показанный ниже.

Запустите SysEdit.

Запустите форму Delphi. Первый ListBox должен содержать список всех запущенных приложений. Дважды щелкните на SysEdit и нижний ListBox покажет дочернее MDI-окно программы SysEdit.

unit Wintask1;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

ListBox1: TListBox;

ListBox2: TListBox;

procedure FormCreate(Sender: TObject);

procedure ListBox1DblClick(Sender: TObject);

private

function enumListOfTasks(hWindow: hWnd): Bool; export;

function enumListOfChildTasks(hWindow: hWnd): Bool; export;

end;

THoldhWnd = class(TObject)

private

public

hWindow: hWnd;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

enumWindows(@TForm1.EnumListOfTasks, Longint(Self));

if (ListBox1.Items.Count > 0) then

ListBox1.ItemIndex := 0;

end;

function TForm1.enumListOfTasks(hWindow: hWnd): Bool;

var

HoldString: PChar;

WindowStyle: Longint;

IsAChild: Word;

HoldhWnd: THoldhWnd;

begin

GetMem(HoldString, 256);

HoldhWnd := THoldhWnd.Create;

HoldhWnd.hWindow := hWindow;

WindowStyle := GetWindowLong(hWindow, GWL_STYLE);

WindowStyle := WindowStyle and Longint(WS_VISIBLE);

IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);

{Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }

if (GetWindowText(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox1.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))

else if (GetClassName(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox1.Items.AddObject(Concat(»),

TObject(HoldhWnd));

FreeMem(HoldString, 256);

HoldhWnd := nil;

Result := TRUE;

end;

function TForm1.enumListOfChildTasks(hWindow: hWnd): Bool;

var

HoldString: PChar;

WindowStyle: Longint;

IsAChild: Word;

HoldhWnd: THoldhWnd;

begin

GetMem(HoldString, 256);

HoldhWnd := THoldhWnd.Create;

HoldhWnd.hWindow := hWindow;

WindowStyle := GetWindowLong(hWindow, GWL_STYLE);

WindowStyle := WindowStyle and Longint(WS_VISIBLE);

IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);

{Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }

if (GetWindowText(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild Word(nil)) then

ListBox2.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))

else if (GetClassName(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox2.Items.AddObject(Concat(»),

TObject(HoldhWnd));

FreeMem(HoldString, 256);

HoldhWnd := nil;

Result := TRUE;

end;

procedure TForm1.ListBox1DblClick(Sender: TObject);

begin

enumChildWindows(THoldhWnd(ListBox1.Items.Objects[ListBox1.ItemIndex]).hWindow,

@TForm1.enumListOfChildTasks, Longint(Self));

ListBox2.RePaint;

end;

end.

{/codecitation}

Последовательность событий жизненного цикла формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

These Events occur at least during the life cycle of a form:

Diese Ereignisse treffen wдhrend des Lebens-Zyklus einer Form mindestens ein:

OnCreate

OnShow

OnPaint

OnActivate

OnResize

OnPaint

OnCloseQuery

OnClose

OnDeactivate

OnHide

OnDestroy

{/codecitation}

Получить позицию активного окна

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

procedure TForm1.Button1Click(Sender: TObject);

var

hWindow: HWnd;

r: TRect;

begin

hWindow := GetForegroundWindow;

GetWindowRect(hWindow, r);

Memo1.Clear;

with Memo1.Lines do

begin

Add(‘Top : ‘ IntToStr(r.Top));

Add(‘Left : ‘ IntToStr(r.Left));

Add(‘Bottom: ‘ IntToStr(r.Bottom));

Add(‘Right : ‘ IntToStr(r.Right));

end;

end;

{/codecitation}