Tema: Eventos
Ver Mensaje Individual
  #8  
Antiguo 26-03-2009
Nove bb net Nove bb net is offline
Registrado
 
Registrado: mar 2009
Posts: 8
Reputación: 0
Nove bb net Va por buen camino
Eventos

Ahora ya si que necesito toda la ayuda.

hasta ahora el panelcentrable, estaba tomando forma, y de hecho, ha tomado bastante color, pero, siempre existe el pero, ahora, cuando el usuario, una vez iniciada la aplciacion, cambia el evento OnCanResize del form en el que se ha colocado el panelcentrable, y hasta tanto en cuando que el panel no necesita pintarse de nuevo, se comporta erraticamente, vamos que no se centra.

Alguien tiene una idea de como evitar ese comportamiento temporaldel panel, hasta que se vuelve a Paint.

Este es el codigo de todo lo hecho.

Lo he separado en una unidad totalmente utilizable, salvo por el detalle antes mencionado.

Gracias.
Nove

Código Delphi [-]
unit Customcentrablepanel1;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls, buttons, comctrls, stdctrls,
  dialogs, forms, types;

type
  TCustomcentrablepanel1 = class(TCustomPanel)
  private
    { Private declarations }
    misterx:tcontrol;
    argoointer;
    finiciado:boolean;
    foncanresizedelform:controls.TcanresizeEvent;
    //Gracias a Lepe
    TAutoCenter:boolean;
    procedure setAutocenter(valor:boolean);

    procedure setalign(valor:talign);
    function getalign:talign;

    procedure centrar;
    procedure canresizecompo(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);

  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor create(aowner:tcomponent); override;
    procedure paint; override;
    property AutoCenter:Boolean read TAutoCenter write setAutoCenter default True;
    property Align:Talign read getalign write setalign default alnone;
    { Published declarations }
    published
  end;

  Tcentrablepanel=class(tcustomcentrablepanel1)
  public
    property DockManager;
  published
    property Align;
    property Alignment;
    property Anchors;
    property AutoCenter;
    property AutoSize;
    property BevelInner;
    property BevelOuter;
    property BevelWidth;
    property BiDiMode;
    property BorderWidth;
    property BorderStyle;
    property Caption;
    property Color;
    property Constraints;
    property Ctl3D;
    property UseDockManager default True;
    property DockSite;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property FullRepaint;
    property Font;
    property Locked;
    property ParentBiDiMode;
    property ParentBackground;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Visible;
    property OnCanResize;
    property OnClick;
    property OnConstrainedResize;
    property OnContextPopup;
    property OnDockDrop;
    property OnDockOver;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnGetSiteInfo;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnResize;
    property OnStartDock;
    property OnStartDrag;
    property OnUnDock;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [Tcentrablepanel]);
end;

constructor TCustomcentrablepanel1.create(aowner:tcomponent);
begin
  inherited create(aowner);
  finiciado:=false;
  //Gracias a Lepe
  tautocenter:=true;
end;

procedure TCustomcentrablepanel1.centrar;
begin
  top:=(self.parent.clientheight-height) div 2;
  left:=(self.Parent.ClientWidth-width) div 2;
end;

procedure TCustomcentrablepanel1.canresizecompo(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  if assigned(foncanresizedelform) then
    foncanresizedelform(sender,newwidth,newheight,resize);
  if tautocenter then
    centrar;
end;


procedure tcustomcentrablepanel1.paint;
var ac:^tmethod;
    af:^tmethod;
begin
  if not (csdesigning in componentstate) then
    if not finiciado then
      begin
          begin
            misterx:=self.Parent;
            while not(misterx is tform) do
              misterx:=misterx.Parent;
            if assigned(tform(misterx).OnCanResize) then
               foncanresizedelform:=tform(misterx).OnCanResize;
            tform(misterx).OnCanResize:=canresizecompo;
            af:=@@tform(misterx).oncanresize;
            argo:=af.code;
          end;
        finiciado:=true;
        centrar;
      end
      else
      begin
        ac:=@@tform(misterx).oncanresize;
        if ac.Code<>argo then
          begin
            if assigned(tform(misterx).OnCanResize) then
               foncanresizedelform:=tform(misterx).OnCanResize
               else
               foncanresizedelform:=nil;
            tform(misterx).OnCanResize:=canresizecompo;
            af:=@@tform(misterx).oncanresize;
            argo:=af.code;
            centrar;
          end;
    end;
  inherited;
end;

procedure tcustomcentrablepanel1.setAutocenter(valor:boolean);
begin
  if tautocenter<>valor then
    begin
      tautocenter:=valor;
      if tautocenter=true then
        align:=alnone;
      invalidate;
    end;
end;

function tcustomcentrablepanel1.getalign:talign;
begin
  result:=inherited align;
end;

procedure tcustomcentrablepanel1.setalign(valor:talign);
begin
  if valor<>inherited align then
    begin
      if tautocenter then
        inherited align:=alnone
        else
        inherited align:=valor;
    end;
end;

end.
Responder Con Cita