![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
![]() Pido disculpas pero aqui voy de nuevo.....
El problemas parece estar cuando un formulario (form1) crea a otro (form2) con create y luego ese crea a un tercero (form3) con create tambien... Cuando el form3 quiere pasarle algun valor al form2 aparece el error que es bastante largo pero habla de un ...EAccess Violation raised project1.exe at address.... La verdad es que estoy desconcertado con el error. He probado pasar valores de variables desde form2 a form1 y no he tenido problemas, los lios comienzan cuando quiero hacer lo mismo desde form3 a form2. Bueno espero haber sido mas claro esta vez y vuelvo a pedir disculpas.
__________________
Uno es responsable de lo que hace y de lo que omite hacer. |
#2
|
||||
|
||||
EAccesViolation se genera cuando un apuntador o un objeto nil son referenciados.
Por lo que indicas, el error se genera en una asignación del tipo Form2.Edit1.Text := '.....' de manera que o bien Form2 o bien Edit son nil. A no ser que estés creando los controles Edit por código no puede ser que Edit1 sea nil de manera que nos queda Form2. Lo único que se me ocurre entonces es que por alguna razón Form2 no es lo que tú piensas. Me explico: Recuerda que Delphicrea automáticamente una variable asociada al formulario. Es posible que hayas quitado Form2 de "auto create" y en el Form1 tengas declarada una variable Form2 en el lugar desde dónde lo creas. De esta manera Form3 estará haciendo referencia al Form2 que pone Delphi y no al que tu creaste. Investígale por ahí. Si no se corrige el problema vuelve a consultarnos. // Saludos pd: Por favor cuando escribas la continuación de un mensaje hazlo en el mismo hilo ya que es difícil saber a qué mensaje te refieres. |
#3
|
||||
|
||||
Estuve mirando lo que dijo Roman y no pude solucionarlo...
Veamos, deje de lado el proyecto principal y he creado tres ventanas form1, form2, form3; el unico que es autocreado es form1, form2 se crea desde form1 con create y form3 se crea desde form2 con create. Luego puse en el evento click de un boton en form3: form2.edit1.text:='100'; close; nuevamente aparece el error ...EAccess Violation... ¿¿Puede ser que no se pueda crear en tiempo de ejecucion mas de un formulario en cascada sin que se pierdan las referencias o estoy equivocado??
__________________
Uno es responsable de lo que hace y de lo que omite hacer. |
#4
|
||||
|
||||
Cita:
// Saludos |
#5
|
||||
|
||||
![]() Mi querido Roman, tiene usted razon... es nil.
Ahora... como resuelvo el problema?? Cual es la forma correcta de hacer lo que estoy intentando? Sugerencias?? Desde ya te agradezco pues esto me ha servido de mucho. Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer. |
#6
|
||||
|
||||
Cita:
Como te dije antes, si usas una variable local a Form1 entonces Form3 no la verá; sólo verá la variable Form2 declarada en Unit2 que es nil ya que no está en el "auto-create". Puedes hacer lo siguiente: No usar una variable local al momento de crear Form2 sino usar la declarada en Unit2. Desde luego debes agregar Unit2 a la cláusula uses tanto de Unit1 como de Unit3 para qe ambas la vean. Lo correcto es en la parte de implementación. Por otra parte, según entiendo de tu código, Form3 la necesitas para asignar un valor a un cuadro de texto de Form2 y la cierras apenas sucede esto. No es muy buena idea acceder a los controles de un formulario desde otro formulario; incluso hay quienes piensan que los controles de un formulario deberían ser privados y no públicos cómo hace Delphi. Piensa en lo que hace un cuadro de diálogo como FileOpen. El diálogo no coloca ningún valor en el formulario que lo abre; lo que hace es dejar ese valor en una propiedad pública (FileName en este caso) de manera que el formulario que lo abrió puede usar el valor. Dicho esto quizá te convenga algo así: Código:
TForm3 = class(TForm) public Propiedad: String; end; Código:
if ModalResult = mrOk then Propiedad := el valor que necesitas; Código:
with TForm3.Create(nil) do begin if ShowModal = ID_OK then Edit1.Text := Propiedad; Free; end; En tu caso me parece que es algo similar; Form3 no tiene por qué saber de la existencia de Form2, simplemente hace su labor de ajustar Propiedad y punto. // Saludos Última edición por roman fecha: 26-09-2003 a las 19:32:14. |
#7
|
||||
|
||||
Ahh, esto es otra cosa....
Muchisimas gracias mi amigo, muchas gracias....
__________________
Uno es responsable de lo que hace y de lo que omite hacer. |
![]() |
|
|
![]() |
|