Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion generica para crear varios forms (https://www.clubdelphi.com/foros/showthread.php?t=56031)

Carlos Arevalo 05-05-2008 21:38:58

Funcion generica para crear varios forms
 
Tengo varios forms creados y quiero abrirlos con una funcion generica ubicada en una unit que cree para colocar todos los procedimientos genericos que utilizan los forms en mi aplicacion pero por alguna razon que desconosco la funcion me da un error cuando la ejecuto desde la unit que cree pero si la inserto en un form funciona perfectamente.

Cual puede ser el problema?


Código Delphi [-]

unit unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms;


  function xform(formsender: Tform; Sender: TObject): Boolean;

  implementation

function xform(formsender: Tform; Sender: TObject): Boolean;
begin
//en la linea sig. esta el error 
 formsender:=Tform(formsender).Create(self);
  Tform(formsender).showmodal;
  result:=true;

end;

end.

Este es el error:
Undeclared identifier: 'Self'

Uso Delphi 7


Muchas gracias

jcarteagaf 05-05-2008 22:03:16

Yo uso esta funcion

Código Delphi [-]
function MostrarForma(TfrmClass: TFormClass) : boolean;
begin
  with TfrmClass.Create(Application) do
  begin
    result := ShowModal = mrOk;
    Free;
  end;
end;

y la uso asi

Código Delphi [-]
MostrarForma(TfrmVentas);

Espero que te sirva.

BlueSteel 05-05-2008 22:46:46

Cita:

Empezado por jcarteagaf (Mensaje 284362)
Yo uso esta funcion


Código Delphi [-]function MostrarForma(TfrmClass: TFormClass) : boolean;
begin
with TfrmClass.Create(Application) do
begin
result := ShowModal = mrOk;
Free;
end;
end;





y la uso asi


Código Delphi [-]MostrarForma(TfrmVentas);



Espero que te sirva.


Hola jcarteagaf...

disculpa mi ignorancia... pero para que sirve esta función (no me digas que es para crear un formulario..... ).... digo tecnicamente que puedo mejorar si lo aplico en un sistema...

Salu2:p:D

jcarteagaf 06-05-2008 00:21:45

Pues a mi me evita el tener que escribir:

Código Delphi [-]
frmVentas := TfrmVentas.create(Application);
if frmVentas.Showmodal = mrOk then
  Hacer_Algo
else
  Hacer_Otra_Cosa

Simplemente digo

MostrarForma(Tfrmventas);

Y si necesito saber si el usuario presiono Ok o Cancelar

le digo

Código Delphi [-]
if ShowForm(tfrmOtraForma) then
   ....

Imaginate cuantas lineas me ahorro en una aplicación con muchas formas.

Tambien tengo este otro procedimiento que me sirve para aplicaciones MDI:

Código Delphi [-]
Procedure ShowFormMDI(TfrmClass: TFormClass;bMultiInstace : boolean);
var
  i : SmallInt;
  F : TForm;
begin
  if not bMultiInstace then
    for i := Application.MainForm.MDIChildCount - 1 downto 0 do
    begin
      F := Application.MainForm.MDIChildren[i];
      if F.ClassType = TfrmClass then
      begin
        if F.WindowState = wsMinimized then
           F.WindowState := wsNormal;
        F.BringToFront;
        Exit;
      end;
    end;
  with TfrmClass.Create(Application) do
    Show;
end;


Crea la forma y la muestra, y si ya existe y permito multiples instancias, la muestra.

Saludos.

Carlos Arevalo 06-05-2008 01:44:46

Gracias jcarteagaf tu ejemplo me funciona muy bien pero tengo la duda por que de la manera que yo lo hago no funciona?

Delphius 06-05-2008 04:13:46

Hola Carlos Arevalo,
No tengo Delphi a mano, pero creo que el error está aquí:

Código Delphi [-]
function xform(formsender: Tform; Sender: TObject): Boolean;
begin
 formsender:=Tform(formsender).Create(self);
 Tform(formsender).showmodal; // <- ¿Esto es correcto... Para mi que no?
 result:=true;
end;

Creo que debería ser así:

Código Delphi [-]
fuction xForm(FormSender: TForm; Sender: TObject): boolean;
begin
  FormSender := TForm.Create(Application);
  result := FormSender.ShowModal = mrOK;
end;

Ahora yo me pregunto ¿Y para que el parámetro sender?:confused:
No tengo Delphi a mano... pero que va.

Saludos,

Neftali [Germán.Estévez] 06-05-2008 09:51:33

Cita:

Empezado por Carlos Arevalo (Mensaje 284353)
Este es el error:
Undeclared identifier: 'Self'

Independientemente de las soluciones que te han aportado, el error que te da es debido a que el Self, se refiere al elemento actual de la clase; Es decir, si creas un objeto, desde sus métodos puedes hacer referencia a él mismo utiliznado Self.
Este procedimiento no pertenece a ninguna clase, por lo tanto no puedes llamar a Self.

No se si me expliqué bien...

Carlos Arevalo 06-05-2008 16:43:31

Gracias Neftali.

Me podrias orientar como declarar la clase para poder utilizar el Self.

Yo trate colocando:

Código Delphi [-]
type
  Tformsender = class(TForm)

Pero no me funciono, no tengo muy claro como debo hacer para declararla.


Código Delphi [-]

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms;

type
  Tformsender = class(TForm)

  end;

  function xform(formsender: Tform; Sender: TObject): Boolean;

  implementation


function xform(formsender: Tform; Sender: TObject): Boolean;
begin
//en la linea sig. esta el error
 formsender:=Tform(formsender).Create(self);
  Tform(formsender).showmodal;
  result:=true;

end;

end.

delfib 06-05-2008 17:25:34

Función genérica para crear forms usando TAction
 
Yo lo hago por medio de un TAction que al agregarlo en el ActionList le pongo el mismo nombre de la forma con prefijo act por ejemplo actMiForma, además en la forma al final del código le agrego

Código Delphi [-]
initialization
  RegisterClass(TMiForma)
finalization
  UnregisterClass(TMiForma)

Aunque esto ya lo automatice por medio de un wizard, si te interesa puedes bajar mi demás código de http://sourceforge.net/projects/delfib

Código Delphi [-]
unit uaxActionMenu;

interface

uses
  Forms, SysUtils, Classes, Controls, ActnList;

type
  TaxActionMenu = class(TCustomAction)
    procedure actAbrirVentanaExecute(Sender: TObject);
  private
    FModal: Boolean;
    FOnmrOK: TNotifyEvent;
    function CrearVentana(sForma: string): TForm;
    procedure AbrirVentana(sForma: string);
    procedure SetModal(const Value: Boolean);
    procedure domrOK;
    procedure SetOnmrOK(const Value: TNotifyEvent);
  public
    constructor Create(AOwner: TComponent); override;
    function Execute: Boolean; override;
  published
    property Caption;
    property Name;
    property ShortCut;
    property Modal: Boolean read FModal write SetModal default False;
    property OnmrOK: TNotifyEvent read FOnmrOK write SetOnmrOK;
  end;

implementation

{ TaxActionMenu }

function TaxActionMenu.CrearVentana(sForma: string): TForm;
var
  FormClass: TFormClass;
begin
  sForma:= StringReplace(sForma, 'act', 'frm',[]);
  Result:= TForm(Application.FindComponent(sForma));
  if not Assigned(Result) then
  begin
    FormClass:= TFormClass(GetClass('T' + sForma));
    if Assigned(FormClass) then
       Result:= FormClass.Create(Application);
  end;
end;

procedure TaxActionMenu.AbrirVentana(sForma: string);
begin
  if FModal then
  begin
    if CrearVentana(sForma).ShowModal = mrOK then
      domrOK
  end
  else
    CrearVentana(sForma).Show
end;

procedure TaxActionMenu.actAbrirVentanaExecute(Sender: TObject);
begin
  inherited;
  AbrirVentana(TAction(Sender).Name)
end;

constructor TaxActionMenu.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FModal:= False;
  OnExecute:= actAbrirVentanaExecute
end;

function TaxActionMenu.Execute: Boolean;
begin
  Result:= inherited Execute
end;

procedure TaxActionMenu.domrOK;
begin
  if Assigned(OnmrOK) then
    OnmrOK(Self)
end;

procedure TaxActionMenu.SetModal(const Value: Boolean);
begin
  FModal := Value;
end;

procedure TaxActionMenu.SetOnmrOK(const Value: TNotifyEvent);
begin
  FOnmrOK := Value;
end;

end.

Código Delphi [-]
unit uaxActionMenuReg;

interface

uses
  SysUtils, Classes, ActnList, uaxActionMenu;

procedure Register;

implementation

procedure Register;
begin
  RegisterActions('Menu', [TaxActionMenu], nil);
end;

end.

Neftali [Germán.Estévez] 06-05-2008 18:04:08

Cita:

Empezado por Carlos Arevalo (Mensaje 284560)
Me podrias orientar como declarar la clase para poder utilizar el Self.

La verdad es que no le veo sentido a que crees una clase para esto.
En este caso lo normal para pasarle al parámetro no es Self, sino nil o Application, dependiendo de quieen quieres que sea el "propietario".

Tu formulario ya es una clase. Si quieres hacer un "visualizador genérico" no necesitas otra. Basta con crear una función similar a la que has hecho tú.

(1º) Como ya te he dicho, olvídate del Self. no lo necesitas.
(2º) Si vas a crear tu formulario en ese procedimiento, necesitas pasar como parámetro la clase del constructor, para poder crearlo correctamente; Alguien más arriba ya te ha dado la pista (TfrmClass: TFormClass).
A partir de esa clase ya puedes hacer un:

Código Delphi [-]
  f := TFormClass.Create(application);


La franja horaria es GMT +2. Ahora son las 07:37:29.

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