Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   RXClock y error Control has no parent window (https://www.clubdelphi.com/foros/showthread.php?t=47712)

miguel_e 05-09-2007 16:59:04

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

paldave 05-09-2007 17:04:55

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.

miguel_e 05-09-2007 17:20:37

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

paldave 05-09-2007 17:32:20

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.

miguel_e 05-09-2007 17:50:58

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;

paldave 05-09-2007 18:00:18

Postea todo el código en un zip así se puede analizar mejor.

miguel_e 05-09-2007 18:26:02

1 Archivos Adjunto(s)
ahi te va, renombralo a .rar


Archivo Adjunto 978

paldave 05-09-2007 18:43:40

Bueno, no pude ejecutarlo porque no tengo el TRxClock :o
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.

miguel_e 05-09-2007 19:56:28

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

maeyanes 05-09-2007 20:04:49

Prueba haciendo esto:

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


Saludos...

miguel_e 05-09-2007 21:08:24

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

maeyanes 05-09-2007 21:42:05

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...

miguel_e 05-09-2007 22:00:47

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

maeyanes 05-09-2007 22:10:42

Si no va a tener ningún formulario, por que no mejor usas un TTimer para tal efecto?


Saludos...

miguel_e 05-09-2007 22:24:22

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


La franja horaria es GMT +2. Ahora son las 16:37: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