Если это кнопка Previous, добавьте: ModalResult := mrPrevious;
Как заставить формы минимизироваться на панель задач с анимацией?
Nomadicсоветует:
Дело-то вот в чем: Главным окном программы дельфийской является не главная форма, а окно TApplication, которое имеет нулевые размеры, поэтому его не видно. Именно для него показывается иконка на панели задач. Когда пользователь нажимает кнопку минимизации на главной форме, команда минимизации передается этому окну, и сворачивается именно оно, а для остальных просто делается hide. А так как окно TApplication имеет нулевые размеры, то и анимации никакой не видно.
А чтобы этого избежать, необходимо:
В исходном тесте модуля проекта после вызова Application.Initialize выполнить вызов
// В исходном тесте модуля проекта после вызова Application.Initialize
SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) orWS_EX_TOOLWINDOW);
В исходном тексте модуля главной формы перекрыть следующие методы –
// // В классе формы
// Интерфейс
protected
procedure CreateParams( varp: TCreateParams); override;
procedureWMSysCommand( varm: TMessage); messageWM_SYSCOMMAND;
// Реализация
procedureTMainForm.CreateParams( varp: TCreateParams);
begin
inherited;
p.WndParent := 0;
end;
procedureTMainForm.WMSysCommand( varm: TMessage);
begin
m.Result := DefWindowProc(Handle, m.Msg, m.wParam, m.lParam);
end;
Вместо SetWindowLong в MDI-приложениях лучше использовать
ShowWindow(Application.Handle, SW_HIDE);
Перемещение формы не за заголовок III
Ситников Митрийсоветует:
В следующем примере показано как можно передвигать форму если пользователь "захватил" Client-пространство:
unitMain;
interface
usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
typeTForm1 = class(TForm)
Button1: TButton;
procedureButton1Click(Sender: TObject);
procedureFormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
MX: integer;
MY: integer;
implementation
{$R *.DFM}
procedureTForm1.Button1Click(Sender: TObject);
begin
Close;
end;
procedureTForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
ifShift<>[ssLeft] then begin
MX:=X;
MY:=Y;
end else begin
Left:=Left+X-MX;
Top:=Top+Y-MY;
end;
end;
end.
Перемещение формы не за заголовок IV
Как мне переместить форму, не имеющую заголовка?
Выберите элемент управления (или саму форму) и напишите это в его (ее) обработчике события OnMouseDown (данный пример дан только для формы):
procedureTForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_MOVE+2, 0);
end;
Классно! Намного проще метода NCHitTest, который я предлагал. Хотя многое из того, чтобы вы мне написали, я не понял. Для чего нужно прибавлять 2 к параметру SC_MOVE? В справке по API об этом ничего не сказано.
Ну хорошо, есть недокументированный способ сообщить Windows о необходимости перемещения окна таким же способом, что и с помощью заголовка (это может вызвать неадекватную реакцию системы, не делайте этого!). Другим способом перемещения окна является перекрытие WMNCHITTEST и возвращения им значения HTCAPTION. Тем не менее, обычно я предпочитаю пользоваться методом SC_MOVE+2, поскольку он не требует создания потомков, а только создание обработчика OnMouseDown. Отчасти аналогично, вы можете добавлять константы SC_SIZE к WM_SYSCOMMAND для получения размера окна подобно тому, как если бы вы потянули его за бордюрчик. В основном мы добавляем код hittest – 9. В следующем классе определена панель, которая сама изменяет свои размеры при щелчке в ее нижнем правом углу, и сама перемещается, если вы щелкнули по ней где-то еще.
TypeTMovablePanel = Class(TPanel)
Private
ProcedurewmNCHitTest( Var Message: TWMNCHitTest); messageWM_NCHITTEST;
Protected
ProcedureMouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : Integer); override;
End;
ProcedureTMovablePanel.wmNCHitTest( Var Message: TWMNCHitTest);
Читать дальше