Bettega Postado Julho 12, 2018 Denunciar Share Postado Julho 12, 2018 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Julho 13, 2018 Denunciar Share Postado Julho 13, 2018 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 ? ) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bettega Postado Julho 15, 2018 Autor Denunciar Share Postado Julho 15, 2018 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Julho 15, 2018 Denunciar Share Postado Julho 15, 2018 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bettega Postado Julho 16, 2018 Autor Denunciar Share Postado Julho 16, 2018 É 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Julho 16, 2018 Denunciar Share Postado Julho 16, 2018 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bettega Postado Julho 18, 2018 Autor Denunciar Share Postado Julho 18, 2018 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Bettega
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
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.