Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formularios Violation Access (https://www.clubdelphi.com/foros/showthread.php?t=75846)

asdbernardo 22-09-2011 18:03:27

Formularios Violation Access
 
Buenas tardes, foristas!

Ante todo un cordial saludo a todos..

me estoy iniciando en el delphi ( vengo de visual basic ) y tengo varias dudas que se me vienen presentando en mi proyecto, estoy haciendo un programa cliente servidor, en mysql y delphi 2010, pero tengo varios problemitas en cuanto a los Violation access, he estado leyendo y a lo mejor puede ser porque no me va muy bien con eso de que hay que liberar y destruir los form .. entonces a ver
tengo 3 pantallas, una es un login, la siguiente es principal y la siguiente es agencia, seria algo asi:

Login
Principal > aca tiene un mainmenu donde al darle click a Agencia se despliegan otro menus y en ese menu esta un menuitem que selecciona el formulario Agencia y lo muestro con un .show y lo declaro en uses Agencia.

pero me salta un error de violation access y lo he probado en diferentes maquinas con delphi 2010 y sigue saltando ese error, posteare el codigo para que lo vean

source project
Código:

program Project1;

uses
  Forms,
  Controls,
  Login in 'Login.pas' {frmLogin},
  Principal in 'Principal.pas' {frmPrincipal},
  Agencia in 'Agencia.pas' {frmAgencia};

{$R *.res}
    var
    Respuesta: integer;
begin

 Application.Initialize;
  Application.Title := 'WB System';
  frmLogin := TfrmLogin.Create(Application);
    frmprincipal := Tfrmprincipal.Create(Application);
 try
    Respuesta := frmLogin.ShowModal;
      if Respuesta = mrOK then
        begin
          Application.CreateForm(TfrmPrincipal, frmPrincipal);
  Application.CreateForm(TfrmAgencia, frmAgencia);
  Application.CreateForm(TfrmLogin, frmLogin);
  Application.Run;
        end;
  finally
    frmLogin.Free;
  end;
end.

code login.

Código:

unit Login;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, DBCtrls, UniProvider, MySQLUniProvider, DB, DBAccess,
  Uni, MemDS;

type
  TfrmLogin = class(TForm)
    UniConnection1: TUniConnection;
    UniTable1: TUniTable;
    UniDataSource1: TUniDataSource;
    MySQLUniProvider1: TMySQLUniProvider;
    Button1: TButton;
    qry: TUniQuery;
    txtusu: TEdit;
    txtpass: TEdit;
    qryuser_login: TStringField;
    qryuser_password: TStringField;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    lblintentos: TLabel;
    lblverifique: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure txtusuKeyPress(Sender: TObject; var Key: Char);
    procedure txtpassKeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  frmLogin: TfrmLogin;
    nintentos: integer;
    veces: integer;
implementation

uses Principal;

{$R *.dfm}

procedure TfrmLogin.Button1Click(Sender: TObject);
begin
qry.SQL.Clear;
qry.SQL.Add(' select user_login');
qry.SQL.Add(' , user_Password');
qry.SQL.Add(' from Login');
qry.SQL.Add(' where user_login = Upper(:UserLogin)');
qry.SQL.Add(' and ');
qry.SQL.Add(' user_password = (:UserPassword)');
qry.Params[0].Value := UpperCase(Trim(txtusu.Text));
qry.Params[1].Value := Trim(txtpass.Text);
qry.Open;

if qry.RecordCount > 0 then
            begin
          frmprincipal.Show;
          frmlogin.Hide;
            end
              else
    begin
      nIntentos := nIntentos + 1 ;      {Intentos del login}
      veces := 3;    {Veces limite de login}
      lblIntentos.Visible := true;
      lblIntentos.Caption := 'Intentos Restantes: ' + inttostr(veces-nIntentos);
      lblVerifique.Caption := 'Login Invalido, Verifique!';
      if (nIntentos < veces) then
        begin

          txtusu.Text := '';
          txtpass.Text :='';
          txtusu.SetFocus;
        end
        else if (nIntentos = veces) then
          begin
                    txtusu.Text := '';
          txtpass.Text :='';
          txtusu.SetFocus;
            frmLogin.ModalResult := mrCancel;

      Application.MessageBox( 'Maximo de Intentos, Sera notificado al Administrador',
  'Acceso denegado', MB_ICONSTOP );

            end;
            end;
end;


procedure TfrmLogin.Button2Click(Sender: TObject);
begin
close;
 end;




procedure TfrmLogin.txtpassKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then                          { if it's an enter key }
  begin
      Key := #0;                                { eat enter key }
      Perform(WM_NEXTDLGCTL, 0, 0);              { move to next control }
  end
end;

procedure TfrmLogin.txtusuKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then                          { if it's an enter key }
  begin
      Key := #0;                                { eat enter key }
      Perform(WM_NEXTDLGCTL, 0, 0);              { move to next control }
  end
end;

end.

y por ultimo el principal

Código:

unit Principal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, buttons , StdCtrls;

type
  TfrmPrincipal = class(TForm)
    MainMenu1: TMainMenu;
    Archivo1: TMenuItem;
    CerrarPrograma1: TMenuItem;
    Agencias1: TMenuItem;
    RegistrarAgencia1: TMenuItem;
    RegistrarUsuario1: TMenuItem;
    Loterias1: TMenuItem;
    RegistrarAgencia2: TMenuItem;
    ModificarAgencia1: TMenuItem;
    Borrar1: TMenuItem;
    Registrar1: TMenuItem;
    Modificar1: TMenuItem;
    Borrar2: TMenuItem;
    procedure CerrarPrograma1Click(Sender: TObject);
    procedure RegistrarAgencia2Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation
          uses agencia;
      {$R *.dfm}


procedure TfrmPrincipal.CerrarPrograma1Click(Sender: TObject);
begin
 application.Terminate;
end;

procedure TfrmPrincipal.RegistrarAgencia2Click(Sender: TObject);
begin
frmagencia.Show;
end;

end.

y pues agencia no tengo nada programado aun porque no me lo muestra y estoy con eso del violation access xD

Código:

unit Agencia;

interface

uses StdCtrls,  Classes, Windows, Messages, SysUtils, Variants, Graphics, Forms,
  Dialogs, Controls;

type
  TfrmAgencia = class(TForm)
    lblModuloAgencias: TLabel;
    gbDatosAgencia: TGroupBox;
    edtnombreagencia: TEdit;
    edtresponsable: TEdit;
    lblnombreagencia: TLabel;
    lblresponsable: TLabel;
    edtnumeroagencia: TEdit;
    lblnroagencia: TLabel;
    gblimiteventas: TGroupBox;
    lblterminales: TLabel;
    lbltriples: TLabel;
    lblzodiacales: TLabel;
    edtterminales: TEdit;
    edttriples: TEdit;
    edtzodiacales: TEdit;
    btnaceptar: TButton;
    btncancelar: TButton;
    lblregistro: TLabel;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmAgencia: TfrmAgencia;

implementation

{$R *.dfm}
end.

el error que me marca de violation es:

Access Violation at address 004AFBB6 in module 'project1.exe'. Read of Address 00000384

si alguno me puede guiar sobre evitar estos access violation en cuando a la llamado de formularios me gustaria mucho! saludos

Y gracias por su atencion a mi post!

oscarac 22-09-2011 18:05:11

Tenemos a un converso jejeje
y en que linea te sale el error?

Caral 22-09-2011 18:11:50

Hola
A mi esto no me suena:
Código Delphi [-]
 Application.Initialize;
  Application.Title := 'WB System';
  frmLogin := TfrmLogin.Create(Application);
    frmprincipal := Tfrmprincipal.Create(Application);
 try
    Respuesta := frmLogin.ShowModal;
      if Respuesta = mrOK then
        begin
          Application.CreateForm(TfrmPrincipal, frmPrincipal);
  Application.CreateForm(TfrmAgencia, frmAgencia);
  Application.CreateForm(TfrmLogin, frmLogin);
  Application.Run;
        end;
  finally
    frmLogin.Free;
  end;
Saludos

asdbernardo 22-09-2011 18:15:53

Eso es lo extraño no me marca error en el ninguna linea, si le doy en pause me marca es el CPU, es esto

ntdll.DbgUiRemoteBreakin:
7C96077B 6A08 push $08

de resto solo me marca ese access violation.

Caral 22-09-2011 18:18:41

Hola
Corre o de plano no corre ni de principio ?.
Sigo con lo mismo, no me suena crear dos veces los formularios, es evidente que esta mal.
Saludos

asdbernardo 22-09-2011 18:20:09

Si corre, hasta el form principal, todo marcha bien! cuando intento llamar al formulario Agencia, me genera ese violation access :(

asdbernardo 22-09-2011 18:32:32

Cita:

Empezado por Caral (Mensaje 413059)
Hola
A mi esto no me suena:
Código Delphi [-]
 Application.Initialize;
  Application.Title := 'WB System';
  frmLogin := TfrmLogin.Create(Application);
    frmprincipal := Tfrmprincipal.Create(Application);
 try
    Respuesta := frmLogin.ShowModal;
      if Respuesta = mrOK then
        begin
          Application.CreateForm(TfrmPrincipal, frmPrincipal);
  Application.CreateForm(TfrmAgencia, frmAgencia);
  Application.CreateForm(TfrmLogin, frmLogin);
  Application.Run;
        end;
  finally
    frmLogin.Free;
  end;
Saludos

Con respecto a esto que dices tienes razon, me puse a acomodar y dejar sin ese if de comprobacion y todo marcho bien me abrio el form agencia, quedo asi; pero se ejecutan todos los formularios ese if era como una validacion.. pero la verdad no se porque no anda bien.

Código:

program Project1;

uses
  Forms,
  Controls,
  Login in 'Login.pas' {frmLogin},
  Principal in 'Principal.pas' {frmPrincipal},
  Agencia in 'Agencia.pas' {frmAgencia};

{$R *.res}
    var
    Respuesta: integer;
begin
  Application.Initialize;
  Application.Title := 'WB System';
  frmLogin := TfrmLogin.Create(Application);
  frmprincipal := Tfrmprincipal.Create(Application);
  frmagencia := Tfrmagencia.Create(Application);
  frmagencia.Hide;
  frmlogin.ShowModal;
  {try
    Respuesta := frmLogin.ShowModal;
      if Respuesta = mrOK then
        begin
  Application.Run;
        end;
  finally
    frmLogin.Free;
  end;    }
end.


Caral 22-09-2011 18:32:34

Hola
Bueno segun lo que veo creas los forms siempre y cuando el form login sea ok, tal vez no se crea bien el form agenda, no lo se.
Me extraña mucho esta manera de hacer las cosas.
Haces un simple show a un form que se supone se ha creado.
De todos modos, no es la mejor forma de llamar a los forms, para mi.
Saludos

ecfisa 22-09-2011 18:32:50

Hola.

Revisá que frmAgencia esté incluída en Available forms en: Project -> Options -> Auto-create Forms.

Si no es así cambiá esta línea:
Código Delphi [-]
  frmagencia.Show;
Por:
Código Delphi [-]
  with TFrmagencia.Create(Application) do Show;

Saludos.

asdbernardo 22-09-2011 19:01:24

Cita:

Empezado por Caral (Mensaje 413069)
Hola
Bueno segun lo que veo creas los forms siempre y cuando el form login sea ok, tal vez no se crea bien el form agenda, no lo se.
Me extraña mucho esta manera de hacer las cosas.
Haces un simple show a un form que se supone se ha creado.
De todos modos, no es la mejor forma de llamar a los forms, para mi.
Saludos

Gracias, estoy iniciandome en el delphi 2010, me agrada mucho.. por eso tenia dudas aparte recuerda vengo de Visual basic, que solamente con llamar el form.show(); lo trae sin mas.. pero ahora me gusta mas el delphi.. ya logre solventarlo muchas gracias por tu atencion y por el tiempo que le dedicaste al leer mi post.. Saludos.

asdbernardo 22-09-2011 19:02:38

Cita:

Empezado por ecfisa (Mensaje 413070)
Hola.

Revisá que frmAgencia esté incluída en Available forms en: Project -> Options -> Auto-create Forms.

Si no es así cambiá esta línea:
Código Delphi [-]
  frmagencia.Show;
Por:
Código Delphi [-]
  with TFrmagencia.Create(Application) do Show;

Saludos.

Gracias amigo, lo solvente con eso! esa es la forma de llamar los formularios solo que como comente arriba vengo de otro compilador y me estoy adaptando.. Gracias por tu atencion a mis dudas.. pronto estare de nuevo por aca.. pero adelantare! con eso ya espero no me salte mas el problema de la violation access xD

Caral 22-09-2011 19:18:22

Hola
En delphi también, con solo un form.Show ya esta, siempre que lo tengas creado al iniciarse el programa.
Pero: Delphi da la opción de crearlo cuando uno desee, no necesariamente al inicio.
Esto lo que hace para que el programa corra mejor al iniciarse.
Saludos

asdbernardo 26-09-2011 04:36:03

Cita:

Empezado por Caral (Mensaje 413086)
Hola
En delphi también, con solo un form.Show ya esta, siempre que lo tengas creado al iniciarse el programa.
Pero: Delphi da la opción de crearlo cuando uno desee, no necesariamente al inicio.
Esto lo que hace para que el programa corra mejor al iniciarse.
Saludos


Gracias caral, Ahora si ya me estoy familiarizando.. Ya estoy entiendiendo lo que es el delphi, ahora me toca aprender mas sobre las excepciones, los erroes con eso ... ya que tengo que saber controlar los errores .. pero aun no le llego, estoy con mi aplicacion en el login, sabes que estoy usando Unidac con delphi 2010, y tengo el componente uniconnection activado como true en la conexion para que cuando el login entre de una vez cargue la base de datos.. la cuestion esta que me sale Socketexception cuando digamos por razones ajenas se cae el servidor, o no se puede conectar.... y es por ese mismo problema salta el error socketexcepcion, pero no se como comprobarlo, activarlo en modo codigo, si hay conexion que proceda a colocarlo como true, sino lo hay solamente que muestre el login y me diga que no hay conexion pero la verdad ya tengo tiempo en eso.. y no consigo, he leido sobre el try/except/finally y aun no puedo controlarlo .. jeje si sabes de algo! me cuentas.. Saludos


La franja horaria es GMT +2. Ahora son las 20:48: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