Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Herencia (https://www.clubdelphi.com/foros/showthread.php?t=3593)

vegalisandro 12-09-2003 16:09:32

Herencia
 
Hola, estoy trabajando con Delphi7 en vcl, el tema es que estoy creando formularios que me sirven de base para otros formularios, asi tengo una jeraquia de 4/5 formularios, el problema es que por temas relacionados con la seguridad del sistema, yo en el formulario base de todos (el mas alto en la jeraquia f01) implemento dicha seguridad, y si no cumple ciertas condiciones el formulario no se debe abrir. Tengo eventos en todos los OnShow y en todos los OnClose de los formularios de la herencia.
yo lo que necesito es que si no se cumple la condicion del formulario f01, no se siga con nada mas, es decir no ejecute nada mas, pero el tema es que cuando esto sucede, yo disparo un close del f01, lo que dispara el close de todos los formularios, y como la validacion de seguridad la tengo en el onShow, luego de disparar los close correspondientes intenta seguir disparando los shows y ahi da error, yo lo que necesito es poder interrumpir esa ejecucion de los shows en el mismo lugar que obligo a hacer los close. ¿Alguien sabe como interrumpir esta ejecucion en la herencia? (El abort me da error)

Gracias
Lisandro

delphi.com.ar 12-09-2003 16:24:34

La verdad que no entiendo mucho tu problema, si tu problema es que no se ejecuten los métodos heredados o es otro, si tu tienes una clase

Código:

TClase = class
public
  procedure Metodo; virtual;
end;

...

procedure TClase.Metodo;
begin
  ShowMessage('Hola Mundo!');
end;

y creo una clase heredada de esta que sobreesciba el método:

Código:

THeredada = class(TClase)
public
  procedure Metodo; override;
end;

Si quiero que en la implementación del método se ejecuten el método de la clase base:
Código:


procedure THeredada.Metodo;
begin
  inherited; {Aquí hace que se ejecute el método de la clase heredada} 
  ShowMessage('Chau Mundo!!');
end;

Aquí evito que ejecute el metodo heredado:
Código:


procedure THeredada.Metodo;
begin
  {Como verás no llama al metodo heredado (inherited) }
  ShowMessage('Chau Mundo!!');
end;


¿Es esta tu duda?

Saludos!

vegalisandro 12-09-2003 16:39:18

No es esa la duda justamente, pero ya encontre una posible solucion, lo que a mi me pasaba es que no podia, ante una determinada situacion, detener la ejecucion de los formularios que heredaban del principal



--------------------------
f01
onshow
if(i=1)then
// cortar todo no seguir
else showmessage('hola mundo');

----------------------------
f02=class(Tf01)
onshow
inherited;
showmessage('como estan')



------------------------------
fUsuarios=class(TF02)
onShow
inherited;
//Abro DataSets y otras cosas


entonces cuando yo hacia el show del fUsuarios disparaba el
Show del este, que disparaba el show de f02 y el show de f01 y este ultimo no cumplia la condicion, entonces yo disparaba un close y luego, porque entro por inherited del fUsuarios y f02, seguia con lo que tenia en el onshow de estos y eso es lo que yo no queria.

Saludos
Lisandro

guillotmarc 12-09-2003 16:52:58

¿ Como lo has solucionado ? ¿ Una llamada al método Abort ?

Saludos.

vegalisandro 12-09-2003 17:01:33

no lo hice de la manera mas fina, pero creando una variable de clase la cual cuando se dispara el create la seteo con un valor y cuando la condicion no se cumple le cambio el valor, y solo la utilizo al momento de hacer el onShow y pregunto por el valor de la misma, lo pude solucionar, en cuanto al Abort me dispara un error.

Saludos
Lisandro

jacanche 12-09-2003 19:11:21

Hola, solo por curiosidad, ¿por que no, en lugar de validarlo en el onshow, lo validas en el create?, No seria mas optimo, que en el momento de crear el objeto se pueda verificar si el usuario cuenta con los derechos de acceso y de no ser asi, mejor que no se cree el objeto.

Saludos

Alfredo

vegalisandro 12-09-2003 19:39:54

lo que pasa es que en el caso de que no tenga que crear el formulario, no estaria entrando nunca por esa validacion.
Es decir, yo puedo crear el formulario y no destruirlo hasta que salga de la aplicacion, por ende la primer invocacion disparara el onCreate pero las demas veces que yo lo invoque no lo hara, y si pasara por el OnShow

Saludos
Lisandro

jacanche 13-09-2003 04:25:59

ok., pero no seria mejor que la validacion del acceso se realice de una sola vez, y no cada vez que se quiera accesar al objeto, en fin, solo estoy divagando, y creo que me estoy saliendo del tema del hilo.

Saludos

Alfredo.

vegalisandro 15-09-2003 14:30:42

no, debido a que el formulario puede tener una propiedad de revalidacion, es decir que cada vez que entre al mismo deba pedir el Usr y Psw y a su vez, el sistema tiene la posibilidad de cambiar de usuario, y esto no funcionaria como se espera si la validacion estaria en el onCreate

Saludos
Lisandro


La franja horaria es GMT +2. Ahora son las 19:41:23.

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