PDA

Ver la Versión Completa : por favor necesito ayuda con unos formularios...


arnovisr
23-05-2012, 18:00:24
Hola a todos, gracias por su tiempo... a ver si me puedo explicar...
Tengo un form1 (principal) del cual llamo a un Form2 y este a su vez llama a un form3, form2 y form3 están disponibles (no los creo al arrancar), los creo en tiempo de ejecución, lo que necesito es poder pasar datos del Form3 al form2 (algo que parece sencillo) pero cuando trato de hacerlo me manda error.

oscarac
23-05-2012, 18:03:49
podrias decir que error te manda?
sin ese dato se pone complicado que alguien te pueda ayudar.....

roman
23-05-2012, 18:05:25
No sólo el error, sino la manera en que intenta pasar los datos. Así sin más, es casi imposible.

// Saludos

arnovisr
23-05-2012, 18:08:23
gracias por sus respuestas claro que pena: el error que manda es Access Violation y trato es simplemente de mandar los datos que Tiene un DBGrid (que está en Form3) a unos Edit's (que están en Form2), la cuestión es que estos 2 formularios los creo en tiempo de ejecucion: con F:= TForm2.create(self) ya saben...

oscarac
23-05-2012, 18:20:24
eso no tiene nada que ver
creo que deberias colocar mas codigo.. de como lo estas haciendo...
donde lo invocas... como pasas los datos etc..

para poder entenderlo mejor

arnovisr
23-05-2012, 18:33:21
Bueno lo que hago es lo siguiente:
En Form1...
implementation
Uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var f: TForm2;
begin
F:= TForm2.create(self);
try
F.Showmodal;
finally
f.free;
end;
end;


En formulario 2:...

implementation
uses unit3;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var f: TForm3;
begin
F:= TForm3.create(self);
try
F.Showmodal;
finally
f.free;
end;
end;


Y en el formulario 3

implementation
Uses Unit1, Unit2;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
form1.Edit1.Text:= edit1.Text;
form1.Edit2.Text:= edit2.Text;
form2.Edit1.Text:= edit1.Text;
form2.Edit2.Text:= edit2.Text;
end;

y me manda el siguiente error:

Access Violation

ecfisa
23-05-2012, 18:38:29
Hola arnovisr.

Por favor cuando incluyas código en tus mensaje utiliza TAG's para darle más legibilidad. Te pongo una imágen que explica el uso:

http://img403.imageshack.us/img403/3461/75416396.jpg

Saludos y gracias por tu colaboración. :)

ecfisa
23-05-2012, 18:49:57
Hola de nuevo.

Suponiendo que Form1 sea el form principal, lo primero que surge preguntarse es:

procedure TForm3.Button1Click(Sender: TObject);
begin
form1.Edit1.Text:= edit1.Text;
form1.Edit2.Text:= edit2.Text;
form2.Edit1.Text:= edit1.Text; // <=== ¿ Existe Form2 en el momento de esta asignación ?
form2.Edit2.Text:= edit2.Text;
end;


Una solución para evitar la exepcion es verificarlo:

if Assigned(Form2) then
form2.Edit1.Text:= edit1.Text;
...

Pero deberías asegurarte de poner Form2 igual a nil en el evento OnClose u OnDestroy de Form2.

De todos modos no es 'la' solución, deberías revisar el modo en que creas y llamas los forms.

Saludos.

arnovisr
24-05-2012, 01:43:00
Bueno señores, les cuento que todo está como al principio, con lo que me han dicho no he solucionado nada y ya he probado todo lo que me han sugerido...

A ver Form1, es el principal, los demás están disponibles (Project - Options - Forms - Available forms), por eso las creo en tiempo de ejecución: la Form2 desde la form1, y la Form3 desde la form2.


Form2:= TForm2.Create(self);
try
Form2.ShowModal;
finally
Form2.Free;
end;


Y


Form3:= TForm3.Create(self);
try
Form3.ShowModal;
finally
Form3.Free;
end;


Luego en la Form3, selecciono unas celdas de un DBGrid, que deben mandar esos datos a unos Edit's en Form2, de esta manera:


Form1.Edit1.Text:= DBG.Fields[0].AsString;
Form1.Edit2.Text:= DBG.Fields[1].AsString;
Form2.ECodGrupo.Text:= DBG.Fields[0].AsString;
Form2.EDescGrupo.Text:= DBG.Fields[1].AsString;


Y ahí está el problema: me sale el error, Access Violation, en cambio si los mando a los Edit's que coloco en el el Form1 y si los manda, pero los necesito es en el Form2. Gracias por la colaboración que me puedan dar...

Casimiro Notevi
24-05-2012, 02:27:05
Lo que haces y tus explicaciones están muy confusas, por favor, explica claramente lo que haces, lo que quieres hacer, muestra el código (todo lo posible), etc.

arnovisr
24-05-2012, 02:35:24
Sospecho que me están evadiendo con la respuesta, considero que mi consulta ya ha sido lo suficientemente explicada, agradezco que me colaboren con el problema, pero si no saben como ayudar por favor no confundan más... no creo que haya mucho que explicar, cuando creo que está bastante explicada:

Tengo 3 formularios, uno principal y dos que creo de manera dinámica, o en tiempo de ejecución, lo que hago es crear uno a continuación del otro, y cuando trato de mandar datos del tercero al segundo me manda error, así de sencillo... en cambio si lo mandara al primero me sale bien, no veo que otra cosa haya que explicar... muchas gracias a los que me puedan colaborar...

Casimiro Notevi
24-05-2012, 02:55:49
Sospecho que me están evadiendo con la respuesta
Por supuesto, es que nos pagan demasiado poco por atender este servicio técnico, por eso no nos esforzamos mucho en contestar.

considero que mi consulta ya ha sido lo suficientemente explicada, agradezco que me colaboren con el problema, pero si no saben como ayudar por favor no confundan más...
Debes comprender que no somos muy inteligentes, nos gusta tener entretenido a nuestros clientes

Tengo 3 formularios, uno principal y dos que creo de manera dinámica, o en tiempo de ejecución, lo que hago es crear uno a continuación del otro, y cuando trato de mandar datos del tercero al segundo me manda error, así de sencillo...
"Me manda error", una explicación muy académica, muy clara, muy explicativa, cualquiera lo entiende ;)

Venga, que tengas suerte.

ecfisa
24-05-2012, 03:01:22
Hola.

A ver Form1, es el principal, los demás están disponibles (Project - Options - Forms - Available forms), por eso las creo en tiempo de ejecución: la Form2 desde la form1, y la Form3 desde la form2.


Estimado, ahora que sé como haces la creación de los forms, te diría que el error no se provoca en ella ni en el pasaje de datos de Form3 a Form2 y Form1.

A ver, esta fué la prueba que hice:

Form1:

implementation

uses Unit2;

procedure TForm1.btAbrirForm2Click(Sender: TObject);
begin
Form2:= TForm2.Create(self);
try
Form2.ShowModal;
finally
Form2.Free;
end;
end;


Form2:

implementation

uses Unit3;

procedure TForm2.btAbrirForm3Click(Sender: TObject);
begin
Form3:= TForm3.Create(self);
try
Form3.ShowModal;
finally
Form3.Free;
end;
end;


Form3:

implementation

uses Unit2, Unit1;

procedure TForm3.btPasarTextClick(Sender: TObject);
begin
// Darle valores a los edits
Edit1.Text:= 'Form3.Edit1';
Edit2.Text:= 'Form3.Edit2';
Edit3.Text:= 'Form3.Edit3';
Edit4.Text:= 'Form3.Edit4';

// Pasar a Edits de Form1
Form1.Edit1.Text:= Edit1.Text;
Form1.Edit2.Text:= Edit2.Text;

// Pasar a Edits de Form2
Form2.ECodGrupo.Text:= Edit3.Text;
Form2.EDescGrupo.Text:= Edit4.Text;
end;

De ese modo transfiere los valores desde Form3 a Form1 y Form2 sin ningún tipo de error.

Sospecho que me están evadiendo con la respuesta
Creo que estás confundido no sólo con el problema sino también con el juicio que emites, nadie ha tratado de evadir las respuestas, aquí cada uno aporta lo que su conocimiento y experiencia le indica y sin percibir un centavo por ello.

considero que mi consulta ya ha sido lo suficientemente explicada
No, no es así. Recién en el anteúltimo mensaje nos enteramos el órden de creación.

agradezco que me colaboren con el problema, pero si no saben como ayudar por favor no confundan más...
Lamento muchísimo si en nuestro afán de brindarte ayuda pudimos confundirte aún más.

Y para que no quede ninguna duda de nuestra buena voluntad, te adjunto el ejemplo para que puedas cotejarlo con tu código.

Saludos y no te olvides de leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

arnovisr
24-05-2012, 04:04:26
Bueno, la verdad es que me siento mal por haber manifestado mi estado de ánimo de esa forma en que lo hice, de pronto me dejé llevar porque es que siento que me tiene atrancado esta situación y al no ver que me hago explicar bien, cuando pienso que lo he estado haciendo de pronto me dejé llevar, pero de verdad ofrezco mil disculpas y espero me las acepten...

Muchas gracias a todos los que me han dado su muy buena opinión, espero aplicar las sugerencias a ver como me va con eso y luego contaré como me fue...

Casimiro Notevi
24-05-2012, 04:13:21
Cualquiera tiene un mal día, ya verás que con las explicaciones que ha dado el compañero ecfisa consigues hacer funcionar correctamente tu programa.
Saludos.

arnovisr
24-05-2012, 04:46:45
A Todos los que me ayudaron muchísimas gracias a Casimiro Notevi, a ecfisa, a oscarac, a Roman, a todos me ayudaron a comprender bien como es que funciona esto de la creación de formularios en tiempo de ejecución correctamente, problema resuelto, a ver si me puedo explicar bien como funcionó todo:
1. Resulta que tengo una unidad externa donde utilizo un metodo para crear los formularios pasando como parámetro el formulario a crear. Este método lo aplicaba con nueva.create(application) y pues así lo llamaba cada vez que lo necesitaba y así me mandaba el error: Access Violation,
2. Gracias a sus consejos: utilizo ahora TFCatalogo.Create(self); en el llamado a los otros dos formularios y santo remedio: arreglado....
Bueno no he estudiado muy bien la diferencia entre el funcionamiento de la .Create con Self y con Application (estoy en eso)... pero con sólo eso se solucionó el problema, es increíble, y pensar que pasé todo el día dándole a esto y atascado con ello... pero de verdad muchas gracias a todos...

Ah y en serio mis más sentidas disculpas a todos de pronto si mi lenguaje no fue el adecuado, mis excusas... muchísimas gracias...

ecfisa
24-05-2012, 04:48:49
Hola arnovisr.

Como bién dice Casimiro, aquí no ha pasado nada ;), lo importante es que solucionaste tu problema.

Saludos :)

ecfisa
24-05-2012, 05:06:06
Hola arnovisr.

Si querés ampliar sobre como asignar el propietario en la creación: Application, self, nil, etc... te pongo unos pocos enlaces que creo que te van interesar:

Como llamar formularios desde otro formulario ? (http://www.clubdelphi.com/foros/showthread.php?t=78598)
Free a un componente dentro de otro (http://www.clubdelphi.com/foros/showthread.php?t=76600)
Sencilla pregunta sobre owners (http://www.clubdelphi.com/foros/showthread.php?t=78817)

Encontrarás mucho mas material buscando aquí mismo en los foros.

Saludos.

arnovisr
25-05-2012, 04:05:13
Muchísimas gracias Ecfisa por este material, de verdad que me pondré inmediatamente a estudiarlos, me servirán muchísimo, mil gracias...