Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2009
Nove bb net Nove bb net is offline
Registrado
 
Registrado: mar 2009
Posts: 8
Poder: 0
Nove bb net Va por buen camino
Thumbs down Eventos

Estoy intentando mediante el uso de application.mainform, en la creacion de un componente, y cuando este en ejecucion, que no en diseño, almacenar, caso que este definido en el form, un evento, para poder ejecutarlo despues del que se debe ejecutar.

Por ejemplo,

Código Delphi [-]
tpanelcentrable=class(tcustompanel)
  ...

  FonResize_del_form: TnotifyEvent;
  FOnResize_delCompo:TnotifyEvent;
  ...

  Property OnResize: TnotifyEvent read FOnResize_del_Compo Write
    FOnResize_del_Compo;

  ....

constructor TPanelCentrable.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if not (csDesigning in ComponentState) then
  begin
    if assigned(tform(application.MainForm).OncanResize) then
      fonresize_del_form:=tform(application.MainForm).OncanResize;
    tform(application.MainForm).OnCanResize:=formresize;
  end;
end;

Procedure TpanelCentrable.formresize(sender:tObject);
begin
  Centrar(self,self.parent);
  if assigned(FOnResize_del_form) then
    FOnResize_del_form(sender);
  if assigned(FOnresize_del_compo) then
    FOnResize_del_compo(sender);
end;

...

Pero, cuando ejecuto, antes de hacer nada, me salta un error del tipo:

Project programa1.exe raised exception class EAccesViolation with message 'Acces
violation at adrress.....

y en el IDE se queda en;

if assigned(tform(application.MainForm).OncanResize) then


Por favor, ¿alguien me puede ayudar con este tema?

Gracias.
Nove
Responder Con Cita
  #2  
Antiguo 23-03-2009
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pon el código que usas en tu mainForm

Edito: Vaya, ya veo el problema.

No deberías sustituir los eventos del form Padre. Creo lo estás haciendo al revés, es decir, sería el Form donde sitúas ese panel, el encargado de centrar dicho panel.

¿Qué pasa si pones ese panel en un TFrame, PageControl, dentro de otro panel, etc? Pues obvio, access violation al canto por ese moldeo de tipos que usas.


Quizás tu problema lo puedas solventar sin programar nada usando la propiedad Anchor del Form (si tu delphi lo soporta)

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 23-03-2009 a las 20:15:01.
Responder Con Cita
  #3  
Antiguo 23-03-2009
Nove bb net Nove bb net is offline
Registrado
 
Registrado: mar 2009
Posts: 8
Poder: 0
Nove bb net Va por buen camino
Thumbs up Re: Eventos

El que intente interceptar el onresize del form, es porque es un mensaje seguro si se redimensiona la aplicacion.

Lo que quiero es que mi panel se centre, y luego, el usuario ha podido definir sus acciones en el form..

De hecho, lo que yo hago al centra es usar:
Centrar(self,self.parent);

vamos la tipica de
self.top:=(self.parent.clientheight-self.height) div 2;
self.left:= (self.parente......
Por eso, no debe dar problemas de uso al ser en aplicaciones.

Saludos.
Gracias por tu propuesta, mirare lo de Anchor, pero creo que seria mejor trabajar con el metodo que pretendo, ya que permitiria que el usuario haga lo que quiera, pero respetando siempre lo que el crador del componente ha pensado que era necesario para su correcto funcionamiento.

Nove
Responder Con Cita
  #4  
Antiguo 24-03-2009
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Vale, te doy otra razón para no usar ese método:

if assigned(tform(application.MainForm).OncanResize) then

eso se cumple si el programador final, en el form principal de la aplicación, ha escrito algo de código en el evento OncanResize. Por tanto no es seguro que se cumpla esa condición.

Se supone que haciendo doble clic en inspector de objetos, en el evento Oncanresize , ya cumpliría la condición, pero como sabes delphi elimina los eventos vacíos. En el caso de que añadas un comentario a ese evento, quizás el optimizador de código de delphi quite el evento porque vea que tiene un contenido supérfluo, no sé, no estoy seguro al 100 %

Otro detalle: ¿por qué usas application.MainForm? ¿el usuario de tu componente no puede ponerlo en un Form secundario?


Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 24-03-2009
Nove bb net Nove bb net is offline
Registrado
 
Registrado: mar 2009
Posts: 8
Poder: 0
Nove bb net Va por buen camino
Gracias a todos.

Realmente estaba empeñado, en que el ordn de construccion era distinto, pero.

Realmente solo pense en el formulario inicial, y no en otros secundarios, pero

Creo que esto funciona en todos los casos, por lo menos en los que he probado.

Código Delphi [-]
  Tcustompanelcentrado=class(tcustompanel)
  private
    foncanresizedelform:controls.tcanresizeevent;
    finiciado:boolean;
    procedure centrar;
  protected
  public
    constructor create(aowner:tcomponent); override;
    procedure paint; override;
    procedure canresizecompo(Sender: TObject; var NewWidth,
                             NewHeight: Integer; var Resize: Boolean);
  end;

  tpanelcentrado=class(tcustompanelcentrado);

implementation

constructor tcustompanelcentrado.create(aowner:tcomponent);
begin
  inherited create(aowner);
  finiciado:=false;
end;

procedure tcustompanelcentrado.paint;
var misterx:tcontrol;
begin
  if not finiciado then
    begin
      if not (csDesigning in ComponentState) then
        begin
          misterx:=self.Parent;
          while not(misterx is tform) do
            misterx:=misterx.Parent;

          if assigned(tform(misterx).OncanResize) then
            begin
              foncanresizedelform:=tform(misterx).oncanresize;
            end;
          tform(misterx).OnCanResize:=canresizecompo;

          centrar;

          finiciado:=true;
        end;
    end;
    inherited;
end;

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

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

perdon por no tenerlo puesto en una undiad independiente, es que hay otros compos.

Saludos.
Nove
Responder Con Cita
  #6  
Antiguo 25-03-2009
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Mejor .


Como crítica constructiva, podrías añadir una propiedad AutoCenter:Boolean que fuese True por defecto ¿para qué? para que tu usuario se olvide de los TPanel y pueda usar el tuyo aun cuando no requiera la capacidad de autocentrarse.

Cuando estás creando una interfaz, es muy normal andar probando distintas alternativas y si tiene que cambiar el Tpanel por un TPanelcentrado es engorroso, si ya usa un TPanelcentrado, sólo tiene que poner AutoCenter a True o false para ver cómo queda la nueva interfaz .

El cambio es simple:
Código Delphi [-]
Tcustompanelcentrado=class(tcustompanel)
private
  FAutoCenter:Boolean;
published // mostrada en el Inspector de objetos.
  propery AutoCenter:Boolean read FAutoCenter write FAutoCenter default True;
end;

constructor tcustompanelcentrado.create(aowner:tcomponent);
begin
  inherited create(aowner);
  finiciado:=false;
  FAutoCenter:= True;
end;

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

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 25-03-2009 a las 17:30:06.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Eventos en DLL ziqabo API de Windows 1 11-06-2007 20:04:21
Eventos Walcasar OOP 2 26-10-2006 15:42:40
Eventos xerkan Firebird e Interbase 5 13-10-2003 17:21:18
Eventos de un componente... craven OOP 3 08-05-2003 16:17:51


La franja horaria es GMT +2. Ahora son las 06:50:10.


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
Copyright 1996-2007 Club Delphi