Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   retornar de un Form (https://www.clubdelphi.com/foros/showthread.php?t=69136)

ericgs 28-07-2010 16:24:09

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

delphi.com.ar 28-07-2010 17:30:42

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!

Neftali [Germán.Estévez] 29-07-2010 16:11:59

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;

ericgs 04-08-2010 15:23:36

ok, gracias amigos, me despejaron una duda antes de q meta la pata en el diseño gracias

ericgs 09-09-2010 14:46:36

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;

ecfisa 09-09-2010 15:20:59

Hola.

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

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

Saludos.

Caro 09-09-2010 17:54:06

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

ecfisa 09-09-2010 18:59:41

Cita:

Empezado por ecfisa (Mensaje 375851)
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.

ericgs 10-09-2010 13:47:24

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

Neftali [Germán.Estévez] 10-09-2010 13:58:33

Cita:

Empezado por ericgs (Mensaje 375978)
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.

ericgs 13-09-2010 15:51:58

perdón no me exprese bien, en el codigo anterior estoy creando una ventana mdi (child), por lo q no puede ser modal

Neftali [Germán.Estévez] 13-09-2010 16:33:35

1 Archivos Adjunto(s)
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.

JoseAntonio 14-09-2010 00:01:19

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

Neftali [Germán.Estévez] 14-09-2010 09:46:50

Cita:

Empezado por JoseAntonio (Mensaje 376298)
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.

ericgs 14-09-2010 13:46:28

Muchas gracias, la verdad no se me hubiera ocurrido, gracias a todos.

Un saludo

roman 14-09-2010 15:48:28

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

ericgs 16-09-2010 17:45:39

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.


La franja horaria es GMT +2. Ahora son las 02:51:45.

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