我的怪问题,工作得很正常,但退出时总报告访问非法地址。(50分)

  • 主题发起人 主题发起人 sward
  • 开始时间 开始时间
S

sward

Unregistered / Unconfirmed
GUEST, unregistred user!
如果不执行这些方法不报告错,执行时也都很正确,问题如上,请有经验的朋友帮我看看
procedure Twz_server_data.serverqueryopen(sqlstring: OleVariant);
begin
with serverquery1do
begin
close;
sql.clear;
sql.add(sqlstring);
execsql;
mainfrm.memo1.lines.add('----执行SQL------');
mainfrm.memo1.lines.add(sqlstring);
end;
end;

function Twz_server_data.serveraction(actionno, actiontext: OleVariant): OleVariant;
begin
IF actionno='重新计算总库存' then
begin
with serverquery1do
begin
close;
sql.clear;
sql.add('select codeid');
sql.add(',sum(insl) as insl');
sql.add(',sum(inje) as inje');
sql.add(',sum(nowsl) as nowsl');
sql.add(',sum(nowje) as owje') ;
sql.add(',sum(outsl) as outsl');
sql.add(',sum(outje) as outje') ;
sql.add(' from kc_mini group by codeid order by codeid') ;
open;
end;
with serverquery2do
begin
close;
sql.text:='update stock set insl=0,inje=0,outje=0,outsl=0,nowsl=0,nowje=0' ;
execsql;
serverquery1.first ;
while not serverquery1.eofdo
begin
close;
sql.clear;
sql.add('update stock set ');
sql.add(' inje='+serverquery1.fieldbyname('inje').asstring);
sql.add(' insl='+serverquery1.fieldbyname('insl').asstring);
sql.add(' outje='+serverquery1.fieldbyname('outje').asstring);
sql.add(' outsl='+serverquery1.fieldbyname('outsl').asstring);
sql.add(' nowje='+serverquery1.fieldbyname('nowje').asstring);
sql.add(' nowsl='+serverquery1.fieldbyname('nowsl').asstring);
sql.add(' where codeid='+serverquery1.fieldbyname('codeid').asstring);
execsql;
serverquery1.next;
end;
end;
serverquery1.close;
serverquery2.close;
end ;
//else
begin
mainfrm.memo1.lines.add('----');
mainfrm.memo1.lines.add(actionno);
mainfrm.memo1.lines.add(actiontext);
result:=DateTimeToStr(Now)+'act ok!';
end;
end;
 
你怎么执行这两个函数的啊?
 
看看数据模块,是不是在窗体free后还执行了与窗体有关的代码
 
补充说明一下,因为太穷,请不要嫌分少
//删除有关物资编码的数据
dm.socketwz.AppServer.serverqueryopen('delete from stock ');
branchsql:=' where branchno='''+dm.cds_branch.fieldbyname('branchno').asstring+'''';
dm.socketwz.AppServer.serveraction('重新计算总库存',branchsql);
后面这个参数是补充说明前面的动作的要求,比如求分公司库存时用来传送分公司编码
执行后返回的字符串是正确的 。‘执行的时间 ACT OK ’我检查过
在应用服务器上的说明部分如下
procedure serverqueryopen(sqlstring: OleVariant);
safecall;
function serveraction(actionno, actiontext: OleVariant): OleVariant;
safecall;
to wfzha :
在窗体里除了一堆 QUERY,PROVIDOR,UPDATESQL外,没别的啦 这个服务器其实只起个数据转发作用
不是真正的应用服务器。
 
退出系统时先断开数据模块中connetion的连接,再关闭主窗体
 
找到原因了 只是仍然不知为什么
我把在MEMO1中写内容的语句全部关掉就正常了,什么东西!
//mainfrm.memo1.lines.add('----执行SQL------');
//mainfrm.memo1.lines.add(sqlstring);
//mainfrm.memo1.lines.add('----');
//mainfrm.memo1.lines.add(actionno);
//mainfrm.memo1.lines.add(actiontext);

看来要在界面窗口中写个FUNCTION,让数据模块调用而不是直接去写它
我现在试试看行不行得通。
 
MEMO1中的lines的ADD不支持OleVariant吧。
 
你看一下这段代码中的 sqlstring,actionno,actiontext
中有没有在别的单元中声明的,如果有,运行前要判断变量的有效性
 
强制转为字符串类型后再加到MEMO1中去就可以了,

procedure Tmainfrm.addmemo(addstr:string);
var tmpstr:string;
begin
tmpstr:=pchar(addstr);
Memo1.lines.add(tmpstr);
end;
 
今天发现问题没有解决。
只是进步成一会行,一会不行了,不象过去每次都不行。
试了多次甚至按MIDAS的例子再做了一次用LISTBOX来显示信息也是一样。
甚至将加串改成加静止的‘HELLO’ 都不行只要有写的动作就会报告错
最后只好在它里面建一个变量,在主表单里USE它然后再主动去取它才算解决。。
 
后退
顶部