Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Pasar datos de un form a otro (https://www.clubdelphi.com/foros/showthread.php?t=80031)

astrosnik 29-08-2012 18:48:04

Pasar datos de un form a otro
 
Hola amigos, soy bastante novato en delphi y me encuentro con un problmilla que me trae de cabeza a ver si alguien puede arrojarme un poco de luz:
En una aplicacion desde el form principal abro uno en modo modal con varios edits, desde este form abro otro tambien en modal donde tengo un dbgrid con los resultados de un query lo que quiero es que los datos vuelvan al segundo formulario pero me da error, pienso que debe ser alguna propiedad del form ya que si inserto un edit en el formulario de busqueda captura bien los datos
codigo delphi:
en form 3 tengo esto
begin
form2.edit2.text:=adoquery.fieldbyname('cliente').asstring;
end;
sin embargo si el edit esta en el mismo form funciona correcto
codigo delphi:
begin
edit2.text:=adoquery.fieldbyname('cliente').asstring;
end;
alguien que pueda hecharme un cable y que no sea al cuello

gracias

astrosnik 29-08-2012 18:53:08

mas datos
 
Hola otra vez referente a la pregunta que he hecho deciros que tengo las referencias a las unidades en uses y que tambien he intentado usando variables globales tanto en un form como en el otro y siempre me da error de violacion de acceso a memoria por si puede servir de algo

roman 29-08-2012 18:58:14

Hola, bienvenido al ClubDelphi. Te recomiendo que leas la guía de estilo. También te sugiero que uses las etiquetas adecuadas para poner código. Las etiquetas [code] o [delphi] te permite formatear en automático tu código.

// Saludos

ecfisa 29-08-2012 20:07:01

Hola astrosnik.

Cita:

lo que quiero es que los datos vuelvan al segundo formulario pero me da error
A la hora de ayudar tambien nos es muy útil que transcribas exáctamente el mensaje de error que te está dando. A golpe de ojo pareciera que te falto incluir la unidad de Form2 en Form3.

Form3:
Código Delphi [-]
...
implementation

uses Unidad_de_Form2;

procedure TForm3...
begin
  Form2.edit2.text := adoquery.fieldbyname('cliente').asstring;
  ...
end;
...
Pero sin saber exáctamente el error que te arroja no puedo aventurar mas.

Saludos.

astrosnik 29-08-2012 21:20:26

pasar datos de un form a otro
 
Hola eficsa gracias por responder te pongo el codigo del form 2 y del form5

Código Delphi
en form 2
Código Delphi [-]
implementation
USES
UNIT4, UNIT5;
en form 5:
Código Delphi [-]
implementation
uses
unit2;
 
procedure tform5.datos(sender: TObject);
begin
form2.Edit2.Text:=adoquery1.fieldbyname('perro').Asstring;
end;

el procedimiento datos es llamado por el evento ondblclick de un bdgrid del form5
y el error que da es el siguiente access violation at adress 004bebf9 in module proyect.exe. read of address 0000036c.

a ver si te sirve esta informacion.
pd si pongo la etiqueta para remarcar el codigo dice que no se me permite poner imagenes tendre cara de malo?:(

ecfisa 29-08-2012 21:44:16

Hola astrosnik.

¿ Y Form2 ya fué creado cuando lo invocas en Form5 ?

Para salir de dudas, proba si de este modo desaparece el error:
Código Delphi [-]
implementation
uses
  unit2;
 
procedure tform5.datos(sender: TObject);
begin
   if Assigned(Form2) then
     form2.Edit2.Text:=adoquery1.fieldbyname('perro').Asstring;
end;

Saludos.

astrosnik 29-08-2012 21:56:01

Gracias por tu ayuda ecfisa te comento:
La solucion que me has posteado si bien no da error tampoco produce cambios la mas raro es que el form2 es el que abre el form5 mediante un boton primero los abria en modal pero lo he cambiado por si era eso lo que producia el error el form 2 queda abierto mientras el form5 se ejecuta.

Muchas gracias por la ayuda compañero

ecfisa 30-08-2012 00:00:11

Hola astrosnik.

Cita:

La solucion que me has posteado si bien no da error tampoco produce cambios
En realidad no era una solución sino mas bién una prueba para identificar el problema.

Ahora intentalo de este modo:
Código Delphi [-]
implementation
uses
  unit2;
 
procedure tform5.datos(sender: TObject);
begin
  if not Assigned(Form2) then
    with TForm2.Create(nil) do
    try
      edit1.Text := adoquery1.fieldbyname('perro').Asstring;
      ShowModal;
    finally
      Free;
    end;
end;

Saludos.

astrosnik 30-08-2012 15:16:20

muchos errores y una luz
 
Hola de nuevo sobre todo agradecerte ecfisa tu ayuda porque empieza a darme un poco de luz

Código Delphi [-]
implementation
uses  unit2; 
procedure tform5.datos(sender: TObject);
begin  
  if not Assigned(Form2) then    
    with TForm2.Create(nil) do    
    try      
      edit1.Text := adoquery1.fieldbyname('perro').Asstring;      
      ShowModal;    
    finally      
      Free;    
    end;
end;

esto hace que me de un error al no encontrar el field del query aun haciendo referencia al form donde se encuentra asi que despues de muchas pruebas y mas errores he llegado a una conclusion ( casi seguro erronea dadas mis limitaciones) el problema me parece que viene porque al ser formulrios modales tienen el control de la aplicacion y no permiten manipular otro formulario por error llegue a una solucion que seguramente no sera todo lo limpia que debia, la voy a explicar por si alguno quiere corregirla o si le sirve de utilidad a alguien.

la solucion es usar otro form o un modulo que haga de puente en mi caso utilizare form4 que es el main de la aplicacion en el declaro una variable global y le asigno el valor en el procedimiento del form5

Código Delphi [-]
procedure tform5.datos(sender: TObject);
begin
  form4.perro:=adoquery1.FieldByName('perro').AsString);
  self.close
end;

despues doy la orden de cerrar el formulario y en la parte donde cree el form5

Código Delphi [-]
procedure TForm2.BitBtn1Click(Sender: TObject);
var
  varforms:tform5;
begin
  varforms:=tFORM5.Create(self);
  try
    varforms.Showmodal;
  finally
    Edit2.Text:=form4.perro;
    varforms.Free;
  end;

Aqui pasamos el valor de la variable puente al form 2 esto funciona perfectamente.
Si alguien se le ocurre como mejorar lo agradecere la ayuda asi como cualquier consejo que me haga aprender.

ecfisa 30-08-2012 18:55:14

Hola astrosnik.

En realidad no entiendo bién el problema por que si asignas el valor a Form2.Edit1 antes de mostrarlo modalmente, cuando llames al método ShowModal tiene que aparecer el valor en Form2.Edit1 (debo aclarar que por tu código pensé que el query estaba en Form5 y no en otro).

Pero de todos modos me parece conveniente poner tus querys, datasets, etc. en un TDataModule accesible a las unidades que lo precisen.

Saludos.

astrosnik 30-08-2012 19:54:28

Efectivamente ecfisa el query esta en el form5 quizas no me explique bien mi aplicacion tiene el form4 que es el main desde el cual abro el form2 en modal y desde el form2 abro el form5 en modal tambien el form2 no se cierra sigue abierto latente hasta que el form5 finalice quizas por eso no me deja manipularlo si se os ocurre cualquier otra solucion estare encantado de aprenderla

ecfisa 30-08-2012 21:18:05

Hola astrosnik.

Creo no entender el problema que se te produce utilizando el código que te puse en el mensaje #8.
Para que nos entendamos mejor te adjunto un pequeño ejemplo con dos forms. En Form5 un ADOQuery conectado a la tabla country de dbdemos.mdb (viene con Delphi), al pulsar un botón ejecuta un código básicamente igual al que te puse y muestra los campos del registro actualmente seleccionado en 5 edits residentes en Form2, que previamente fué quitado de Auto-create forms.

Espero te sirva de guía o para que puedas decirme que es lo que no estoy entendiendo de tu problema.

Saludos.

astrosnik 31-08-2012 15:11:20

Hola de nuevo ecfisa muchas gracias por tu ayuda, el ejemplo tuyo no puedo descargarlo segun el servidor no tengo permisos suficientes aunque este logueado voy a intentar explicarme mejor ruego disculpes si no he sabido hacerme entender.
Mi aplicacion lanza un formulario form4 que es el principal desde ahi con un bitbnt abro el form2 con edits para rellenar mediante el siguiente codigo

Código Delphi [-]
 
procedure TForm4.BitBtn1Click(Sender: TObject);
var
  varform:tform2;
begin
  varform:=tFORM2.Create(form4);
  try
    varform.Showmodal;
  finally
    varform.Free;
  end;


Desde el form2 con otro bitbtn abro el form5 en modal tambien con este codigo
Código Delphi [-]
procedure TForm2.BitBtn1Click(Sender: TObject);
var
  varforms:tform5;
begin
  varforms:=tFORM5.Create(self);
  try
    varforms.Showmodal;
    // aqui creo que es donde falla quizas deberia quitar la propiedad modal al form2 pero no se como
  finally
    varforms.Free;
  end;

En el form5 tengo un bdgrid y ejecuto un query al que asocion el codigo para que rellene los edits del form2.

Si pongo el codigo que me mandaste
Código Delphi [-]
  if not Assigned(Form2) then
    with TForm2.Create(nil) do
    try
      form2.edit2.Text :=form5.adoquery1.fieldbyname('perro').Asstring;
      ShowModal;
    finally
      Free;
    end;


Sigue dando el mismo error access violation at address 004bfd43 in module projrct.exe. read of address 00000370.
Espero haber explicado bien el escenario y los errores que produce gracias otra vez por tu esfuerzo.

ecfisa 31-08-2012 16:13:52

Hola astrosnik.

No sé por que no te permite descargar el archivo, estuve revisando tus permisos y no pareciera haber ningún problema. Luego miraremos con más detalle.

Te pongo el ejemplo ya que no es muy complicado (no creo que te lleve mas de 5 minutos hacerlo). Consiste en un form principal (Form4) que tiene 5 componentes:
  • 1 ADOConnection1.ConnectionString -> dbdemos.mdb
  • 1 ADOQuery1.Connection -> ADOConnection1
  • 1 DataSource1.DataSet -> ADOQuery1
  • 1 DBGrid1.DataSource -> DataSource1
  • 1 BitBtn1
Creas otro form (Form2) agregale 5 Edits, y lo sacas de Projects -> Options -> Forms -> Auto-create forms.

Luego el código en Form4:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB, Grids, DBGrids;

type
  TForm4 = class(TForm)
    BitBtn1: TBitBtn;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure BitBtn1Click(Sender: TObject);
  private
  public
  end;

var
  Form4: TForm4;

implementation {$R *.dfm}

uses Unit2; // Form2

procedure TForm4.BitBtn1Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
  try
    // Las asignaciones antes de ShowModal
    Edit1.Text := ADOQuery1.FieldByName('NAME').AsString;
    Edit2.Text := ADOQuery1.FieldByName('CAPITAL').AsString;
    Edit3.Text := ADOQuery1.FieldByName('CONTINENT').AsString;
    Edit4.Text := ADOQuery1.FieldByName('AREA').AsString;
    Edit5.Text := ADOQuery1.FieldByName('POPULATION').AsString;
    ShowModal;
  finally
    Free;
  end;
end;
end.
Veras que muestra los campos en los edits de Form2 del registro actualmente seleccionado desde el DBGRid sin problemas.

Saludos.

astrosnik 02-09-2012 22:17:46

Gracias por tu ayuda una vez mas ecfisa tu ejemplo funciona perfectamente pero tu ejemplo y el mio tienen una diferencia:
En tu ejemplo tu asignas los valores a los edits despues de crear el form2 y antes de mostrarlo en el mio el form2 ya esta creado y mostrado en modal puesto que contiene ya valores que proceden del form4 no puedo cerrarlo creo que ahi radica el problema del error que al ser un formulario modal y ya estar creado y mostrado no permite que otro form lo manipule.
La verdad que es mas una curiosidad y una solucion para el futuro ya que con la solucion que postee antes funciona seguire investigando y si encuentro otra solucion.
Un saludo

ecfisa 02-09-2012 22:41:32

Hola astrosnik.

Cita:

en el mio el form2 ya esta creado y mostrado en modal
De ese modo no veo factible la asignación, ya que al mostrar a Form2 de forma modal, este no devuelve el control hasta que se cierre. Por lo que, las líneas de asignación posteriores al método ShowModal, no serán ejecutadas hasta despues de que Form2 devuelva el control.

Saludos.

Rectifico, debí decir: De ese modo no veo factible la visualización de los datos asignados. :o

astrosnik 02-09-2012 23:42:34

mil gracias
 
Hola efcisa:
Muchas gracias por tus aclaraciones y indicaciones asi como los ejemplos mostrados que me seran de mucha utilidad resueltas mis dudas sobre formularios modales y habiendo encontrado una solucion para mi problema por mi parte doy por cerrado el tema.
Un saludo

destrukthor 06-03-2017 18:08:15

Violacion de Acceso
 
Gracias a todos en el foro, sus ejemplos resolvieron un problema que tenia desde un modulo de datos para abrir formularios de conexión de instancias de bases de datos.

Un gran aporte estimados y una importante ayuda a los que nos gusta la programación, pero no tenemos mucho tiempo para ello.

Saludos...


La franja horaria es GMT +2. Ahora son las 12:28:09.

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