请教delbhi程序问题,只有133分了(133分)

  • 主题发起人 主题发起人 xhliang
  • 开始时间 开始时间
X

xhliang

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi的问题:
假如form1里有Edit1、Edit2和button1,先在Edit1,Edit2中输入号码,然后将有关数据插入表中。代码如下,现在的问题是1如果Edit1、Edit2中没数字,按button1就会出错。2是如何检查没插入数据前,表中有无与Edit1、Edit2相同号码。本人是一新手,请各位前辈指教!
procedure TForm2.Button3Click(Sender: TObject);

begin
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into gwj100 (gwjdm,gwjmz,c_date) values (:a,100,GetDate())');
Parameters.ParamByName('a').VALUE :=i;
ExecSQL
 
try
for i:=strtoint(edit1.text)to strtoint(edit2.text) do
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from gwj100 where 号码='+edit1.text); //条件你自己写。
sql.Open;
if adoquery1.isempty then
begin//表中不存在该数据,插入
close;
sql.clear;
sql.add('insert into gwj100 (gwjdm,gwjmz,c_date) values (:a,100,GetDate())');
Parameters.ParamByName('a').VALUE:=i;
ExecSQL
end;
end;
except
showmessage('输入错误!');
end;
 
题是1如果Edit1、Edit2中没数字,按button1就会出错:
可以在你的程序前面加上
if trim(edit1.text)=''then
begin
showmessage('error');
exit;
end;
if trim(edit2.text)=''then
begin
showmessage('error');
exit;
end;
 
procedure TForm2.Button3Click(Sender: TObject);
begin
if trim(edit1.text)=''then

showmessage('该数据不能为空,请重新输入!');
exit;
edit1.SetFocus;

end;
if trim(edit2.text)=''then
begin
showmessage('该数据不能为空,请重新输入!');
exit;
edit2.SetFocus;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin

if trim(edit1.text)<>'' then
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from gwj100 where 号码='''+edit1.text''''); //条件你自己写。
adoquery1.Open;
if adoquery1.RecordCount>0 then
begin
showmessage('系统已存在该数据,请检查后重新输入!');
exit;
edit1.SetFocus;
else
begin
end;

end;
后面判断edit2的与edit1相同即可。
 
综合以不答案。呵
 
修改如下,但运行起来还是出错,请各位老大指教。
procedure TForm2.Button1Click(Sender: TObject);
begin
with adoquery1 do
begin
sql.text:='select * from gwj100';
open;
end;
end;

procedure TForm2.Button5Click(Sender: TObject);
begin
close;
end;

procedure TForm2.Button2Click(Sender: TObject);

begin
sqlstr:='select * from gwj100 where gwjdm>='''+edit1.text+'''and gwjdm<='''+edit2.text+'''';
with adoquery1 do
begin
close;
sql.clear;
sql.add(sqlstr);
open;
edit1.clear;
edit2.Clear;
edit1.setfocus;
end;


end;
procedure TForm2.Button3Click(Sender: TObject);
begin
if trim(edit1.text)=''then
begin
showmessage('error');
exit;
end;
if trim(edit2.text)=''then
begin
showmessage('error');
exit;
end;

begin
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into gwj100 (gwjdm,m_jine,g_date) values (:a,100,GetDate())');
Parameters.ParamByName('a').VALUE :=i;
ExecSQL;
close;
begin
edit1.clear;
edit2.Clear;
sql.text:='select * from gwj100';
edit1.setfocus;
open;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
with adoquery1 do
begin
sql.text:='select * from gwj100';
open;
end;
end;
end.
 
我覺得這樣的句子:
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
很有問題..
如果edit1,edit2都不是數字,,肯定會錯..
如果edit1>edit2 應該也會出現錯誤.這個是猜而已..呵呵
 
還有就是你用了一次sql..一般要清除sql語句..
 
多谢zhouyou155兄 
for i:=strtoint(edit1.text) to strtoint(edit2.text) do  这句系统确实是提示出错,请教应如何修改呢?
 
空循环肯定会出错的。内存越界!!,但你最好养成一个好的编程习惯,把可能出现越界的地方,加判断。一些数学上可能出错的地方,如:**/0,最好做异常判断。慢慢来,习惯后你就能减少错误了。

procedure TForm2.Button3Click(Sender: TObject);
var
i,k,j:integer;
begin
k:=strtoint(eidt1.text);
j:=strtoint(eidt2.text);
if (edit1.text = '') or (edit2.text = '') then showmessage('循环不能为空!') else
begin
if k = j then showmessage ('相同只能循环一次!')
else
begin
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into gwj100 (gwjdm,gwjmz,c_date) values (:a,100,GetDate())');
Parameters.ParamByName('a').VALUE :=i;
ExecSQL;
end;
end;

另外,再提醒你一下,用完以后adoquery1.active:=false;connection.close;这就是好的习惯!能减少不必要的错误!
 
路过,分都给楼上的抢了```汗```
 
1.点击Button前,判断Edit中是否是合法的内容:
if Edit1.Text = '' then begin
ShowMessage('error');
Exit;
end;

2.唯一性判断.在Query中放SQL语句:
select count(id)from table where id = edit1.text
if query.Fields[0].asInteger <> 0 then begin
ShowMessage('值已存在');
Exit;
end;
 
先判断:if edit1.text='' or edit2.text='' then showmessage('error')
else if strtoint(trim(edit1.text))>strtoint(trim(edit2.text)) then
showmessage('error')
else
begin
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
begin
.....(上面已经有答案了)
end;
end;
 
加了如下语句后,为什么运行程序中,如果edit1和edit2为空的话,按button3程序仍然会提示出错呢
procedure TForm2.Button3Click(Sender: TObject);
var
i,k,j:integer;
begin
k:=strtoint(edit1.text);
j:=strtoint(edit2.text);
if (edit1.text = '') or (edit2.text = '') then showmessage('循环不能为空!') else
begin
if k = j then showmessage ('相同只能循环一次!')
else
Exit;
end;

begin
for i:=strtoint(edit1.text) to strtoint(edit2.text) do
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into gwj100 (gwjdm,gwjmz,c_date) values (:a,100,GetDate())');
Parameters.ParamByName('a').VALUE :=i;
ExecSQL;
end;
end;
end;
end;
end.
 
k:=strtoint(edit1.text);
j:=strtoint(edit2.text);
这2句的问题
你首先要确认你的两个edit的数据是否有效 如果你edit为空strtoint一定抛异常的
你必需保证输入的是数字啊
 
多谢avalon兄,请教,能否加一判断,如果两edit为空,程序就不动作或结束呢?
 
edit的Onkeypress事件里添上这几句,控制只能输入数字
-----------------------------------------
if not (key in ['0'..'9',#8])then
begin
key:=#0;
exit;
end;
-----------------------------------------
 
能否加一判断呢?因在软件使用中,很多人都会试点各个按钮的。如果点一按钮,软件就运行出错也太成问题了。
 
简单的改法
try
k:=strtoint(edit1.text);
j:=strtoint(edit2.text);
except
Showmessage('输入数据不正确!');
 Exit;
end;

复杂的就像楼上所说的 但开始要考虑空值
 
剛才沒空啊..現在幫你..下面:
(1)數據庫表,是否可以插入空?如果可以..edit1.text應該可以為空
(2) 數字插入:if edit1.text>edit2.text
for strtoint(edit1.text) downto strtoint(edit2.text) do
........
if edit1.text<edit2.text
for strtoint(edit1.text) to strtoint(edit2.text) do
.....
(3)字符插入:
字符的話,你插入數據庫要轉換類型...
定義一個integer變量吧..跟上面差不多
 
后退
顶部