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
misterx:tcontrol;
argoointer;
finiciado:boolean;
foncanresizedelform:controls.TcanresizeEvent;
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
public
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
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;
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.