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 28-07-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
retornar de un Form

buno gente estoy arrancando con delphi y tengo esta duda, como puedo hacer para retornar un dato (ya sea un objeto o una lista o un entero o lo q sea) desde un Form??? ejemplo. supongamos q tengo un form (probablemente modal) para hacer una búsqueda de una lista elementos, como retorno el elemento seleccionado???

Gracias
Responder Con Cita
  #2  
Antiguo 28-07-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Puedes hacer dos cosas, la primera y mas básica es leer desde donde has creado el form las propiedades de los componentes. Todos los componentes que adhieras al form desde el editor siempre quedan como públicos.
Lo que yo suelo hacer, cuando un form tiene una funcionalidad particular, es lo siguiente:

Código Delphi [-]
function TfrmFileDialog.Execute(const Title, Msg: string; var Value: string): boolean;
begin
  Caption := Title;
  lbMessage.Caption := Msg;
  edFileName.Text := Value;

  Result := ShowModal = mrOk;

  if Result then
    Value := edFileName.Text;
end;

Y en lugar de llamar al ShowModal, utilizo la función Execute definida por mi que me soluciona toda la lógica propia del formulario.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 29-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
O lo añades como propiedad del form.
Después de visualizarlo y antes de destruirlo la consultas. Algo así:

Código Delphi [-]
form1 := TForm1.Create(...)
try
  Form1.ShowModal;
  Valor := Form1.MiPropiedad;
finally
  FreeAndNil(form1);
end;

En el OnClose del Form1 recuerda asignar:

Código Delphi [-]
Action := caHide;
__________________
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
  #4  
Antiguo 04-08-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
ok, gracias amigos, me despejaron una duda antes de q meta la pata en el diseño gracias
Responder Con Cita
  #5  
Antiguo 09-09-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
oto problema, el form termino siendo mdi y no consigo salir de el sin eliminarlo, se minimiza como default, les paso algo de codigo, en el main lo creo asi:

procedure TMainForm.EliminarDepartamento1Click(Sender: TObject);
var
vElimDep: TfmSeleccionarDepartamento;
begin
vElimDep := TfmSeleccionarDepartamento.Create(self);
ShowWindow(vElimDep.Handle, SW_SW_SHOWNORMAL );
end;
Responder Con Cita
  #6  
Antiguo 09-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

En el evento OnClose de TMainForm, ponè lo siguiente:

Código Delphi [-]
begin
   Action:= caFree;
end;

Saludos.
Responder Con Cita
  #7  
Antiguo 09-09-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola ericgs, según tu ejemplo debes colocar el codigo que te indica ecfisa en el OnClose de tu formulario TfmSeleccionarDepartamento que debe ser tu MDIChild. En las aplicaciones MDI por defecto todas las ventanas hijas se minimizan al cerrarlas.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 09-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por ecfisa Ver Mensaje
Hola.
En el evento OnClose de TMainForm, ponè lo siguiente:
Saludos.
Tál como dice Caro, Action:= caFree, va en los MDIChilds.

Realmente equivoqué al escribir el nombre del Form, mis disculpas

Saludos.

Última edición por ecfisa fecha: 09-09-2010 a las 19:17:03.
Responder Con Cita
  #9  
Antiguo 10-09-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
el problema va en que si pongo:

Código Delphi [-]
 vModDep := TfmModificarDepartamento.Create(Self);
  ShowWindow(vModDep.Handle, SW_SHOWNORMAL);
  var:=vModDep.loQueSeaQueQuieraSacar;

la 3º linea se ejecuta justo después del ShowWindow, antes de que pueda hacer algo, al diferencia del modal
Responder Con Cita
  #10  
Antiguo 10-09-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ericgs Ver Mensaje
la 3º linea se ejecuta justo después del ShowWindow, antes de que pueda hacer algo, al diferencia del modal
No acabo de entender cual es el problema.
Quieres recuperar un valor justo después de cerrar el formulario.
Si lo muestras modal, tendrás que destruirlo después de obtener el valor, sino tendrás problemas.

Código Delphi [-]
  vModDep := TfmModificarDepartamento.Create(Self); 
  try
    vModDep.ShowModal;    //=> Utiliza Action := caHide para luego poder recuuperar el cvalor.
    var := vModDep.loQueSeaQueQuieraSacar;  //(1)
  finally
    vModDep.Free; // lo destruyes
  end;

En este caso no puedes usar el Action := caFree, porque puede ser que cuando llegues a la línea (1) es formulario ya esté destruído o destruyendose.

Si no lo muestras modal, debes utilizar otro sistema, ya que necesitas que la línea se ejecute al cerrar el form (me imagino). Utilizar algunos de los eventos de salida para devolver el valor.
__________________
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
  #11  
Antiguo 13-09-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
perdón no me exprese bien, en el codigo anterior estoy creando una ventana mdi (child), por lo q no puede ser modal
Responder Con Cita
  #12  
Antiguo 13-09-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
La otra opción, como ya te he dicho puede ser utilizando un evento. En mi caso más de una vez he utilizado algo similar a esto.

En el formulario MDI que vas a destruir defines un evento tal que así:

Código Delphi [-]
  published
    property MyOnClose:TNotifyEvent read FMyOnClose write FMyOnClose;

Cuando creas ese formulario "enganchas" el evento a un procedimiento tuyo para recibirlo:

Código Delphi [-]
  // creo el form
  Form2 := TForm2.Create(Application);
  // Redirijo el evento a un procedimiento mío
  Form2.MyOnClose := _CerrarForm;
  // Visualiza
  Form2.Show;

Al cerrar el form2 (el MDIChild) antes de destruirlo "aviso" utilizando el evento:

Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Antes de destruirlo levantamos el evento
  if Assigned(Self.FMyOnClose) then begin
    Self.MyOnClose(Self);
  end;
  // Mandamos que se libere
  Action := caFree;
end;

Y en el momento de destruir el Form2 (MDIChild) al leventar el evento, llegará el control a mi procedimiento:

Código Delphi [-]
procedure TForm1._CerrarForm(Sender: TObject);
begin
  MessageDlg('Se está cerrando el formulario: ' + TForm(Sender).Name, mtInformation, [mbOK], 0);
end;

Parece más complejo de lo que es, pero en realidad es bastante sencillo.
Te adjunto el código para que veas cómo funciona.
Archivos Adjuntos
Tipo de Archivo: zip CerrarMDI.ZIP (2,7 KB, 9 visitas)
__________________
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
  #13  
Antiguo 14-09-2010
Avatar de JoseAntonio
JoseAntonio JoseAntonio is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lima - Ciudad de los Reyes.
Posts: 87
Poder: 19
JoseAntonio Va por buen camino
Cool

Yo lo hago utilizando una funcion de clase, mas o menos el codigo es asi...

Código Delphi [-]
Unit FormSelLote
...
class function TfrmSelLote.GetLote(AClient, ADoc: Integer): integer;
var
  ...
  AFrmSelLote: TfrmSelLote;
begin
   ....
  try
    AfrmSelLote := TFrmSelLote.Create(Application);    
    if AfrmSelLote.ShowModal = mrOk then
      result := AfrmSelLote.fLote
    else
      result := -1;
  finally
    AfrmSelLote.Free;
  end;
end;

// la llamada desde otro modulo seria asi

unit OtraUnidad
.....
AselLote := TfrmSelLote.getLote(ACliente, ADoc);

espero que sirva sl2
__________________
nuestro carácter está reflejado en cada línea de código que escribimos.
Responder Con Cita
  #14  
Antiguo 14-09-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por JoseAntonio Ver Mensaje
Yo lo hago utilizando una funcion de clase, mas o menos el codigo es asi...
ericgs has comentado más arriba que no debe ser modal, de ahí el problema que se plantea.
__________________
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
  #15  
Antiguo 14-09-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
Muchas gracias, la verdad no se me hubiera ocurrido, gracias a todos.

Un saludo
Responder Con Cita
  #16  
Antiguo 14-09-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Para mi gusto, la opción de Neftalí es la más adecuada. No obstante, sería bueno que te cuestionaras si lo que estás haciendo es lo más correcto. Un formulario como TfmSeleccionarDepartamento tiene toda la pinta de ser un formulario modal, no hay porqué hacerlo MDIChild. En una aplicación MDI puede haber formularios MDI y no MDI, y todo lo que sea o se asemeje a un cuadro de diálogo en donde el usuario va a escoger algo, debería se un formulario modal.

// Saludos
Responder Con Cita
  #17  
Antiguo 16-09-2010
ericgs ericgs is offline
Miembro
 
Registrado: abr 2010
Posts: 11
Poder: 0
ericgs Va por buen camino
es exactamente lo q le dije yo, pero como el programa sera introducido dentro de otro en el cual es todo mdi (o eso me dijeron) tiene q ser mdi.
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
Intraweb Retornar Pagina Anterior ggram2 Internet 0 24-03-2009 01:50:31
Cómo hacer para retornar valores de una Unit a otra karo Varios 6 14-03-2009 20:57:28
Retornar o no retornar desde un script principal dec PHP 6 24-03-2008 23:41:12
retornar un valor Proc.Almacenado cacu OOP 1 05-03-2008 22:39:16
Como retornar un valor en Delphi Stanley Varios 8 29-10-2007 04:04:03


La franja horaria es GMT +2. Ahora son las 21:41:00.


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