Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 88 89 90 91 92 93 94 95 96 ... 123

Если это кнопка Previous, добавьте: ModalResult := mrPrevious;

Как заставить формы минимизироваться на панель задач с анимацией?

Nomadic советует:

Дело-то вот в чем: Главным окном программы дельфийской является не главная форма, а окно TApplication, которое имеет нулевые размеры, поэтому его не видно. Именно для него показывается иконка на панели задач. Когда пользователь нажимает кнопку минимизации на главной форме, команда минимизации передается этому окну, и сворачивается именно оно, а для остальных просто делается hide. А так как окно TApplication имеет нулевые размеры, то и анимации никакой не видно.

А чтобы этого избежать, необходимо:

В исходном тесте модуля проекта после вызова Application.Initialize выполнить вызов

// В исходном тесте модуля проекта после вызова Application.Initialize

SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

В исходном тексте модуля главной формы перекрыть следующие методы –

// // В классе формы

// Интерфейс

protected

 procedure CreateParams(var p: TCreateParams); override;

 procedure WMSysCommand(var m: TMessage); message WM_SYSCOMMAND;

// Реализация

procedure TMainForm.CreateParams(var p: TCreateParams);

begin

 inherited;

 p.WndParent := 0;

end;

procedure TMainForm.WMSysCommand(var m: TMessage);

begin

 m.Result := DefWindowProc(Handle, m.Msg, m.wParam, m.lParam);

end;

Вместо SetWindowLong в MDI-приложениях лучше использовать

ShowWindow(Application.Handle, SW_HIDE);

Перемещение формы не за заголовок III

Ситников Митрий советует:

В следующем примере показано как можно передвигать форму если пользователь "захватил" Client-пространство:

unit Main;

interface

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm)

 Button1: TButton;

 procedure Button1Click(Sender: TObject);

 procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

private

 { Private declarations }

public

 { Public declarations }

end;

var

 Form1: TForm1;

 MX: integer;

 MY: integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

 Close;

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

 if Shift<>[ssLeft] then begin

  MX:=X;

  MY:=Y;

 end else begin

  Left:=Left+X-MX;

  Top:=Top+Y-MY;

 end;

end;

end.

Перемещение формы не за заголовок IV

Как мне переместить форму, не имеющую заголовка?

Выберите элемент управления (или саму форму) и напишите это в его (ее) обработчике события OnMouseDown (данный пример дан только для формы):

procedure TForm1.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. В следующем классе определена панель, которая сама изменяет свои размеры при щелчке в ее нижнем правом углу, и сама перемещается, если вы щелкнули по ней где-то еще.

Type TMovablePanel = Class(TPanel)

Private

 Procedure wmNCHitTest(Var Message : TWMNCHitTest); message WM_NCHITTEST;

Protected

 Procedure MouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : Integer); override;

End;

Procedure TMovablePanel.wmNCHitTest(Var Message : TWMNCHitTest);

Begin

 With Message, ScreenToClient(Pos) Do

  If (X < Width - 10) And (Y < Height - 10) Then

   Message.Result := HTCAPTION

  Else Message.Result := HTCLIENT;

End;

Procedure TMovablePanel.MouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : Integer);

Begin

 If Button = mbLeft Then Begin

  ReleaseCapture;

  Perform(WM_SYSCOMMAND, SC_SIZE + HTBOTTOMRIGHT - 9, 0);

 End Else Inherited MouseDown(Button, SHift, X, Y);

End;

– Robert Wittig

Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования)?

Nomadic советует:

Кидаю проект-болванку, сделанную перед началом работы над основным -

unit Unit1; //базовая форма хранителя страницы

interface

uses ...

type TBPgFrm = class(TForm)

 Panel1: TPanel;

 PageControl1: TPageControl;

 TabSheet1: TTabSheet;

 Label1: TLabel;

public

 function PgInit: boolean; virtual;

 function PgValid: boolean; virtual;

end;

implementation

{$R *.DFM}

function TBPgFrm.PgInit: boolean;

begin

 result:= MessageDlg(Label1.Caption+': PgInit', mtConfirmation, mbOkCancel, 0)=mrOK;

end;

function TBPgFrm.PgValid: boolean;

begin

 result:= MessageDlg(Label1.Caption+': PgValid', mtConfirmation, mbOkCancel, 0)=mrOK;

end;

end.

unit Unit2; //главная форма проекта; содержит первую страницу

interface //и кнопки Cancel, Prev & Next/Finish.

uses ...

type TPagesDlg = class(TForm)

 Panel1: TPanel;

 Panel2: TPanel;

 PageControl1: TPageControl;

 TabSheet1: TTabSheet;

 Prev: TButton;

 CancelBtn: TButton;

 Next: TButton;

 Label1: TLabel;

 procedure CancelBtnClick(Sender: TObject);

 procedure FormDestroy(Sender: TObject);

 procedure NextClick(Sender: TObject);

 procedure PrevClick(Sender: TObject);

 privateFrms: TList;

 procedure AddForms;

end;

var PagesDlg: TPagesDlg;

implementation

uses Unit1, Unit3, Unit4, Unit5;

{$R *.DFM}

procedure TPagesDlg.AddForms; //размещение динамических страниц

var i: word;

begin

 Frms:= TList.Create;

 Frms.Add(TBPgFrm1.Create(Self));

 Frms.Add(TBPgFrm2.Create(Self));

 for i:= 0 to 1 do TBPgFrm(Frms[i]).TabSheet1.PageControl := PageControl1

end;

procedure TPagesDlg.CancelBtnClick(Sender: TObject);

begin

 Close;

end;

procedure TPagesDlg.FormDestroy(Sender: TObject);

var i: word;

begin

 for i:= Frms.Count-1 downto 0 do TBPgFrm(Frms[i]).Free;

 Frms.Free;

end;

procedure TPagesDlg.NextClick(Sender: TObject);

var

 i: word;

 vi: Boolean;

begin

 Next.Enabled:= false;

 if PageControl1.PageCount=1 then AddForms;

 i:= PageControl1.ActivePage.PageIndex;

 if i=0 then vi:= true

 else vi:= TBPgFrm(Frms[i-1]).PgValid;

 if vi then

  with PageControl1 do

  if i=PageCount-1 then begin

   CancelBtnClick(Sender);

   exit;

1 ... 88 89 90 91 92 93 94 95 96 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий