Ir para conteúdo
Fórum Script Brasil
  • 0

Movimentação de Panel


Bettega

Pergunta


Estou fazendo um programa para reservas de mesas de bailes.

Como a distribuição das mesas pode variar de um baile para outro, necessito alterar a disposições destas mesas (panels).

Para isso, estou utilizando duas formas :

1 ) Arrastar e soltar.

2 ) Abrir Edits para definir a posição.

 

No primeiro caso, utilizo as funções OnMouseDown, OnMouseMove e OnMouseUp.

Ao largar o Panel na posição desejada, os valores Left e Top deste panel são guardados em uma Tabela.

No segundo case, utilizo o OnClick, com duas Edits. Uma para o Left e outra para o Top.

 

As duas formas estão funcionando perfeitamente, porém eu estou repetindo as mesmas funções para as 150 mesas previstas.

1 ) Arrastar e soltar para o Panel1:

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  mexendo := True;
  SetCapture ( panel1.Handle );
  GetCursorPos ( Pos_Antiga );
end ;


procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
var
Pos_Nova: TPoint;
mLeft : String ;
mTop  : String ;
begin
  if mexendo then
    begin
    GetCursorPos ( pos_Nova );
    Screen.Cursor := crSize;
    panel1.Left := panel1.Left - Pos_Antiga.X + Pos_Nova.X ;
    panel1.Top  := panel1.Top  - Pos_Antiga.Y + Pos_Nova.Y ;
    Pos_Antiga := Pos_Nova;
  end;
end;


procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
  if mexendo then
    begin
    Screen.Cursor := crDefault;
    ReleaseCapture;
    mexendo := False;
  end;
end;


2 ) Abrir Edits para definir a posição.

procedure TF_Alt_Posic.Panel1Click(Sender: TObject);
begin
  Ed_Esq .Text := IntToStr ( panel1.Left ) ;
  Ed_Topo.Text := IntToStr ( panel1.Top  ) ;
end;


procedure TF_Alt_Posic.BitBtn1Click(Sender: TObject);
begin
  panel1.Left := StrToInt ( Ed_Esq .Text ) ;
  panel1.Top  := StrToInt ( Ed_Topo.Text ) ;
end;

 

Como posso fazer para não ter que repetir essas rotinas 150 vezes ?

 

Obrigado,

Bettega.

 

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Como a distribuição das mesas pode variar de um baile para outro, necessito alterar a disposições destas mesas (panels).

o que voce quer dizer quando diz: alterar disposições destas mesas ?

alterar em que sentido ( horizontal, vertical ...etc ) ...em relação ao seu Form ?

Como posso fazer para não ter que repetir essas rotinas 150 vezes ?

se voce tem que arrastar e soltar, como não quer ter que repetir as rotinas ( esta querendo algo automatico  ? )

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Preciso alterar a posicao ( Localização ) dos panels dentro do form.

Para não ter que executar as rotinas MouseDown, MouseMove e MouseUp para cada panel ( tenho 150 panels ), eu necessito que ao pressionar o botão do mouse, o Setcapture do MouseDown saiba qual é o panel que eu estou pegando. O PanelMove substitua o Panel1.Left e o Panel1.Top pelo panel que está sendo movimentado. Acabei de ver que o MouseUp pode ser o mesmo para todos, pois não contém o componente panel nos seus comando.

Obrigado.

 

Link para o comentário
Compartilhar em outros sites

  • 0

bom...pelo que eu entendi, voce não quer ter que repetir as rotinas para cada panel ... seria isso ?

voce pode marcar todos os panels e na propriedade MouseUp ou outra que queira, voce pode colocar a propriedade de outro componente ... assim quando voce clicar em um outro panel, a execução do código estará em apenas 1 deles.

se não for isso, favor colocar uma imagem do seu Form para que eu possa ter uma noção de como ajudá-lo.

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

É exatamente isso.

Agora, por exemplo, no onMouseDown, o programa executa a rotina SetCapture ( panel1.Handle ).

Se eu estiver no panel2 como faço para que o SetCapture utilize os dados do Panel2, e não os do Panel1 ?

Na rotina onMouseUp , coloquei somente o Panel1MouseUp para todos, visto que o panel não é citado dentro da rotina. A minha dúvida é como fazer para que as rotinas que pegam os dados do panel, saibam qual o panel que está sendo pressionado.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

A minha dúvida é como fazer para que as rotinas que pegam os dados do panel, saibam qual o panel que está sendo pressionado.

Veja as modificações no código

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Ed_Esq: TEdit;
    Ed_Topo: TEdit;
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure showname(Sender: TObject);
    procedure verifica(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     comp, s  : string;
  end;

var
  Form1: TForm1;
  mexendo : boolean;
  Pos_Antiga: TPoint;


implementation

{$R *.dfm}
procedure TForm1.showname(Sender: TObject);
begin
   comp := (sender.classname + '/' + (sender as TComponent).name) ;
   s := comp;
   verifica(Sender);
   showmessage(s);

end;

procedure  TForm1.verifica(Sender: TObject);
var  i : integer; nome : string;
begin
     
     for i := 0 to ComponentCount -1 do
       begin
         nome := '';
         if Components[i] is TPanel then
            nome := sender.classname + '/' + TPanel(Components[i]).name;

         if nome = s then
            begin
               //mexendo := True;
               SetCapture (  TPanel(Components[i]).handle);
               GetCursorPos ( Pos_Antiga );

               Ed_Esq.Text := IntToStr ( TPanel(Components[i]).Left ) ;
               Ed_Topo.Text := IntToStr ( TPanel(Components[i]).Top ) ;

            end;
      end;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
   Pos_Nova: TPoint;
   mLeft : String ;
   mTop  : String ;
begin
  if mexendo then
    begin
    GetCursorPos ( pos_Nova );
    Screen.Cursor := crSize;
    panel1.Left := panel1.Left - Pos_Antiga.X + Pos_Nova.X ;
    panel1.Top  := panel1.Top  - Pos_Antiga.Y + Pos_Nova.Y ;
    Pos_Antiga := Pos_Nova;
  end;
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if mexendo then
    begin
    Screen.Cursor := crDefault;
    ReleaseCapture;
    mexendo := False;
  end;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
   showname(sender);
end;

end.

OBS: Fiz uma ligeira mudança no seu código, para te mostrar como voce pode saber qual Panel está sendo pressionado.

A procedure showname, voce vai colocar no Evento OnClick de cada Panel

basta marcar todos os Panels e na propriedade OnClick ( Object Inspector ) voce  coloca showname

Quando voce clicar com o mouse em qualquer Panel , vai aparecer uma mensagem com o nome do Panel que voce clicou

A procedure Verifica , vai verificar qual Panel foi clicado e o comando setcapture vai capturar o handle daquele Panel e exibir as posições de Left e Top nos respectivos edits.

Se voce entendeu a lógica,  basta voce modificar o código para o seu uso

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, obrigado pela sua dica.

A idéia é exatamente esta.

Testei a rotina que você me passou, e funcionou perfeitamente na captura dos dados para as edits, porém não consegui arrastar os panels com o mouse.

Vou fazer mais alguns testes, e aviso se consegui fazer funcionar.

Vou fazer uma pausa para terminar o programa que é urgente, e depois volto para testar estas rotinas.

Por enquanto, obrigado.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...