Mudar tamanho do TPanel no arrastar do mouse
Mudar tamanho do TPanel no arrastar do mouse? como é feito na coluna do dbgrid, onde vc clica com o mouse e arrasta o tamanha da coluna aumenta
Victor Mendes
Curtidas 0
Respostas
Natanael Ferreira
08/07/2016
Utilize o componente [b]Splitter[/b] da aba Standard.
Para ver o seu funcionamento:
- Solte um Panel e mande alinhar a esquerda,
- Um Splitter
- E outro Panel com alinhamento Client.
Basta executar, passar o mouse sobre o mesmo para ver o funcionamento.
Para ver o seu funcionamento:
- Solte um Panel e mande alinhar a esquerda,
- Um Splitter
- E outro Panel com alinhamento Client.
Basta executar, passar o mouse sobre o mesmo para ver o funcionamento.
GOSTEI 0
Victor Mendes
08/07/2016
Deu certo Natanael ! Era isso mesmo
GOSTEI 0
Paulo Bornhiati
08/07/2016
Reativando esta postagem depois de alguns anos.
Como procurei e não encontrei nada que possibilitasse aumentar ou diminuir o Panel em tempo de execução sem usar o splitter, acabei fazendo o meu.
Como pretendia fazer para outros componentes, TImage por exemplo, criei uma nova procedure MouseMove e chamo ela de cada um dos componentes que pretendo permitir a alteração.
Para funcionar, crie duas variáveis globais, x_ant ey_ant do tipo Integer, estas variáveis serão usadas para determinar se o mouse foi movido acima ou abaixo, apenas para referência (se alguém tiver ideia melhor aceito sugestões).
O funcionamento é simples, posicione o mouse próximo ao canto superior direito e pressione e mantenha pressionado o ctrl e mova o mouse.
Na mesma procedure, consigo controlar o posicionamento da TLabel, TImage ou TPanel, podendo mover na tela.
Eu salvo as informações em um INI, e recupero sempre que necessário reiniciar a aplicação, mantendo assim o tamanho e posições deixadas anteriormente.
Espero que ajude mais alguém que sofreu assim como eu para conseguir algo.
var x_ant,y_ant:Integer;
procedure TForm1.MouseMove2(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var Pos: TPoint;
begin
if (Sender is Tpanel) and (ssCtrl in Shift) then
begin
Pos := TPanel(Sender).ScreenToClient(Mouse.CursorPos);
if x_ant<Mouse.CursorPos.X then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
TPanel(Sender).Width:=TPanel(Sender).Width+1;
if (x_ant>Mouse.CursorPos.X) then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
TPanel(Sender).Width:=TPanel(Sender).Width-1;
if y_ant<Mouse.CursorPos.Y then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
begin
TPanel(Sender).top:=TPanel(Sender).top+1;
TPanel(Sender).Height:=TPanel(Sender).Height-1;
end;
if (y_ant>Mouse.CursorPos.Y) then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
begin
TPanel(Sender).top:=TPanel(Sender).top-1;
TPanel(Sender).Height:=TPanel(Sender).Height+1;
end;
end
else
begin
lbl1.caption := IntToStr(Mouse.CursorPos.X);
lbl2.caption := IntToStr(Mouse.CursorPos.Y);
if Sender is TLabel then
begin
TLabel(Sender).Top := TLabel(Sender).Top + Y - PosMouseY;
TLabel(Sender).Left:= TLabel(Sender).Left + X - PosMouseX;
end
else if Sender is TPanel then
begin
TPanel(Sender).Top := TPanel(Sender).Top + Y - PosMouseY;
TPanel(Sender).Left:= TPanel(Sender).Left + X - PosMouseX;
end else if Sender is TImage then
begin
TImage(Sender).Top := TImage(Sender).Top + Y - PosMouseY;
TImage(Sender).Left:= TImage(Sender).Left + X - PosMouseX;
end
end;
x_ant:=Mouse.CursorPos.X;
y_ant:=Mouse.CursorPos.Y;
end;
Como procurei e não encontrei nada que possibilitasse aumentar ou diminuir o Panel em tempo de execução sem usar o splitter, acabei fazendo o meu.
Como pretendia fazer para outros componentes, TImage por exemplo, criei uma nova procedure MouseMove e chamo ela de cada um dos componentes que pretendo permitir a alteração.
Para funcionar, crie duas variáveis globais, x_ant ey_ant do tipo Integer, estas variáveis serão usadas para determinar se o mouse foi movido acima ou abaixo, apenas para referência (se alguém tiver ideia melhor aceito sugestões).
O funcionamento é simples, posicione o mouse próximo ao canto superior direito e pressione e mantenha pressionado o ctrl e mova o mouse.
Na mesma procedure, consigo controlar o posicionamento da TLabel, TImage ou TPanel, podendo mover na tela.
Eu salvo as informações em um INI, e recupero sempre que necessário reiniciar a aplicação, mantendo assim o tamanho e posições deixadas anteriormente.
Espero que ajude mais alguém que sofreu assim como eu para conseguir algo.
var x_ant,y_ant:Integer;
procedure TForm1.MouseMove2(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var Pos: TPoint;
begin
if (Sender is Tpanel) and (ssCtrl in Shift) then
begin
Pos := TPanel(Sender).ScreenToClient(Mouse.CursorPos);
if x_ant<Mouse.CursorPos.X then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
TPanel(Sender).Width:=TPanel(Sender).Width+1;
if (x_ant>Mouse.CursorPos.X) then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
TPanel(Sender).Width:=TPanel(Sender).Width-1;
if y_ant<Mouse.CursorPos.Y then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
begin
TPanel(Sender).top:=TPanel(Sender).top+1;
TPanel(Sender).Height:=TPanel(Sender).Height-1;
end;
if (y_ant>Mouse.CursorPos.Y) then
if ((Pos.X>=TPanel(Sender).Width-20) and (Pos.X<=TPanel(Sender).Width+20)) then
begin
TPanel(Sender).top:=TPanel(Sender).top-1;
TPanel(Sender).Height:=TPanel(Sender).Height+1;
end;
end
else
begin
lbl1.caption := IntToStr(Mouse.CursorPos.X);
lbl2.caption := IntToStr(Mouse.CursorPos.Y);
if Sender is TLabel then
begin
TLabel(Sender).Top := TLabel(Sender).Top + Y - PosMouseY;
TLabel(Sender).Left:= TLabel(Sender).Left + X - PosMouseX;
end
else if Sender is TPanel then
begin
TPanel(Sender).Top := TPanel(Sender).Top + Y - PosMouseY;
TPanel(Sender).Left:= TPanel(Sender).Left + X - PosMouseX;
end else if Sender is TImage then
begin
TImage(Sender).Top := TImage(Sender).Top + Y - PosMouseY;
TImage(Sender).Left:= TImage(Sender).Left + X - PosMouseX;
end
end;
x_ant:=Mouse.CursorPos.X;
y_ant:=Mouse.CursorPos.Y;
end;
GOSTEI 0
Arthur Heinrich
08/07/2016
Você pode tornar a funcionalidade mais natural, se não utilizar o Control, apenas controlando os eventos MouseDown, MouseMove e MouseUp:
type TForm1 = class(TForm) Panel1: TPanel; procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } ResizePanel : TPanel; ResizeStart, ResizeInitialSize : TPoint; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var P : TPanel; begin P:=(Sender as TPanel); if ((X>p.Width-10) and (Y>P.Height-10) and (Mouse.Capture>0)) then begin ResizePanel:=P; ResizeStart:=Point(X,Y); ResizeInitialSize:=Point(P.Width,P.Height); end; end; procedure TForm1.FormCreate(Sender: TObject); begin ResizePanel:=nil; end; procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Assigned(ResizePanel) then begin ResizePanel.Width:=ResizeInitialSize.x+X-ResizeStart.x; ResizePanel.Height:=ResizeInitialSize.y+Y-ResizeStart.y; end; end; procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; ResizePanel:=nil; end;
GOSTEI 0