运行时报错,搞了半天确实不懂!求救!100大洋奉上!(100分)

  • 主题发起人 主题发起人 waxu
  • 开始时间 开始时间
W

waxu

Unregistered / Unconfirmed
GUEST, unregistred user!
我在运行程序的时候出现如下错误:
Access violation at address 00433e00 in module
'MAIN_PROJECT.EXE'.Read of sddress ffffffff
我把程序都没办法了!请教高手!
 
地址冲突,可能有的对象没有创建就开始使用造成的。
跟踪以下报错的语句就知道了
 
我跟踪了!
它是在过程退出的时候,就是执行end的时候出错的!
我应该怎样修改?
你说可能有些对象是没有创建就使用造成的?附源代码:
unit icuser_chongzhi;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables DBTables;

type
Tic_user_chongzhi = class(TForm)
GroupBox2: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Edit3: TEdit;
Label4: TLabel;
Button2: TButton;
Label10: TLabel;
GroupBox3: TGroupBox;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Edit18: TEdit;
Button4: TButton;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit19: TEdit;
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
//icdev:longint;
st:smallint;
end;

var
ic_user_chongzhi: Tic_user_chongzhi;
function IC_Read(icdev:longint;offset:smallint;len:smallint;databuff:pchar):smallint;stdcall;far;external 'DCIC32.DLL' name 'IC_Read';
function IC_Write(icdev: longint;offset:smallint;len:smallint;databuff:pchar):smallint;stdcall;far;external 'DCIC32.DLL' name 'IC_Write';
implementation

uses main;

{$R *.DFM}

procedure Tic_user_chongzhi.Button2Click(Sender: TObject);
begin
close;
mainform.ic8.Enabled:=true;
end;

procedure Tic_user_chongzhi.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
end;

procedure Tic_user_chongzhi.Button4Click(Sender: TObject);
var
receive_data:pchar;
begin
//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit11.text:=strpas(receive_data);
end;
//性别
st:=IC_Read(mainform.icdev,53,2,receive_data);
if st=0 then
begin
receive_data[2]:=#0;
edit13.text:=strpas(receive_data);
end;
//姓名
st:=IC_Read(mainform.icdev,55,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit12.text:=strpas(receive_data);
end;
//班级
st:=IC_Read(mainform.icdev,65,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit14.text:=strpas(receive_data);
end;
//部门
st:=IC_Read(mainform.icdev,85,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit15.text:=strpas(receive_data);
end;
//余额
st:=IC_Read(mainform.icdev,135,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit1.text:=strpas(receive_data);
end;
//最后上机时间
st:=IC_Read(mainform.icdev,145,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit16.text:=strpas(receive_data);
end;
//挂失标志
st:=IC_Read(mainform.icdev,155,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit17.text:=strpas(receive_data)+'次';
end;
// edit2.SetFocus;
// button3.Enabled:=true;
end;(((((((就是退出这里的时候出错!究竟我有哪些对象没有创建就直接使用了?)))))))

procedure Tic_user_chongzhi.Button3Click(Sender: TObject);
var
total_money:string;
mima:pchar;
begin
//检查写入的数据
if edit2.text='' then
begin
showmessage('充值金额难道为空?');
exit;
end;
//检查写入的数据结束

{ st:=IC_Status(mainform.icdev);
if st<>0 then
begin
showmessage('请插入卡!然后点击确定!');
end; }
//先计算余额
total_money:=inttostr(strtoint(edit1.Text)+strtoint(edit2.Text));
//开始写卡
st:=IC_Write(mainform.icdev,135,10,pchar(total_money));
if st<0 then
begin
showmessage('写入余额失败!');
exit;
end;

if table1.Locate('学号',edit11.text,[]) then
begin
table1.Edit;
table1.FieldByName('余额').asstring:=total_money;
table1.Post;
end;



showmessage('写余额成功,请换下一张卡!');
//写卡结束

st:=IC_Down(mainform.icdev);
if st<0 then
begin
showmessage('IC卡下电错误!');
exit;
end;
button3.Enabled:=false;
end;
end.
 
你在哪里对icdev初始化的???
 
下面这个过程不要了,程序会自动free的,试一试,你可能已经释放的对象又释放了一遍
procedure Tic_user_chongzhi.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
end;
 
这是一个多窗体的子窗体,如果不用这一句就不能关闭该窗体,我是在点击按钮过后
,执行完该按钮的所有代码后退出该过程的时候报错!!!!!!好象和这一句没有关系!!
procedure Tic_user_chongzhi.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
end;
 
kevingcsg:
我是在父窗体对icdev进行初始化的,这是在子窗体上面引用父窗体的icdev。
这个变量好像没有问题,我跟踪过!!!关键是在退出下面一个过程的时候就报错!

[red]procedure Tic_user_chongzhi.Button4Click(Sender: TObject);
var
receive_data:pchar;
begin
//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit11.text:=strpas(receive_data);
end;
//性别
st:=IC_Read(mainform.icdev,53,2,receive_data);
if st=0 then
begin
receive_data[2]:=#0;
edit13.text:=strpas(receive_data);
end;
//姓名
st:=IC_Read(mainform.icdev,55,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit12.text:=strpas(receive_data);
end;
//班级
st:=IC_Read(mainform.icdev,65,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit14.text:=strpas(receive_data);
end;
//部门
st:=IC_Read(mainform.icdev,85,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit15.text:=strpas(receive_data);
end;
//余额
st:=IC_Read(mainform.icdev,135,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit1.text:=strpas(receive_data);
end;
//最后上机时间
st:=IC_Read(mainform.icdev,145,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit16.text:=strpas(receive_data);
end;
//挂失标志
st:=IC_Read(mainform.icdev,155,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit17.text:=strpas(receive_data)+'次';
end;
// edit2.SetFocus;
// button3.Enabled:=true;
end;(((((((就是退出这里的时候出错!究竟我有哪些对象没有创建就直接使用了?)))))))[/red]
 
会不会与receive_data:pchar;有关,但是不明白。
你的function IC_Read对receive_data做什么处理了吗?或者是否应该释放内存一下?
 
相同的出错提示我也遇到了,我的程序中过程中用的是strPcopy(PrintBuf,'……'),
怀疑是地址冲突,跟在哪里退出没关系。
不过自己还没找到自己哪里写错了。:(
 
[green]Brave:[/green][blue]
receive_data是用来接收数据的一个字符指针。
receive_data在function IC_Read中是用来接收字符串的一个变量。[/blue]

就是在退出下面这个过程的时候报错
procedure Tic_user_chongzhi.Button4Click(Sender: TObject);
var
receive_data:pchar;
begin
//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit11.text:=strpas(receive_data);
end;
//性别
st:=IC_Read(mainform.icdev,53,2,receive_data);
if st=0 then
begin
receive_data[2]:=#0;
edit13.text:=strpas(receive_data);
end;
//姓名
st:=IC_Read(mainform.icdev,55,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit12.text:=strpas(receive_data);
end;
//班级
st:=IC_Read(mainform.icdev,65,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit14.text:=strpas(receive_data);
end;
//部门
st:=IC_Read(mainform.icdev,85,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit15.text:=strpas(receive_data);
end;
//余额
st:=IC_Read(mainform.icdev,135,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit1.text:=strpas(receive_data);
end;
//最后上机时间
st:=IC_Read(mainform.icdev,145,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit16.text:=strpas(receive_data);
end;
//挂失标志
st:=IC_Read(mainform.icdev,155,10,receive_data);
if st=0 then
begin
receive_data[10]:=#0;
edit17.text:=strpas(receive_data)+'次';
end;
// edit2.SetFocus;
// button3.Enabled:=true;
end;[red](((((((就是退出这里的时候出错!究竟我有哪些对象没有创建就直接使用了?)))))))[/red]
 
你是不是操作出字符串范围了。
 
你把receive_data声明成string;
调用时用st:=IC_Read(mainform.icdev,145,10,@receive_data);
试一下!
另外你只留一段代码,如

//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit11.text:=strpas(receive_data);
end;
其他先删除,看看是否依然报错?
 
[gold]lyywy:
但是我在进行IC卡读写的时候没有出错,为什么在退出该过程的时候出错!
你说说看,你的理由![/gold]
 
操作硬件的东西很难说,可能有延迟。
你这样试一下。
每次只添加一点。看看是那里出错。

就是在退出下面这个过程的时候报错
procedure Tic_user_chongzhi.Button4Click(Sender: TObject);
var
receive_data:pchar;
begin
//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
if st=0 then
begin
receive_data[20]:=#0;
edit11.text:=strpas(receive_data);
end;
end;(((((((就是退出这里的时候出错!究竟我有哪些对象没有创建就直接使用了?)))))))
 
lyywy:我试过了,还是不行!!!
 
这样如果还有错,就是你的dll声明或用的有问题,
另mainform.icdev是什么?

procedure Tic_user_chongzhi.Button4Click(Sender: TObject);
var
receive_data:pchar;
begin
//学号
st:=IC_Read(mainform.icdev,33,20,receive_data);
end;
 
lyywy:
mainform.icdev是我引用父窗体的一个变量。
现在是这样,就是含IC_Read的语句我如果一句都不加,就不会报错,
只要我加上一句就会报错!!我真没有办法了!!!!!!
 
这个声明是硬件提供的吗?不行去他们的站点找找,我曾碰到过dll里边的函数名是小写,
声明,使用是大写,然后出错的问题。
function IC_Read(icdev:longint;offset:smallint;len:smallint;databuff:pchar):smallint;stdcall;far;external 'DCIC32.DLL' name 'IC_Read'
 
不好意思,,^_^。我已经解决这个问题了!
我应该定义receive_data为array[0..80] or pchar
还有就是我在函数IC_read()头中,传送函数的形式不对!
谢谢大家了!都有分!!!!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
962
import
I
I
回复
0
查看
730
import
I
S
回复
0
查看
937
SUNSTONE的Delphi笔记
S
后退
顶部