Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2008
Carlos Arevalo Carlos Arevalo is offline
Miembro
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 111
Poder: 15
Carlos Arevalo Va por buen camino
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
__________________
Carlos Arevalo
MSN Messenger: carlos@arevalo.com.ve
Responder Con Cita
  #2  
Antiguo 05-05-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 12
jcarteagaf Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 05-05-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Talcahuano - Chile
Posts: 2.291
Poder: 17
BlueSteel Va por buen camino
Cool

Cita:
Empezado por jcarteagaf Ver Mensaje
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
__________________
BlueSteel
Responder Con Cita
  #4  
Antiguo 06-05-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 12
jcarteagaf Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 06-05-2008
Carlos Arevalo Carlos Arevalo is offline
Miembro
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 111
Poder: 15
Carlos Arevalo Va por buen camino
Gracias jcarteagaf tu ejemplo me funciona muy bien pero tengo la duda por que de la manera que yo lo hago no funciona?
__________________
Carlos Arevalo
MSN Messenger: carlos@arevalo.com.ve
Responder Con Cita
  #6  
Antiguo 06-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 19
Delphius Va camino a la fama
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?
No tengo Delphi a mano... pero que va.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 06-05-2008
Avatar de Neftali
Neftali Neftali is offline
-Germán Estévez-
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 15.368
Poder: 10
Neftali Va camino a la famaNeftali Va camino a la fama
Cita:
Empezado por Carlos Arevalo Ver Mensaje
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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 06-05-2008
Carlos Arevalo Carlos Arevalo is offline
Miembro
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 111
Poder: 15
Carlos Arevalo Va por buen camino
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.
__________________
Carlos Arevalo
MSN Messenger: carlos@arevalo.com.ve
Responder Con Cita
  #9  
Antiguo 06-05-2008
Avatar de delfib
delfib delfib is offline
Miembro
 
Registrado: abr 2008
Ubicación: Los Mochis Sinaloa
Posts: 12
Poder: 0
delfib Va por buen camino
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.

Última edición por delfib fecha: 06-05-2008 a las 18:50:59.
Responder Con Cita
  #10  
Antiguo 06-05-2008
Avatar de Neftali
Neftali Neftali is offline
-Germán Estévez-
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 15.368
Poder: 10
Neftali Va camino a la famaNeftali Va camino a la fama
Cita:
Empezado por Carlos Arevalo Ver Mensaje
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);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como hacer para que una funcion regrese varios valores jangel_ramirezm Varios 11 07-03-2008 23:14:49
Crear un form fsMDIForm y varios forms hijos citlalliDgp Varios 11 07-12-2007 16:13:31
funcion genérica para cargar combos Byfed Varios 7 08-04-2007 02:14:36
Problemas para crear una funcion fartycl Varios 1 04-07-2006 20:47:50
Función Genérica radaalvaro .NET 0 28-06-2006 17:51:29


La franja horaria es GMT +2. Ahora son las 02:10:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi