[erro] Access violation ...

19/05/2008

1

Estou brincando com o delphi para me familiarizar... mas ja programo bem entre ´, pois há algumas coisas que eu não consigo solucionar sem uma maozinha tecnica de alguem mais experiente.

Criei um aplicativo, e quando eu clico no menu Cadastro... da um erro de Access violation.
O menu abre um Form com 1 edit, e 2 botoes... ´Ok´ e ´Cancelar´

Alguem pode me dar uma luz!?
Meu msn para contato: pjrm1470@hotmail.com
Obs.: contatos sem identificação são automaticamente excluidos em menos de 24h. ( eu excluo para n enxer meu msn. )

Segue o codigo abaixo:
unit Cli_ConAdmin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TfrmConAdmin = class(TForm)
    mmnConAdmin: TMainMenu;
    Arquivo1: TMenuItem;
    mmnSair: TMenuItem;
    panConAdmin: TPanel;
    dbgResumo: TDBGrid;
    grbSaldoAtual: TGroupBox;
    btnFluxos: TButton;
    btnResumo: TButton;
    btnCotacao: TButton;
    dtsResumo: TDataSource;
    lblSaldo: TLabel;
    tblResumo: TTable;
    tblResumoCod_Clientes: TSmallintField;
    tblResumoCod_Dinheiro: TSmallintField;
    tblResumoDescricao: TStringField;
    tblResumoDinheiro_Valor: TCurrencyField;
    Usurios1: TMenuItem;
    mmnCadastro: TMenuItem;
    mmnLogin: TMenuItem;
    mmnLogoff: TMenuItem;
    tblClientes: TTable;
    tblClientesCod_Clientes: TSmallintField;
    tblClientesNome_Cliente: TStringField;
    Ajuda1: TMenuItem;
    mmnSobre: TMenuItem;
    UpdClientes: TUpdateSQL;
    UpdResumo: TUpdateSQL;
    procedure mmnSairClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure mmnCadastroClick(Sender: TObject);

    procedure checkLoginUsuario;
  private
    cod:            Integer;
    { Private declarations }
  public
    novoUsuario:    String;
    UsuarioLogIn:   Boolean;
    { Public declarations }
  end;

var
  frmConAdmin:    TfrmConAdmin;

implementation

uses DateUtils, CadUsuario;

{$R *.dfm}

procedure TfrmConAdmin.mmnSairClick(Sender: TObject);
begin
   Close;
end;

procedure TfrmConAdmin.FormCreate(Sender: TObject);
begin
   UsuarioLogIn := False;
   cod := 1;
end;

procedure TfrmConAdmin.mmnCadastroClick(Sender: TObject);
begin
   frmCadUsuario.Show;
end;

procedure TfrmConAdmin.checkLoginUsuario;
var
   I:    Integer;
begin
   if UsuarioLogIn = True then begin
      for I := 1 to 10 do
      begin
         if tblResumoCod_Clientes.Index = I then begin
            if tblResumoCod_Clientes.Value <> I then begin
               frmConAdmin.UpdClientes.InsertSQL.Text := ´INSERT INTO Clientes (Cod_Clientes, Nome_Clientes )´+
               ´VALUES (´+IntToStr(I)+´, ´+novoUsuario+´)´;
               ShowMessage(´Seu login é o numero: ´+IntToStr(I));
            end;
         end;
      end;

      dbgResumo.Enabled     := True;
      btnFluxos.Enabled     := True;
      btnResumo.Enabled     := True;
      btnCotacao.Enabled    := True;
      grbSaldoAtual.Enabled := True;
      tblResumo.Open;
   end;
end;

end.


E o codigo do form que abre.
unit CadUsuario;

interface

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

type
  TfrmCadUsuario = class(TForm)
    panCadUsuarios: TPanel;
    btnCadOk: TButton;
    edtCadUsuario: TEdit;
    btnCadCancel: TButton;
    procedure btnCadCancelClick(Sender: TObject);
    procedure btnCadOkClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmCadUsuario:     TfrmCadUsuario;

implementation

uses
   Cli_ConAdmin;

{$R *.dfm}

procedure TfrmCadUsuario.btnCadCancelClick(Sender: TObject);
begin
   frmConAdmin.UsuarioLogIn := False;
   Close;
   Free;
end;

procedure TfrmCadUsuario.btnCadOkClick(Sender: TObject);
begin
   frmConAdmin.novoUsuario := edtCadUsuario.Text;
   frmConAdmin.UsuarioLogIn := True;
   frmConAdmin.checkLoginUsuario();
   Close;
end;

end.


Se tiver criticas a respeito do jeito ou do modo de como eu faço pode falar trankilamente, sou aberto à criticas.

Para os que preferirem abrir o codigo no delphi... aí vai o link pra download do codigo zipado.
[url]http://www.2shared.com/file/3311669/32437a51/TEMP.html[/url]


Responder

Posts

20/05/2008

Rodc

Ocorre porque o formulário frmCadUsuario não está criado na memória. Para que ele seja criado automaticamente na inicialização do programa, você deve colocá-lo na lista de AutoCreate que está na guia ´Forms´ das opções do projeto.
Mas o melhor é criar ele dinamicamente, apenas quando for ser usado, como no código abaixo:
procedure TfrmConAdmin.mmnCadastroClick(Sender: TObject); 
begin 
   if not Assigned(frmCadUsuario) then        // Verifica se o objeto existe
      Application.CreateForm(TfrmCadUsuario, frmCadUsuario);      // Cria o objeto caso não exista
   frmCadUsuario.Show;
end; 



Responder

20/05/2008

.lg.

Obrigado.
Vou me lembrar desse detalhe. Não tinha visto ainda um exemplo ou um tutorial q ensinasse a jogar na memoria. :roll:

:Resolvido:


Responder