Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dataset a formX.editX (https://www.clubdelphi.com/foros/showthread.php?t=70067)

Chuma87 28-09-2010 17:17:17

Dataset a formX.editX
 
cuando abrimos el form padre, vamos a "facturas", se abre "facturas" y le damos a un boton para q se nos habra otro formulario (ej: "cliente", en donde seleccionamos al cliente, en caso de serlo), cuando queremos pasar los datos del cliente, a unos edits del formulario "factura" (EJ: formFACTURA.edit1.text := adodataset.fieldsvalues ['Nombre']) nos salta un error de sistema, al momento de que esto sucede, se posiciona sobre la linea de la unidad del formulario "cliente", marcandonos que AHI esta el error, supuestamente es el adodataset, porque le ponemos // (como comentario) y funciona. Nosotros abrimos, en otro delphi, factura solo (o sea, el proyecto Factura que teniamos) lo corremos, y anda todo bien sin andar comentando...

Mi hipotesis sobre la falla? Querer abrir mas de 2 formularios al mismo tiempo -> FormPADRE/FormHijo/Form (ej: FormMDI/FormFACTURA/FormCLIENTE)

Código Delphi [-]
procedure TClientes.DBGrid1DblClick(Sender: TObject);
begin
  Ads.Close;
  Ads.CommandType:= cmdtext;
  Ads.CommandText := 'select * from CLIENTES';
  Ads.Open;
  Factura.Edit8.Text := Ads.FieldValues['CUIT'];
  //Factura.Edit7.Text := Ads.FieldValues['Razon_Social'];
  //Factura.Edit6.Text := Ads.FieldValues['Telefono'];
  Application.MessageBox('Carga Exitosa','Mensaje');
end;

Ads = dataset.

ecfisa 28-09-2010 20:34:08

Hola.

¿ Podés transcribir el error que te arroja ?

Saludos.

Chuma87 28-09-2010 23:35:58

Proyect PR_XXXX.exe raised exception class EAccessViolation with message "Access violation at address 004D27DA in module 'PR_XXXX.exe'. Read of address 00000334". Process stopped. Use step or run to continue.

ese es el error

ecfisa 29-09-2010 00:48:42

Cita:

Empezado por Chuma87 (Mensaje 377815)
Proyect PR_XXXX.exe raised exception class EAccessViolation with message "Access violation at address 004D27DA in module 'PR_XXXX.exe'. Read of address 00000334". Process stopped. Use step or run to continue.

ese es el error

Por el tipo de error, dá la impresión que aún no esta creado el form 'Factura' o los Edit's, cuando invocas a Edit6 y Edit7. No hay problema en abrir más de un form aunque este último sea un MDIChild.

De todos modos revisá que la creación del mismo suceda antes de citar a Edit6 y Edit7 y si estos los creas en ejecución, revisá también que estén creados antes de llamarlos.

Sería bueno si pones el código donde creas el form 'Factura'.


Saludos. :)

Chuma87 06-10-2010 03:11:20

Código Delphi [-]
procedure TFPadre.Factura1Click(Sender: TObject);
var
  Factura : TFactura;

begin
  Factura := TFactura.Create(Application);
  FPadre.Factura1.Enabled := false;  
end;

Con una variable global funciona, pero el tema es que, quede bien y lo pase en el momento a los edits, cuando hago doble click sobre "Clientes"

Cuando me salta el error, y se pociciona sobre Factura.edit8.text....... pongo el cursor encima de Factura y me pone... Factura = nil

ecfisa 06-10-2010 14:03:25

Hola Chuma87.

Según entiendo, tenés un MDIForm (padre) que llama a un MDIChild 'facturas' y este a su vez llama
a un fsNormal 'clientes'. Y la idea es ante determinada situación en el form 'clientes' enviarle datos a
componentes del form 'facturas',despues me dirás si me equivoco...

Como el problema no está en el llamado del MDIForm al MDIChild, supongamos que ya estamos con el form 'facturas'
abierto.

Voy a ponerte un ejemplo muy simplificado omitiendo toda comprobación, sólo a fín de clarificar la situación.

Tenemos en 'facturas' un TPanel o (cualquier componente receptor) y un botón llamado btCliente que ejecuta la
creación del form 'cliente', algo como:
Código Delphi [-]
uses Unit3
procedure TFactura.btClientesClick(Sender: TObject);
begin
  Clientes:= TCliente.Create(Application);
  Clientes.ShowModal;
end;

En el form 'clientes' ponemos un Edit y otro botón llamado btPasar.
Y para simplificar más la cosa, hacemos una referencia circular a el form 'facturas', algo como:
Código Delphi [-]
uses Unit2;

procedure TClientes.PasarClick(Sender: TObject);
begin
  Factura.Panel1.Caption:= Edit1.Text
end;
Esto, basándome en lo que interpreté en tu primer post. De no haber entendido mal, funciona sin provocar excepciones.

Ahora si el form 'factura' está declarado como variable local de un procedimiento como en el código que adjuntas, realmente
no sé como el form 'cliente' se va a enterar de su existencia...

Saludos. :)

Chuma87 06-10-2010 15:39:20

O sea, lo que decis es que, cuando selecciono con doble click al cliente en "Clientes" guarde los datos en edits de ese Form y no de los de "facturas". De esos edits los paso a otros edits, de factura, asi es como decis? si no me equivoco..

Voy a intentar.

ecfisa 06-10-2010 15:43:00

Hola de nuevo.

No, no digo eso.

Lo que digo es que el form 'cliente' debe poder ver (o tener acceso) al form 'factura' si es que quiere alterar el valor de un componente declarado en él.

Saludos. :)

Chuma87 06-10-2010 15:49:15

Corrijo:
Padre(MDIForm)/Factura(MDIChild)/Clientes(MDIChild)

En todo caso, siempre los errores me los marca sobre "facturas"...creo que ahi esta el problema, sera porq una vez que abro clientes, lo descarta?

Tengo otro proyecto, solo que esta "factura" que llama a "clientes", igual que aca, pero sin el FORMPADRE, y anda fenomenal!.

Chuma87 06-10-2010 16:02:26

Ya esta!

es asi: Estando en la unidad del Form de Clientes, en el evento dobleclick, este es el codigo:

Código Delphi [-]
procedure TClientes.DBGrid1DblClick(Sender: TObject);
begin
  Factura := TFactura.Create(Application);
  Factura.Edit8.Text := Ads.FieldValues['CUIT'];
  Factura.Edit7.Text := Ads.FieldValues['Razon_Social'];
  Factura.Edit6.Text := Ads.FieldValues['Telefono'];
  Application.MessageBox('Carga Exitosa','Mensaje');
end;

Nunca volvia al formulario FACTURA. debia crearlo de nuevo.

Gracias!

Chuma87 06-10-2010 17:16:22

VAAA...en realidad, lo que hace es crearme otra vez el formulario factura, entonces cuando hago la transaccion, me aparecen ahora 2 "Facturas"...

no logro comprender cual es realmente el error.

Porque lo que veo es que "factura" no esta activado o no lo reconoce. no se.

Ahora, si pongo
Código Delphi [-]
Factura.Show;
  Factura.Edit8.Text := Ads.FieldValues['CUIT'];
  Factura.Edit7.Text := Ads.FieldValues['Razon_Social'];
  Factura.Edit6.Text := Ads.FieldValues['Telefono'];
  Application.MessageBox('Carga Exitosa','Mensaje');

me salta este error.
Proyect Pr_PrincipalMDI.exe raised exception class EAccess Violation with message 'Access violation at address 0046E9F2 in module 'Pr_PrincipalMDI.exe'. Read of address 000002F4'. Process stopped. Use Step or Run to continue.

ecfisa 06-10-2010 22:27:25

Hola.

Para evitar que te cree dos veces el mismo MDIChild, podés usar esta función en el MDIForm:
Código Delphi [-]
procedure TMDIForm.CrearChild(ClassForm: TFormClass);
var
  i: Integer;
begin
  for i:= 0 to MDIChildCount do  // Buscar si está creada
   if Screen.Forms[i].ClassName = ClassForm.ClassName then // ¿ Ya existe ?
   begin
     Screen.Forms[i].WindowState:= wsNormal;  // restaurar
     Screen.Forms[i].BringToFront;            // Traer al frente
     Exit;                                    // Salir;
   end;
  with ClassForm.Create(nil) do Show; // No existe, crearlo
end;

Ejemplo de llamada:
Código Delphi [-]
     CrearChild(TClientes);

Para que el MDIChild se cierre y no se minimize incluí en el evento OnClose del mismo:
Código Delphi [-]
procedure TClientes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action:= caFree;
end;


Saludos. :)


La franja horaria es GMT +2. Ahora son las 14:12:37.

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