Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   evento WMWindowPosChanging en TForm (https://www.clubdelphi.com/foros/showthread.php?t=55279)

pborges36 12-04-2008 05:38:10

evento WMWindowPosChanging en TForm
 
Holas. Necesito una ayuda. Estoy tratando de hacer un componente devirado de un TEdit, TKEdit, el cual, entre otras cosas, deberia habilitarme barras flotantes. Estuve viendo un ejemplo de nuestro amigo Neftali.

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
    procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
    procedure _MoveFW();
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses Unit2, Unit3, ShellAPI;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Visible := not Form2.Visible;
  Form3.Visible := not Form3.Visible;
  _MoveFW();
end;

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
  _MoveFW();
  inherited;
end;
procedure TForm1.Label2Click(Sender: TObject);
begin
    ShellExecute(Handle,
             'open',
             'http://neftali.clubdelphi.com/',
             nil,
             nil,
             SW_SHOW);
end;

procedure TForm1.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin
  _MoveFW();
  inherited;
end;
procedure TForm1._MoveFW;
begin
//  if (Self.ComponentState <> []) then begin
//    Exit;
//  end;
  if not Assigned(Form2) then begin
    Exit;
  end;
  if not Assigned(Form3) then begin
    Exit;
  end;
  if (Form2.Visible) then begin
    // Posicionar las barras
    Form2.Top := Self.Top - Form2.Height;
    Form2.Left := Self.Left;
  end;
  if (Form3.Visible) then begin
    // Posicionar las barras
    Form3.Top := Self.Top;
    Form3.Left := Self.LEft + Self.Width;
  end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
  _MoveFW();
end;
end.

Form2 y Form3 son las barras flotantes y este ejemplo funciona a la perfeccion.
¿Como hago para asignarle desde el TKEdit los procedures WMWindowPosChanging, WMNCLButtonDown y FormResize al TForm que lo contiene?

El TKEdit esta mas o menos asi.

Código Delphi [-]
unit UnitKEdit;
interface
uses
  SysUtils, Classes, Controls, StdCtrls, Messages, Forms;
type
  TKEditi = class(TEdit)
  private
    { Private declarations }
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
    procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
    procedure _MoveFW();
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;    {Constructor}
  published
    { Published declarations }
  end;
procedure Register;
implementation
uses Unitbarra_horizontal, Unitbarra_vertical, ShellAPI;
procedure Register;
begin
  RegisterComponents('customer', [TKEdit]);
end;

constructor TKEdit.Create(AOwner : TComponent);
begin
    inherited Create(AOwner);
    barra_vertical:=Tbarra_vertical.Create(self);
    barra_horizontal:=Tbarra_horizontal.Create(self);
    barra_vertical.Visible:=true;
    barra_horizontal.Visible:=true;
    try
    _MoveFW;
    except
    end;
end;
procedure TKEdit._MoveFW;
begin
  if not Assigned(barra_vertical) then begin
    Exit;
  end;
  if not Assigned(barra_horizontal) then begin
    Exit;
  end;
  if (barra_vertical.Visible) then begin
    // Posicionar las barras
    barra_vertical.Top := Self.Parent.Top - barra_vertical.Height;
    barra_vertical.Left := Self.Parent.Left;
  end;
  if (barra_horizontal.Visible) then begin
    // Posicionar las barras
    barra_horizontal.Top := Self.Parent.Top;
    barra_horizontal.Left := Self.Parent.LEft + Self.Parent.Width;
  end;
end;
procedure TKEdit.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
  _MoveFW();
  inherited;
end;
procedure TKEdit.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin
  _MoveFW();
  inherited;
end;
 
end.
Gracias!

Lepe 12-04-2008 10:52:31

No termino yo de comprender el asunto...

Digo yo que el TEdit estará en agún contenedor, es decir, dentro de un panel, de un form, etc. No creo que vayas a poner un TEdit que esté flotando él sólo, sin nada debajo ¿no?.

Dicho de otra Forma: El TEdit (o TKEdit) no tiene por qué enterarse que se ha movido la ventana donde está, porque a él, ¿qué le importa eso? ;).

Saludos

pborges36 12-04-2008 15:55:01

Cita:

Empezado por Lepe (Mensaje 279526)
... El TEdit (o TKEdit) no tiene por qué enterarse que se ha movido la ventana donde está, porque a él, ¿qué le importa eso? ;).

Hola lepe, gracias por responder. Efectivamente al TKEdit SI que le importa si su form ha cambiado de posicion.

Paso a explicar lo que quiero hacer: El TKEdit tendra una conexion a una base de datos, y me traera registros de una tabla segun el codigo que se haya escrito. En las barras flotantes estaran los procedimiento que trabajaran sobre ese registro: alta, baja o modificacion. Segun el caso me habilitara o no los botones de las barras. Entonces, si que el TKEdit necesita saber si su form contenedor se movio o no.
Espero se entienda y puedan ayudarme.

Saludos.

Al González 12-04-2008 21:17:16

¡Hola!

No son propiamente eventos sino "métodos mensaje", y no pueden ser asignados "procedimentalmente" como suele hacerse con los manejadores de eventos, ya que no hay una propiedad evento donde puedan almacenarse dichas rutinas.

Podrías usar herencia visual, colocando esos métodos mensaje en una plantilla base y de ella derivar todos los formularios que desees tengan ese comportamiento.

Espero te sea de ayuda.

Al González. :)

roman 12-04-2008 21:25:23

Cita:

Empezado por pborges36 (Mensaje 279549)
Paso a explicar lo que quiero hacer: El TKEdit tendra una conexion a una base de datos, y me traera registros de una tabla segun el codigo que se haya escrito. En las barras flotantes estaran los procedimiento que trabajaran sobre ese registro: alta, baja o modificacion. Segun el caso me habilitara o no los botones de las barras.

Pero, ¿qué tiene que ver la posición del Edit o del formulario que lo contenga con esto que describes? :confused:

// Saludos

Lepe 12-04-2008 21:58:58

Según he mirado con el Grep Search, el windowposchanging lo implementa la clase TCustomForm y TToolbar, el Tedit nop.

Mira, llevo con este mensaje dándole vueltas más de media hora, no entiendo lo que quieres hacer ni como funciona el tema.

Desde mi punto de vista, el Form que contiene el TkEdit debería tener un evento llamado por ejemplo OnMoving y el tkEdit un procedimiento llamado DoOnParentMoving. Cuando Creas el Form, asignas el evento OnMoving y dentro podrás poner:
Código Delphi [-]
procedure TForm1.FormMoving(Sender:TObject);
begin 
  tkedit1.doOnParentMoving;
end;

Tampoco entiendo el diseño, ¿Por qué un descendiente de TEdit puede crear dos barras flotantes?

Lo normal sería que un Form tuviese dos propiedades :
HasHorziontalBar:Boolean;
HasVerticalBar:Boolean;

Cuando se pone alguna en True, el propio Form crearía la barra adosada.

Y esto lo digo porque:
- ¿que ocurre si pones tu Tkedit sobre un panel del Form? las barras aparecerían ¡¡ sobre el panel !!
- no piensas usar Frames ¿verdad? porque estarías en las mismas.

Edito: En realidad llevo más de 40 minutos, porque Al no había contestado antes de empezar a escribir esto :D

Saludos

pborges36 13-04-2008 00:25:04

Cita:

Empezado por Lepe (Mensaje 279601)
...Tampoco entiendo el diseño, ¿Por qué un descendiente de TEdit puede crear dos barras flotantes?...

Cita:

Empezado por roman (Mensaje 279597)
Pero, ¿qué tiene que ver la posición del Edit o del formulario que lo contenga con esto que describes? :confused:

Tal parece estoy diseñando mal el componente o no supe explicarme. Pero en fin..
Cita:

Empezado por Al González (Mensaje 279596)
...No son propiamente eventos sino "métodos mensaje", y no pueden ser asignados "procedimentalmente"...
Podrías usar herencia visual, colocando esos métodos mensaje en una plantilla base y de ella derivar todos los formularios que desees tengan ese comportamiento.

Creo que voy a seguir tu consejo Al.

Gracias a todos por su tiempo, segun vaya avanzando en el tema les comentare.
Saludos..


La franja horaria es GMT +2. Ahora son las 18:27:35.

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