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 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
RXClock y error Control has no parent window

Hola, he creado una clase que contiene un objeto TRxClock esta a grandes rasgos es su interface :

Código:
 TAlarmClock = class
  private
    FClock : TRxClock;
  public
    constructor Create(aOwner : TComponent);
    destructor Destroy; override;

    procedure OnAlarm(Sender : TObject);
  end;

en el constructor hago lo siguiente:

Código:
constructor TAlarmClock.Create(aOwner : TComponent);
begin
   inherited Create;
   FClock := TRxClock.Create(aOwner);
   FClock.Enabled := true;
   FClock.AlarmEnabled := True;
   FClock.OnAlarm := Self.OnAlarm;
end;
bueno cuando voy debugeando y termina de ejecutar la ultima instruccion del constructor me sale el siguiente error "class EInvalidOperation with message 'Control'' has no parent window", no se si queda claro, a mi clase en otro metodo le paso la hora a la que va ejecutar la alarma y lo que quiero que haga es que en el evento OnAlarm ejecute cierto codigo. Por que sale este error?????, que es lo que lo provoca ?????, como lo elimino, porque no me ejecuta el evento??????, muchas gracias por sus tiempos

saludos
miguel_e
Responder Con Cita
  #2  
Antiguo 05-09-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 17
paldave Va por buen camino
Te faltaría poner:
Código Delphi [-]
FClock.Parent:=Self;
para que se le asigne una ventana al reloj. Si no quieres que se vea pones:
Código Delphi [-]
FClock.Visible:=False;
Saludos.
Responder Con Cita
  #3  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
la clase TRxClock (quizas sea la version que tengo), no tiene ninguna propiedad llamada Parent la que contine es una que se llama ParentWindow y que recibe un parametro de tipo HWND, es esta a la cual le debo asignar el formulario????

saludos
miguel_e
Responder Con Cita
  #4  
Antiguo 05-09-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 17
paldave Va por buen camino
El error también puede estar en como creas y derivas tu componente.
No especificas en la declaración de qué componente lo derivas.
Además el constructor Create debe ser sobreescrito para luego poder llamarlo con inherited:
Código Delphi [-]
TAlarmClock = class (TComponent)
  private
    FClock : TRxClock;
  public
    constructor Create(aOwner : TComponent);override;
    destructor Destroy; override;

    procedure OnAlarm(Sender : TObject);
  end;
Prueba con esto y me cuentas.
Responder Con Cita
  #5  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
quedo de esta manera:

Código Delphi [-]
TAlarmClock = class(TComponent)
  private
    FClock : TRxClock;
  public
    constructor Create(aOwner : TComponent); override;
    destructor Destroy; override;

    procedure OnAlarm(Sender : TObject);
  end;


Código Delphi [-]
constructor TAlarmClock.Create(aOwner : TComponent);
begin
   inherited Create(aOwner);
   FClock := TRxClock.Create(aOwner);
   FClock.Enabled := true;
   FClock.AlarmEnabled := True;
   FClock.OnAlarm := Self.OnAlarm;
end;

y nada, sigue sucediendo el mismo error, que mas se le ocurre???

salu2
miguel_e

nota: fijense que el error da cuando termina el constructor y en el proximo sentencia entra sola en otra unit que parece que es la que tiene el timer encargada de vigilar el evento, el codigo es el siguiente:

Código Delphi [-]
procedure TRxTimer.Timer;
begin
  if FEnabled and not (csDestroying in ComponentState) and
    Assigned(FOnTimer) then FOnTimer(Self);
end;
Responder Con Cita
  #6  
Antiguo 05-09-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 17
paldave Va por buen camino
Postea todo el código en un zip así se puede analizar mejor.
Responder Con Cita
  #7  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
ahi te va, renombralo a .rar


example.zip
Responder Con Cita
  #8  
Antiguo 05-09-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 17
paldave Va por buen camino
Bueno, no pude ejecutarlo porque no tengo el TRxClock
De todas formas me quedó más claro cual puede ser el problema:
1) No sé por qué utilizas las sentencias Try...Except...End en un lugar que no debería dar problemas
2) Intuyo que el componente TRxClock debe mostrar un diálogo o algo parecido cuando llega la hora de la alarma, y por allí debe venir el problema. Debrías asignar el evento OnAlarm y ajustar la alarma antes de activarla, y hacer que tu componente sea el propietario del TRxClock.
A ver si así anda:
Código Delphi [-]
constructor TAlarmClock.Create(aOwner : TComponent);
begin
   inherited Create(aOwner);
   FClock := TRxClock.Create(Self);
   FClock.OnAlarm := Self.OnAlarm;
   FClock.SetAlarmTime(StrToDateTime('11:00:00 AM'));
   FClock.Enabled := true;
   FClock.AlarmEnabled := True;
 end;
No veo errores en el resto del código.
Es increíble como a veces algo fácil se complica, como nos sucedió en este caso.
Responder Con Cita
  #9  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
bueno, tampoco funcionú.

el Try...Except...End solamente lo use para ver si ignorando la excepcion me generaba la alarma, pero no, bueno ya no se la verdad que probrar, cualquier sugerencia bienvenida

saludos
miguel_e
Responder Con Cita
  #10  
Antiguo 05-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Prueba haciendo esto:

Código Delphi [-]
FClock := TRxClock.Create(Self);
FClock.Parent := AOwner;


Saludos...
Responder Con Cita
  #11  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
TRxClock no tiene ninguna propiedad llamada Parent, sino una que se llama ParentWindow y que recibe un parametro de tipo HWND, sera esta la via?????

saludos
miguel_e
Responder Con Cita
  #12  
Antiguo 05-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Y por que no derivas simplemente de TRXClock?

Código Delphi [-]
TMyClock = class(TRXClock)
protected
  procedure Alarm; override;
public
  constructor Create(AOwner: TComponent); override;
end;

implementation

constructor Create(AOwner: TComponent);
begin
  inherited;
  Enabled := True;
  AlarmEnabled := True
end;

procedure TMyClock.Alarm;
begin
  ShowMessage('Alarma disparada');
  inherited
end;

Ahora, sobre que TRXControl no cuente con la propiedad Parent, es raro, ya que al descender de TCustomPanel, este cuenta con esa propiedad...

En dado caso podrías probar con:

Código Delphi [-]
  if AOwner es TWinControl then
    FClock.ParentWindow := TWinControl(AOwner).Handle;


Saludos...
Responder Con Cita
  #13  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
OK asi funciona, muchas gracias, ya que estamos hablando del tema, esta clase debe cuando la termine, correr en un servicio window, por lo tanto no habra ningun formulario, TRxClock siempre debe tener una referencia a un formulario, en mi caso la referencia que le debia poner es un DataModule, serviria?????, que podria hacer en caso de que no hubiera formulario en mi aplicacion?????

salu2
miguel_e
Responder Con Cita
  #14  
Antiguo 05-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Si no va a tener ningún formulario, por que no mejor usas un TTimer para tal efecto?


Saludos...
Responder Con Cita
  #15  
Antiguo 05-09-2007
miguel_e miguel_e is offline
Miembro
 
Registrado: ene 2006
Posts: 86
Poder: 19
miguel_e Va por buen camino
es que necesitaba agregar alarmas y me evitaba asi tener que estar haciendo chequeos para ver si ya habia pasado o no el tiempo de ejecutar la accion cada vez que se disparara el evento del Timer, por eso queria usar TRxClock, si de todas maneras se le ocurre otra via que me recomienden, bienvenida

saludos
miguel_e
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
Parent, ParentWindow, objetos y el error Control has no parent Window dec Varios 18 07-08-2007 15:02:01
Control has not parent Window peripla Varios 7 06-07-2007 04:26:27
In Design: Control no has parent window Negegoca Varios 1 26-01-2007 17:26:36
Array de controles - Control has no parent window SyncReuter OOP 8 24-01-2007 02:21:14
Ayuda: Control Has No Parent Window pelaorb68 Varios 10 20-12-2005 20:36:26


La franja horaria es GMT +2. Ahora son las 09:17:33.


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