Ir al contenido


Foto

Que estoy haciendomal en esta función


  • Por favor identifícate para responder
8 respuestas en este tema

#1 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 mayo 2011 - 05:18

Hola compañeros, como siempre rrecurro a vosotros ya que llevo un  día perdido por culpa de la siguiente funcion



delphi
  1. [pre]function TFMenuPrincipal.AbrirForms(Unidad:TClass;NivelAcceso:TAction;ModoAbrir:Integer;NomModulo:string):Boo  lean;
  2. //------------------------------------------------------------------------------
  3. //****************************************[ Funcion para Abrir Los Form ]*******
  4. // -----------------------------------------------------------------------------
  5. //Unidad:        Nombre del Form a abrir 
  6. //NivelAcceso:    Segun La Propiedad TAG de la action nos permite pasar o no
  7. //ModoAbrir:      Abre el Form 1 En Showmodal 0 en Show
  8. //NomModulo:      Nombre del modulo para mensajes de error
  9. //------------------------------------------------------------------------------
  10. var Modulo:TForm;
  11.     Modf:string;
  12. begin
  13.   if CompruebaNivel(NivelAcceso.Tag,VarNivelUsusario)=true then
  14.   begin
  15.         try
  16.           Modf:= Copy(Unidad.ClassName,2,Length(Unidad.ClassName));
  17.           Modulo:=tform(Modf);
  18.           if not Assigned(&Modulo) then
  19.           begin
  20.           Modulo:=TForm(Unidad).Create(nil);
  21.             if ModoAbrir=1 then Modulo.ShowModal
  22.                           else Modulo.show;
  23.           end
  24.           else
  25.           begin
  26.             if ModoAbrir=1 then Modulo.ShowModal
  27.                           else Modulo.show;
  28.           end;
  29.           Result:=True;
  30.         except
  31.           ShowMessage('Se ha producido un error al intentar abrir el modulo [  '+NomModulo +'  ]'+#13
  32.                       +#13+#13+#13+
  33.                       'Si persiste el Error, por favor pongase en contacto con el servicio Técnico');
  34.           Result:=False;
  35.         end;
  36.     end
  37.     else
  38.     begin
  39.       ShowMessage('Debe se un usuario con nivel '+IntToStr(NivelAcceso.Tag)+' para entrar en esta opción');
  40.       Result:=False;
  41.     end;
  42. end;[/pre]




  La llmada la hago de la siguiente manera



delphi
  1. [pre]AbrirForms(TFFamilias,A_AFamilias,1,'Familias');[/pre]



La funcion Compruebanivel es
 



delphi
  1. [pre]//------------------------------------------------------------------------------
  2. //******************************************************[ CompruebaNivel ]******
  3. //  16/02/2011  JLGT compara un nivel con otro si es igual o mayo devuelve true
  4. //------------------------------------------------------------------------------
  5. //  En pricipio para comprobar niveles de ususario segun el tag y un nivel dado
  6. //------------------------------------------------------------------------------
  7. //
  8. //------------------------------------------------------------------------------
  9. function CompruebaNivel(tag, nivel:Integer):Boolean;
  10. begin
  11.   if tag<=nivel then Result:=True
  12.                 else Result:=False;
  13. end;[/pre]




  y el proyecto ya he probado con



delphi
  1.   y el prollecto ya he probado con



y con



delphi
  1. [pre]//  Application.CreateForm(TFFamilias, FFamilias);[/pre]




  El problema que detecto es que cunado pasa por la unidad de asignación  no entra, pasa por lo tanto al else y aún asi me da el error de las  lineas



delphi
  1. [pre]      ShowMessage('Se ha producido un error al intentar abrir el modulo [  '+NomModulo +'  ]'+#13
  2.                       +#13+#13+#13+
  3.                       'Si persiste el Error, por favor pongase en contacto con el servicio Tecnico');[/pre]



Se supone que al leer la variable modulo, deberia desirme si esta asignada o no, pero ni idea, si pongo el código que uso normalmente funciona, os pongo el código



delphi
  1. [pre]procedure TFMenuPrincipal.A_AFamiliasExecute(Sender: TObject);
  2. //------------------------------------------------------------------------------
  3. //*************************************************[ LLAMADA A FAMILIAS ]*******
  4. //------------------------------------------------------------------------------
  5. begin
  6.   if CompruebaNivel(A_AFamilias.Tag,VarNivelUsusario)=true then
  7.   begin
  8.         try
  9.           if not Assigned(FFamilias) then
  10.           begin
  11.           FFamilias:=TFFamilias.Create(nil);
  12.             FFamilias.ShowModal;
  13.           end else FFamilias.ShowModal;
  14.         except
  15.           ShowMessage('Se ha producido un error al intentar abrir el modulo [  Familias  ]'+#13
  16.                       +#13+#13+#13+
  17.                       'Si persiste el Error, por favor pongase en contacto con el servicio Técnico');
  18.         end;
  19.     end
  20.     else
  21.     begin
  22.       ShowMessage('Debe se un usuario con nivel '+IntToStr(A_AFamilias.Tag)+' para entrar en esta opción');
  23.     end;
  24. end;[/pre]


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 mayo 2011 - 07:36

Amigo Desart, te propongo una técnica mucho mas limpia para lograr lo que quieres, parto de la base que lo que quieres es que, con base en la variable VarNivelUsuario, se pueda abrir o no cierto formulario, también veo que le pasas un parámetro de nombre NomMoudulo que no usas en la función, en fín en el ejemplo que te propongo lo conservo por si lo usas en otra parte.

Mi idea es diseñar una clase base de la  cual heredarás las otras, esta tiene una función de clase de tipo booleano, que toma como parámetros el nivel de usuario, el modo de abrir, el NomModulo(que no se para que lo usas, pero allí lo dejé) y por último parámetro el propietario del form. También tiene un campo protegido que debe asignarse  a la hora de crear el form con el nivel de acceso que permite ese determinado formulario, este posteriormente se comparará con el recibido en el parámetro de creación.

La clase base es así:



delphi
  1. unit UBase;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs;
  8.  
  9. type
  10.   TBase = class(TForm)
  11.   protected
  12.     FNivelAcceso: Integer;
  13.   private
  14.  
  15.     { Private declarations }
  16.   public
  17.     class function Ejecutar(NivelAcceso, ModoAbrir: Integer; NomModulo: string;
  18.       AOwner: TComponent = nil): Boolean;
  19.  
  20.   end;
  21.  
  22.   TBaseClass = class of TBase;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27. { TBase }
  28.  
  29. class function TBase.Ejecutar(NivelAcceso, ModoAbrir: Integer;
  30.   NomModulo: string; AOwner: TComponent = nil): Boolean;
  31. begin
  32.   Result := False;
  33.   if AOwner = nil then
  34.     AOwner := Application.MainForm;
  35.   with Create(AOwner) do
  36.   begin
  37.     Result := (FNivelAcceso <= NivelAcceso);
  38.     if not Result then
  39.       Free
  40.     else
  41.     begin
  42.       if ModoAbrir = 1 then
  43.         ShowModal
  44.       else
  45.         Show
  46.     end;
  47.   end;
  48. end;
  49.  
  50. end.



La siguiente es una clase heredada de TBase, le he puesto como nombre prueba y he asignado en su creación el nivel de acceso := 1;



delphi
  1. unit UPrueba;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, UBase;
  8.  
  9. type
  10.   TPrueba = class(TBase)
  11.     procedure FormCreate(Sender: TObject);
  12.   private
  13.     { Private declarations }
  14.   public
  15.     { Public declarations }
  16.   end;
  17.  
  18. implementation
  19.  
  20. {$R *.dfm}
  21.  
  22. procedure TPrueba.FormCreate(Sender: TObject);
  23. begin
  24.   inherited;
  25.   FNivelAcceso := 1;
  26. end;
  27.  
  28. end.



Finalmente en la unidad principal del ejemplo he implementado la función para llamar a cuantos descendientes de Tbase quieras y he llamado a la clase heredada TPrueba  con la  función  en la implementación del click del botón.



delphi
  1. unit UMaim;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, UBase, ActnList;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     procedure Button1Click(Sender: TObject);
  13.     procedure FormCreate(Sender: TObject);
  14.   private
  15.     function AbrirForms(Unidad: TBaseClass; ModoAbrir: Integer;
  16.       NomModulo: string): Boolean;
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.   VarNivelusuario: Integer;
  24.  
  25. implementation
  26.  
  27. uses UPrueba;
  28. {$R *.dfm}
  29.  
  30. function TForm1.AbrirForms(Unidad: TBaseClass; ModoAbrir: Integer;
  31.   NomModulo: string): Boolean;
  32. begin
  33.   Result := Unidad.Ejecutar(VarNivelusuario, ModoAbrir, NomModulo);
  34. end;
  35.  
  36. procedure TForm1.Button1Click(Sender: TObject);
  37. begin
  38.   if not AbrirForms(TPrueba, 1, '') then
  39.     ShowMessage('Tu mensaje')
  40. end;
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. begin
  44.   VarNivelusuario := 1;
  45. end;
  46.  
  47. end.



Adjunto el ejemplo, espero te sea de ayuda, estaré atento a cualquier duda.

Saludos
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 mayo 2011 - 08:39

Si no te quieres complicar y solo quieres depurar tus funciones originales, quedarían así:



delphi
  1. function CompruebaNivel(tag, nivel:Integer):Boolean;
  2. begin
  3.   result :=  tag <= nivel ;
  4. end





delphi
  1.   function TFMenuPrincipal.AbrirForms(Unidad: TClass; NivelAcceso: TAction;
  2.     ModoAbrir: Integer; NomModulo: string): Boolean;
  3.   // ------------------------------------------------------------------------------
  4.   // ****************************************[ Funcion para Abrir Los Form ]*******
  5.   // -----------------------------------------------------------------------------
  6.   // Unidad:        Nombre del Form a abrir
  7.   // NivelAcceso:    Segun La Propiedad TAG de la action nos permite pasar o no
  8.   // ModoAbrir:      Abre el Form 1 En Showmodal 0 en Show
  9.   // NomModulo:      Nombre del modulo para mensajes de error
  10.   // ------------------------------------------------------------------------------
  11.   var
  12.     Modulo: TForm;
  13.     Modf: string;
  14.   begin
  15.     result := False;
  16.     if CompruebaNivel(NivelAcceso.Tag, VarNivelUsusario) then
  17.     begin
  18.       Modf := Copy(Unidad.ClassName, 2, Length(Unidad.ClassName));{El error podría estar aquí, si esta cadena no te devuelve el nombre correcto del form}
  19.       Modulo := TForm(Modf);
  20.       if not Assigned(Modulo) then
  21.         Modulo := TForm(Unidad).Create(nil);
  22.       try
  23.         if ModoAbrir = 1 then
  24.           Modulo.ShowModal
  25.         else
  26.           Modulo.show;
  27.         result := true;
  28.       except
  29.         ShowMessage
  30.           ('Se ha producido un error al intentar abrir el modulo [  '
  31.             + NomModulo + '  ]' + #13 + #13 + #13 + #13 +
  32.             'Si persiste el Error, por favor pongase en contacto con el servicio Técnico');
  33.       end;
  34.     end
  35.     else
  36.       ShowMessage('Debe se un usuario con nivel ' + IntToStr(NivelAcceso.Tag)
  37.           + ' para entrar en esta opción');
  38.   end;



Saludos.
  • 0

#4 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 mayo 2011 - 09:39

gracias Wilson probare a partir de  mañana en el trabajo, en cuanto tenga un hueco y te digo.
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 mayo 2011 - 10:51

He visto en tu codigo que cuando salta un error, lo reportas con un texto fijo, en lugar de incluir dentro el mensaje de error original, que te podría aclarar mucho lo que ocurre.



delphi
  1.         except
  2.           ShowMessage('Se ha producido un error al intentar abrir el modulo [  Familias  ]'+#13
  3.                       +#13+#13+e.messaje+#13+
  4.                       'Si persiste el Error, por favor pongase en contacto con el servicio Técnico');
  5.         end;



Ojo, lo de e.messaje es de memoria, igual era e.msg o algo del estilo ;)
  • 0

#6 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 mayo 2011 - 01:32

Gracias Sergio, pero el código que expuse y con el que hice las pruebas no es el que uso definitivamente, ya que uso mensajes de error, más completos, envió por email y faltan el campo para  claves de acceso según el Tag del Action seleccionado.
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 24 mayo 2011 - 11:11

Wilson  me salta este error al momento de compilar tu prueba.
[Error] prDesart.dpr(13): Undeclared identifier: 'MainFormOnTaskbar'
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 mayo 2011 - 07:39

Wilson  me salta este error al momento de compilar tu prueba.
[Error] prDesart.dpr(13): Undeclared identifier: 'MainFormOnTaskbar'


Comenta la línea (Application.MainFormOnTaskbar := True;) en el source del proyecto (Project > View Source). Es por la versión diferente de Delphi (yo estoy usando Delphi 2010).

Saludos
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 mayo 2011 - 07:48


Wilson  me salta este error al momento de compilar tu prueba.
[Error] prDesart.dpr(13): Undeclared identifier: 'MainFormOnTaskbar'


Comenta la línea (Application.MainFormOnTaskbar := True;) en el source del proyecto (Project > View Source). Es por la versión diferente de Delphi (yo estoy usando Delphi 2010).

Saludos


Solo para comentar que ésta propiedad aparece a partir de Delphi2007 que hasta donde tengo conocimiento era para proporcionar un mejor soporte al tema Aero de Windows Vista, especialmente en los efectos que se producen cuando la aplicación se minimiza, se restaura o se cierra.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.