Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Herencia visual y variables públicas

Amigos, soy novato en Delphi y quisiera hacerles una pregunta, genero dos formularios base donde en cada uno de ellos pongo una programación base que utilizaré.
Luego de uno heredo visualmente los formularios modales y del otro heredo visualmente los formularios no modales.
El problema se suscita cuando quiero acceder a por ejemplo un objeto TEdit de un formulario desde otro formularios. Pongo el formulario que deseo acceder en el use de la unidad y luego cuando le asigno un valor al TEdit:

Form1.edit.text := valor

curiosamente este edit no recibe el valor que asigno, es como si no hubiese asignado nada. Cosa que no me sucede cuando trabajo con formularios no heredados.

¿Alguien me puede decir que estoy haciendo mal?
Responder Con Cita
  #2  
Antiguo 05-11-2008
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
Necesitas dar un poco más de información, por ejemplo, ¿cómo creas los formularios? Si usas Form1 := TForm1.Create(Application) no sé de donde viene el problema pero si usuas TForm1.Create(Application).Show el problema es que Form1 es nil, no puedes referenciarlo mediante la variable pública.

mmmmhhh no sé si me he explicado.
Responder Con Cita
  #3  
Antiguo 05-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

¿Estás seguro que Form1 es una variable que apunta al formulario que deseas?

Ahora, algo que yo hago cuando quiero usar formularios a los que les mando valores para mostrar es crear propiedades públicas que hagan esa función:

Código Delphi [-]
type
  TForm1 = class(TForm)
    // Componentes
  private
    function GetNombre: string;
    procedure SetNombre(const Value: string);
  public
    property Nombre: string read GetNombre write SetNombre;
  end;

implementation

function TForm1.GetNombre: string;
begin
  Result := Edit1.Text
end;

procedure TForm1.SetNombre(const Value: string);
begin
  Edit1.Text := Value
end;

Así ya puedo hacer algo como:

Código Delphi [-]
begin
  with TForm1.Create(nil) do
    try
      Nombre := 'Filomeno';
      if ShowModal = mrOk then
        ShowMessage(Nombre)
    finally
      Free
    end
end;

Espero te sirva...



Saludos...
Responder Con Cita
  #4  
Antiguo 05-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Es justamente lo que hago, ¿cómo puedo arreglar ese problema?
Responder Con Cita
  #5  
Antiguo 05-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Pues así como lo explicas, la verdad no se te puede ayudar mucho...

Si pones algo de código tal vez podramos ver mejor donde está tu problema...



Saludos...
Responder Con Cita
  #6  
Antiguo 05-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Esta es la forma como creo el formulario:

class procedure Tf_sName.MostrarVentana(ATag : Integer);
var
i : Integer;
f : TForm;
begin
LockWindowUpdate(Application.MainForm.Handle);
try
for i := Screen.FormCount - 1 downto 0 do begin
f := Screen.Forms[i];
if(f is Self) then begin
if(f.WindowState = wsMinimized) then
f.WindowState := wsNormal;
f.BringToFront;
Exit;
end;
end;
f := Create(Application);
f.Tag := ATag;
f.Show;
finally
LockWindowUpdate(0);
end;
end;
Responder Con Cita
  #7  
Antiguo 05-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Cita:
Empezado por rarratia Ver Mensaje
Esta es la forma como creo el formulario:

Código Delphi [-]
class procedure Tf_sName.MostrarVentana(ATag : Integer);
var
 i : Integer;
 f : TForm;

begin
  LockWindowUpdate(Application.MainForm.Handle);
  try
    for i := Screen.FormCount - 1 downto 0 do begin
      f := Screen.Forms[i];
      if (f is Self) then begin
        if (f.WindowState = wsMinimized) then
          f.WindowState := wsNormal;
        f.BringToFront;
        Exit;
      end;
    end;
    f := Create(Application);
    f.Tag := ATag;
    f.Show;
  finally
    LockWindowUpdate(0);
  end;
end;
Según tu código, solo creas y muestras la forma, pero en ningún momento la asignas a una variable de objeto que siga "viva" fuera del método...

Así que si haces algo como Form1.Edit1.Text := Valor, obviamente no va a pasar nada (bueno si, un error de violación de memoria )...


Por cierto, cuando pongas código usa las etiquetas [ DELPHI ] [ /DELPHI ] (sin los espacios en blanco) para que este se vea mejor, fijate en la diferencia entre el código en el quote de este mensaje y el que tu pusiste...

Saludos...
Responder Con Cita
  #8  
Antiguo 06-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Ahora entiendo, si la Class Function esta definida en los formularios padres de donde se heredan todos los demás debo en el evento create colocar lo siguiente:

Código Delphi [-]
Form1 := Self;
Responder Con Cita
  #9  
Antiguo 06-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Esto que comentas, si bien puede solucionar tu problema, no es muy recomendable hacerlo.

Lo mejor sería que el método de clase sea la que devuelva ese valor:

Código Delphi [-]
class procedure TParentForm.ShowWindow(ATag: Integer; var Reference);
var
  i: Integer;
  AForm: TForm;

begin
  LockWindowUpdate(Application.MainForm.Handle);
  try
    for i := Screen.FormCount - 1 downto 0 do
    begin
      AForm := Screen.Forms[i];
      if (AForm = Reference) then
      begin
        if (AForm.WindowState = wsMinimized) then
          AForm.WindowState := wsNormal;
        AForm.BringToFront;
        Exit
      end
    end;
    AForm := Create(Application);
    AForm.Tag := ATag;
    AForm.Show;
    Reference := AForm
  finally
    LockWindowUpdate(0)
  end
end;

De esta forma puedes hacer algo como:

Código Delphi [-]
var
  Form1: TForm1;

begin
  TForm1.ShowWindow(1, Form1)
end;


Saludos...
Responder Con Cita
  #10  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Bien, entonces para formularios modales ¿podríamos tener algo así?
Código Delphi [-]
class function TParentForm.ShowWindow(ATag : Integer; var Reference) : TModalResult;
var
AForm : TForm;
begin
  AForm := Create(Application);
  AForm.Tag := ATag;
  Try
    Result := AForm.ShowModal;
  finally
    Free;
  end;
end;
Responder Con Cita
  #11  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Me faltó algo:

Código Delphi [-]
class function TParentForm.ShowWindow(ATag : Integer; var Reference) : TModalResult;
var
AForm : TForm;
begin
  AForm := Create(Application);
  Reference := AForm; // Esto había quedado en el tintero
  AForm.Tag := ATag;
  Try
    Result := AForm.ShowModal;
  finally
    Free;
  end;
end;
Responder Con Cita
  #12  
Antiguo 07-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

En tu método de clase liberas la forma que creas, así que al salir de la función, Reference tendrá un valor no válido.

En este caso sería mejor solo hacer algo como:

Código Delphi [-]
class function TParentForm.ShowWindow: TModalResult;
begin
  with Self.Create(nil) do
    try
      Result := ShowModal
    finally
      Free
    end
end;

Si te fijas, el método de clase no recibe ningún parámetro y solo devuelve el resultado de ModalResult...



Saludos...
Responder Con Cita
  #13  
Antiguo 07-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
maeyanes, ¿usas Self en un procedimiento de clase?, supongo que se te ha ido el dedo ¿no?
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 07-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Nop, no se me ha ido el dedo. En un método de clase, Self representa a la clase. Esto es Self = TParentForm y en una clase descendiente, por ejemplo TShowNombreForm, Self sería igual a TShowNombreForm.

Cita:
Empezado por Delphi Help
In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use the Self to access instance fields, instance properties, and normal (object) methods, but you can use it to call constructors and other class methods, or to access class properties and class fields.

A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.


Saludos...
Responder Con Cita
  #15  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
Pero si es necesario el ATag para poder decidir lo que hacer dentro del formulario ShowModal, cómo paso el ATag????
Responder Con Cita
  #16  
Antiguo 07-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Pues como un parámetro:

Código Delphi [-]
class function ShowWindow(ATag: Integer): TModalResult;



Saludos...
Responder Con Cita
  #17  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
pero es una función de clase y el objeto aún no se crea, ¿cómo consigo acceder al atributo Tag?
Responder Con Cita
  #18  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
No conseguiré acceder al tag desde el formulario ShowModal, vendrá en 0
Responder Con Cita
  #19  
Antiguo 07-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Claro que si podrás:

Código Delphi [-]
class function TParentForm.ShowWindow(ATag: Integer): TModalResult;
begin
  with Self.Create(nil) do
    try
      // Aquí estamos asignando el valor a la propiedad Tag de la forma creada
      Tag := ATag;
      Result := ShowModal
    finally
      Free
    end
end;


Saludos...
Responder Con Cita
  #20  
Antiguo 07-11-2008
rarratia rarratia is offline
Miembro
 
Registrado: sep 2004
Posts: 50
Poder: 20
rarratia Va por buen camino
recuerda que este código está en el formulario Padre y que heredo de él un formulario hijo, luego cuando ejecuto esta función de clase que es un método del padre, pero lo ejecuto del formulario visual hijo, me aparece tag=0
es raro.
Responder Con Cita
Respuesta



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
Conexion Remota (IP PÚBLICAS) JAI_ME Varios 5 20-05-2008 23:11:00
Problema herencia visual en form diegofhernando OOP 8 19-05-2008 16:41:33
Herencia visual en formularios... diegofhernando OOP 4 18-04-2008 10:54:05
Herencia visual con TFrames y otros asuntos walrus OOP 6 19-09-2004 02:38:12
No se ven controles en herencia visual Sirkius OOP 10 07-06-2004 22:25:32


La franja horaria es GMT +2. Ahora son las 07:27:34.


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
Copyright 1996-2007 Club Delphi