Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Mover TSpeedButton en Runtime (https://www.clubdelphi.com/foros/showthread.php?t=82787)

juank1971 13-04-2013 19:37:41

Mover TSpeedButton en Runtime
 
Amigos se que este tema esta agotado para mover componentes en runtime, y hay algunos ejemplos en clubdelphi, ya he ebuscado bastante eso, pero no me funciona con el componente
TSpeedButton , necesito que sea ese componente porque ya tengo todo para el y he programado muchas cosas, pensé que la rutina de moverlo en corrida era igual que los demás y deje eso para ultimo y ahora cuando pruebo funciona, no hace nada, con un tbutton si, pero no en los TSpeedButton .

Pensé que era por tenerlo dentro de Tcontrol de esta forma
Código Delphi [-]
tcontrol( SpeedButton1).Perform(WM_SYSCOMMAND, $F012, 0);

y lo puse

Código Delphi [-]
SpeedButton1.Perform(WM_SYSCOMMAND, $F012, 0);

y de esta manera no hace nada tampoco, esto lo pruebo con cualquier otro componente y funciona perfecto. Alguna idea.


Código Delphi [-]
procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ReleaseCapture;
 tcontrol( SpeedButton1).Perform(WM_SYSCOMMAND, $F012, 0);
end;

ecfisa 13-04-2013 20:44:11

Hola juank1971.
Cita:

Empezado por juank1971 (Mensaje 458545)
esto lo pruebo con cualquier otro componente y funciona perfecto. Alguna idea.

Si, en realidad la segunda línea de tu código tendría que poder escribirse como:
Código Delphi [-]
  SendMessage(SpeedButton1.Handle, WM_SYSCOMMAND, $F012, 0);
Y aquí esta el problema... Por que TSpeedButton deriva de TGraphicControl y no de TWinControl que implementa la propiedad Handle. Vas a tener que programar un poco para lograr el efecto que buscas.

Te pongo un ejemplo, no muy elaborado, como para darte una idea de como podrías encararlo:
Código Delphi [-]
...
implementation

var
  MoveOn: Boolean = False;

procedure TForm1.SpeedButton1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then  // tecla Ctrl  presionada
    MoveOn:= True;
end;

procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if MoveOn then
  begin
    SpeedButton1.Left := ScreenToClient(Mouse.CursorPos).X;
    SpeedButton1.Top  := ScreenToClient(Mouse.CursorPos).Y;
  end;
end;

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

Saludos.

ecfisa 13-04-2013 21:33:10

Hola de nuevo.

Es una zoncera, pero se me olvidó mencionar que si quisieras utilizar el código para varios SpeedButtons, solo tenés que hacer un pequeño cambio en el evento OnMouseMove:
Código Delphi [-]
procedure TForm1.SpeedButtonMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if MoveOn then
  begin
    TSpeedButton(Sender).Left := ScreenToClient(Mouse.CursorPos).X;
    TSpeedButton(Sender).Top  := ScreenToClient(Mouse.CursorPos).Y;
  end;
end;
Y asignar los eventos a los TSpeedButtons que desees.

Saludos.

juank1971 13-04-2013 22:08:33

ok lo estoy probando , gracias por tu respuesta.

como decía mi abuelo salud y pesetas.

escafandra 15-04-2013 00:45:42

Como apunta ecfisa un TSpeedButton no es una ventana por lo que no tiene Handle. No se le pueden enviar mensajes de Windows (WM_XXX)

El movimiento lo debes hacer manual, como te indica ecfisa. Yo propongo el siguiente código simple:

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    OldPoint: TPoint;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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

procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if (ssLeft in Shift) and (ssCtrl in Shift) then
  begin
    SpeedButton1.Left:= SpeedButton1.Left +  X - OldPoint.X;
    SpeedButton1.Top:= SpeedButton1.Top + Y - OldPoint.Y;
  end;
end;

end.


Saludos.


La franja horaria es GMT +2. Ahora son las 14:39:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi