Delphi - crear objeto

 
Vista:

crear objeto

Publicado por David1 (55 intervenciones) el 03/10/2007 14:56:57
Hola Buen día

Mi problema es el siguiente tengo una aplicacion Delphi 5 y cuando creo una clase que hereda y luego la quiero llamar parece que no esta creada yo creo que no creo el objeto como tal, me podrian esplicar por favor estoy desesperado

Mi idea es crear una clase facturas rectificativas que herede de facturas y luego llamarlo desde un menu con una taction alguna idea porfavor......

Tengo un menu en el que existen diferentes opciones Facturas,Ordenes.... Bueno mi idea es añadir un campo que es facturas rectificativas que hereda de la clase facturas bien añado el campo facturas rectificativas al menú pero cuando corro la aplicación el campo facturas rectificativas me aparece inhabilitado

gracias por anticipado

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:crear objeto

Publicado por emilio (175 intervenciones) el 03/10/2007 18:14:04
Mira hace rato que te veo preguntar lo mismo y te digo que nadie te responde porque tu pregunta no es lo bastante explicita como para que alquien se de cuenta de que es lo que dices.

voy a intentar meterte al buen camino haber si yo o alguin mas te puede ayudar....

Dime, tu clase FActuras que es o de que deciende de un Formulario??, de TObject, TPersistent o de que??. Que codigo escribistes en el Atcion que invoca FActuras y cual en el de FActuras Rectificativas.

Mira cuando una opcion de menu asociada a un action aparece deshabilitada es porque el action no tiene implementado ningun manejaodr de eventos. Si pones una opcion de menu asociada con un action que se llama Facturas rectificativas en el evento OnExecute de dicho action tienes que escribir el codigo necesario para crear la instancia de la clase facturas rectificativas y demas...

suerte.... y se mas explicito para poderte ayudar hombre!!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por David1 (55 intervenciones) el 03/10/2007 21:29:58
Si que llevas toda la razon pero ando un poquillo nervioso, agoviao y to..... estoy empezando con esto del Delphi ....

intentare explicarme mejor:
Tengo una clase ya implementada que hereda de tfMantenimiento que a su vez hereda de tform(tfmantenimiento tiene toolbutton para interactuar por la base de datos.... )

lo que yo hago es crear una nueva clase que hereda de tffacturas...bien hasta aqui todo bien.

Ahora voy a fmainmenu que hereda de tfmainmenu y en tfmainMenu y tengo tfmainmenu.acAccionventanaexecute y formshow entre otras

// Esta función recibe un nombre de clase de un form y actua de dos maneras distintas dependiendo del
// parámetro PermitirVarias.
// Si PermitirVarias = True entonces, crea el form y lo devuelve.
// Si PermitirVarias = False entonces, busca el form y lo restaura en caso de
// encontrarlo. En caso de que no lo encuentre, lo crea.
// Retorna siempre el form referenciado.

function TMDEstandar.LLamarVentana(NombreClase: string; PermitirVarias: boolean): TForm;
Var ClaseGenerica: TPersistentClass;
begin
ClaseGenerica := GetClass(NombreClase);
if ClaseGenerica <> nil (AQUÍ SALTA A LA EXCEPCIÓN)
then begin
if ClaseGenerica.InheritsFrom(GetClass('TForm'))
then begin
Result := LLamarVentana(TFormClass(ClaseGenerica),PermitirVarias);
end
else begin
Raise ExcepcionAdvertencia.CreateFmt(StrImposibleAbrirLaVentanaX,[NombreClase]);
end;
end
else begin
Raise ExcepcionAdvertencia.CreateFmt(StrImposibleAbrirLaVentanaX,[NombreClase]);
end;
end;

Espero haberme explicado mejor Gracias por ayudarme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por emilio (175 intervenciones) el 04/10/2007 15:05:41
MMMMMMMM.... :) , bueno halla vamos... primero que todo quiero pedirte que lo que escriba aqui no es critica a tu forma de programar ni mucho menos, soy de los que piensa que cada programador tiene su propio libro y hay que respetarselo.

Haber...

Tu problema es que la opcion de menu, aparece deshabilitada aun teniendo implementando ese codigo que muestras en su manegador de evento no??. Antes de seguir, dejame hacerle una observacion a tu codigo que creo te va a mejorar la vida :)

function TMDEstandar.LLamarVentana(NombreClase: TFormClass; PermitirVarias: boolean);

var
f : TForm;
begin

if not PermitirVarias then //Ahora si pensemos que PermitirVarias = False
begin
f := Application.FindComponent(Copy(NombreClase.ClassName,2,Length(NombreClase.ClassName))) as TForm;

if assigned(f) then f.Show // exsiste un form abierto de esa clase, lo mostramos
else
begin
NombreClase.Create(Application);
// si tus forms son MDI puedes hacer que si visualice asi. Screen.Forms[Screen.FormCount -1].Show; // el ultimo form de la lista es el tuyo.

end;
end esle // PermitirVarias = True. Creamos uno nuevo :)
begin
NombreClase.Create(Application);
// si tus forms son MDI puedes hacer que si visualice asi. Screen.Forms[Screen.FormCount -1].Show; // el ultimo form de la lista es el tuyo.
end;

end;

Ahora si tu proble es la opcion de menu desactivada ya te dije, si los action no tienen codigo en el evento OnExecute, pues desactivan al compo que los utiliza, mira eso y si no pues... tendria que ver lo que escribes para saber. Hasta ahora creo que este coigo que te he puesto esta un poco mas claro que el que usas y ademas si sabes algo de recursion deberias saber que es buena practica evitarla en lo que se pueda.

Saludos....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por emilio (175 intervenciones) el 04/10/2007 15:16:32
procedure TMDEstandar.LLamarVentana(NombreClase: TFormClass; PermitirVarias: boolean); // esto ahora es un procedimiento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por David1 (55 intervenciones) el 04/10/2007 16:21:57
Hola he probado el codigo que me mandaste y me devuelve un error de memoria

La aplicación no la realize yo la hizo un tio que supuestamente era un mostruo programando pero claro cuando no se sabe todo es un mundo.....

volviendo al tema Emilio. no es posible hacer que en la funcion llamarVentana la variable clasegenerica deje de ser nil en la misma clase hay otra funcion OVERLOAD que te adjunto GRAAAAAACIIIIIAAAAAASSSSS

function TMDEstandar.LLamarVentana(Clase: TFormClass; PermitirVarias: boolean): TForm;
Var Encontrado: boolean;
I: integer;
EsNuevaCreacion: boolean;
TipoPermiso: string;
begin
Result := nil;
Encontrado := False;
EsNuevaCreacion := False;
if PermitirVarias
then begin
if TipoAccesoRol(Clase.ClassName,TipoPermiso)
then begin
Result := Clase.Create(Application.Mainform);
EsNuevaCreacion := True;
end;
end
else begin
I := 0;
while (not Encontrado) and (I < Screen.FormCount) do
begin
if Screen.Forms[I] is Clase
then begin
Encontrado := True;
Result := Screen.Forms[I];
Result.BringToFront;
if Result.WindowState = wsMinimized then
Result.WindowState := wsNormal;
end
else begin
Inc(I);
end;
end;
if not Encontrado
then begin
if TipoAccesoRol(Clase.ClassName,TipoPermiso)
then begin
try
Result := Clase.Create(Application.MainForm);
EsNuevaCreacion := True;
except
on E: Exception do
begin
GestionExcepciones(self,E);
end;
end;
end;
end;
end;
if EsNuevaCreacion
then begin
Result.Position := poScreenCenter;
Result.Top := (Application.MainForm.ClientHeight -
HEIGHT_STATUSBAR -
HEIGHT_BORDES -
Result.Height) div 2;
Result.Left := (Application.MainForm.ClientWidth -
WIDTH_BORDES -
Result.Width)
div 2;
Result.ShowHint := True;
if TipoPermiso = vSOLOLECTURA
then begin
if Result is TfMantenimiento
then begin
TfMantenimiento(Result).Deshabilitar;
end;
end;
Result.Visible := True;
end;
end;
A ver si puedes hacer algo Emilio y de nuevo Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por emilio (175 intervenciones) el 04/10/2007 20:34:17
Este es el codigo comprobado :) , sorry por lo otro lo escribi a cabeza sin probarlo, realmente lo escribo en todas mi app, pero nunca me acuerdo como escribierlo bien, asi que voy, lo copio... lo adacto a la necesidad actual y lo saco de mi RAM(cabeza). Vale alla va:

procedure TwndECOMAX.MostrarVentana(AClass:TFormClass);
var
F : TForm;
begin
F := Application.FindComponent(Copy(AClass.ClassName,2,Length(AClass.ClassName))) as TForm;

if Assigned(F) then
F.Show
else
begin
LockWindowUpdate(Application.MainForm.Handle);
AClass.Create(Application);
Screen.Forms[Screen.FormCount - 1].Show;
LockWindowUpdate(0);
end;

end;

Ese es el codigo escrito en uno de mis soft, lo utilizo para mostrar ventanas MDI, en tu app tambien son modales por lo que veo, ahora te lo muestro como creo funcionaria en el tuyo:

function TMDEstandar.MostrarVentana(Clase: TFormClass; PermitirVarias: boolean):
TForm;
begin

if not PermitirVarias then
bein
Result := Application.FindComponent(Copy(AClass.ClassName,2,Length(AClass.ClassName))) as TForm;

if Assigned(F) then F.Show
else
begin
LockWindowUpdate(Application.MainForm.Handle);
AClass.Create(Application);
Screen.Forms[Screen.FormCount - 1].Show;
LockWindowUpdate(0);
end;

end
else
begin
LockWindowUpdate(Application.MainForm.Handle);
AClass.Create(Application);
Screen.Forms[Screen.FormCount - 1].Show;
LockWindowUpdate(0);
end;

end;

Mira ese codigo pongo mi cabesa en la guillotina que funciona, pues lo tuyo es solo una pequeña variacion(agregar el parametro PermitirVarias), ahora que si no funciona es porque el tio que escribio ese codigo que muestras es definitivamente un "chambon(sucio)" , vamos a hacer una cosa, pues la verdad ya me meti en esto ya salimos juntos. Vuelve a probar con ese codigo que te puse, si no te funciona es porque el enredo de herencia que hay formado ahi, es mas gordo que una ballena y deberemos ir desenredando poco a poco la cosa. Por lo pronto fijate que el codigo para tu ejemplo esta cambiado a Function porque el error que recibistes puede ser porque tomas una referencia al formulario instanciado en alguna parte y haces uso de ella.



NOTA: Particularmente no creo que para saber si se muestra una ventana u otra halla que escribir tanto. Si tienes un poco de destreza con delphi aprobecha y mejora la chambonada esa. Application.FindComponent busca en la app un objeto con un nombre dado, Por tanto es capas de buscar ventanas sin tener que recorrer un lista para aberiguar si esta. LockWindowUpdate(Application.MainForm.Handle); le quita el parpadeo a las ventanas cuando se crean(osea la animacion), veras la diferencia si lo usas.

Lee el otro post!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por emilio (175 intervenciones) el 04/10/2007 20:50:12
function TMDEstandar.LLamarVentana(Clase: TFormClass; PermitirVarias: boolean): TForm;
Var Encontrado: boolean;
I: integer;
EsNuevaCreacion: boolean;
TipoPermiso: string;

begin
Result := nil;
Encontrado := False;
EsNuevaCreacion := False;

if PermitirVarias then
begin
if TipoAccesoRol(Clase.ClassName,TipoPermiso) then
begin
Result := Clase.Create(Application.Mainform);
EsNuevaCreacion := True;
end;
end
else
begin

Result := Application.FindComponent(Copy(AClass.ClassName,2,Length(AClass.ClassName))) as TForm;

if Assigned(Result) then
begin
Result.BringToFront;
if Result.WindowState = wsMinimized then
Result.WindowState := wsNormal;
end
else
if TipoAccesoRol(Clase.ClassName,TipoPermiso) then
try

Result := Clase.Create(Application.MainForm);
EsNuevaCreacion := True;

except
on E: Exception do GestionExcepciones(self,E);
end;

end;

// Esto que sigue la verdad que no quiero ni mirarlo porque esta que mete miedo :D
if EsNuevaCreacion then
begin
Result.Position := poScreenCenter;
Result.Top := (Application.MainForm.ClientHeight -
HEIGHT_STATUSBAR -
HEIGHT_BORDES -
Result.Height) div 2;
Result.Left := (Application.MainForm.ClientWidth -
WIDTH_BORDES -
Result.Width)
div 2;
Result.ShowHint := True;
if TipoPermiso = vSOLOLECTURA
then begin
if Result is TfMantenimiento
then begin
TfMantenimiento(Result).Deshabilitar;
end;
end;
Result.Visible := True;
end;
end;

Prueba esas mejoras, no creo que resulva el problema pero empiesa a aclararlo, tambien debemos considerar hacer un seguimiento de los eventos para ver donde es que el programa empiesa a hacer lo que le da la gana y no lo que tiene que hacer. Seria bueno que pusieras un BreakPoints en loguares que consideres estratergicos y empiese a seguirle la pista a tu app desde alli.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por David1 (55 intervenciones) el 05/10/2007 08:50:45
Buenos dias Emilio voy a probar esto que me has facilitado.

Yo no es que sepa mucho pero si que me di cuenta de que la cosa de la herencia entre otras cosas de la aplicación estan un poco jodidas pero bueno lo intentare hacer lo mejor que pueda.

Muchas Gracias de nuevo ya te cuento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por David1 (55 intervenciones) el 05/10/2007 17:33:21
Emilio sigo dandole caña no pienses que lo he abandonao lo que pasa que me han venido algunas ideas felices

Como bien dices son MDI pero que coñada que me lance la jodida excepcion

he creado la nueva ventana provando a ver si haciendola directamente hija de la clase tfmainmenu que es una de las madres y desde la que heredan las ventanas que llaman las acciones pero nada sigo con ello.

Lo que me enviaste funcionaba pero al llamar a la accion desde el menu me muestra lo que le da la gana los menus que quiere bueno solo tres de ellos los demas ni rastro.

en la funcion pequeña que te mande me di cuenta que lo que pasa es que cuando le das a facturas por ejemplo la linea:

claseGenerica:=Getclass(nombreclase)

cuando sale de esta lienea si que tien tffacturas el getclass

pero si por el contrario elijo la opcion facturasRectificativas clasegenerica=' '

Gracias de nuevo. Buen finde
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:crear objeto

Publicado por emilio (175 intervenciones) el 05/10/2007 21:29:58
[email protected] ese es el msn de Gtalk mio, si quieres agregame, estoy ahi de lunes a viernes. Suerte!!, te escribi un monton aca, pero no se agrego a las respuestas :( asi que obte poner el msn.

Suerte!!!, oye me gustaria ayudarte mas pero es bien dificil al no tener el codigo delante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar