Jump to content


Photo

Form Que Arastaveis Por Qualquer Ponto


  • Faça o login para participar
2 replies to this topic

#1 proteus_adi

proteus_adi

    @handle:=proteus;//>>>

  • Usuários
  • 309 posts
  • Sexo:Não informado
  • Localidade:Minas Gerais>> Belo Horizonte
  • Interesses:Programação e Web>>>

Posted 02/07/2004, 09:14

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure WMNChitTest(var M: TWMNchitTest);
message WM_NCHITTEST;
{ Public declarations }
end;



var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMNchitTest(var M:TWMNChitTest);
begin
inherited;
if M.result = htclient then
M.result := htCaption;
end;
end.
PROTEUS [ADSUMUS]
ETERNAL ########
---------------------------------------------------------------
"Já dizia o mestre: PROGRAMAR é diferente de CODIFICAR"...

#2 DeLorean

DeLorean

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Não informado
  • Localidade:São Paulo/SP
  • Interesses:Webdesign e outros (tô com preguiça agora... XD)

Posted 02/07/2004, 21:21

A forma acima apresenta várias limitações, como não mostrar um menu de contexto ao clicar com o botão direito e somente move o formulário quando arrasta por uma área livre dele. Como se não bastasse isso, ele usa as mensagens do Windows, que são muito complexas.

O código a seguir utiliza somente eventos padrões do Delphi, tornando-o compreensível até mesmo para os mais iniciantes na linguagem.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DateUtils, Menus;

type
  TForm1 = class(TForm1)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BotaoPressionado : Boolean;
  OrigemX, OrigemY : Integer;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  IF ( Button = mbLeft ) THEN
    BotaoPressionado := True;
  OrigemX := X;
  OrigemY := Y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  BotaoPressionado := False;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  IF BotaoPressionado THEN
  BEGIN
    Left := Left - ( OrigemX - X );
    Top  := Top  - ( OrigemY - Y );
  END;
end;

end.


Não se esqueça de ajustar os eventos do Form1 no Object Inspector da seguinte maneira:

OnMouseDown: FormMouseDown
OnMouseMove: FormMouseMove
OnMouseUp: FormMouseUp

E se você tiver outros componentes no formulário que você deseja que permitem arrastar o formulário na tela ao clicar e arrastar o mouse neles (como um TPanel ou qualquer outro por exemplo), é só definir os eventos no Object Inspector da mesma forma que no formulário.

Se alguém não entender o que está escrito ou eu não tiver sido muito claro, é só me perguntar, ok?
webmaster do site
http://www.fanworks.kit.net/

#3 proteus_adi

proteus_adi

    @handle:=proteus;//>>>

  • Usuários
  • 309 posts
  • Sexo:Não informado
  • Localidade:Minas Gerais>> Belo Horizonte
  • Interesses:Programação e Web>>>

Posted 05/07/2004, 08:25

boa! (y) boa!
PROTEUS [ADSUMUS]
ETERNAL ########
---------------------------------------------------------------
"Já dizia o mestre: PROGRAMAR é diferente de CODIFICAR"...




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq