论坛: 编程破解 标题: delphi数据类型转换和ADO操作数据库的问题?? 复制本贴地址    
作者: lwei889 [lwei889]    论坛用户   登录
procedure TForm2.Button2Click(Sender: TObject);
var
k:integer;
m,i,h,t:double;
link:string;
begin
  h:=1;
  t:=4096;
  link:=edit1.Text+edit2.Text+edit3.Text+edit4.Text;
  i:=strtofloat(link);
  while (i<>strtofloat(adotable1ipflag.Value)) and (h<t) do
  begin
    m:=(h+t)/2;
    //这里将m转换为整数
    //这里将ADO将数据库移动到m这个位置
    //下面的程序是开始比较
    if i=strtofloat(adotable1ipflag.Value) then           
    begin
      application.MessageBox('IP地址已经找到','提示信息',mb_ok);
      exit;
    end
    else
    begin
      if i>strtofloat(adotable1ipflag.Value) then
        h:=int(m+1)
      else
        t:=int(m-1);
    end;
  if h>t then
    begin
      application.MessageBox('无此IP地址','提示信息',mb_ok);
      exit;
    end;
  end;
end;

上面是个用是个折半法查找的程序!
遇到了以下几个问题:
m:=(h+t)/2  这里的m 是double型的数据,我想把他转为整型数据! 该怎么转换  (doubletoint不行啊)
另一个问题是,我想让一条语句移动到数据库中指定条数记录, 比如我想移动到第五条 该怎么移动
我用ADOTABLE1.MOVEDBY(5)  这个是每次向下移动5条记录!

注:
  我是用ip地址大小进行比较,在录入数据库时,做了改变  192.168.0.0.  已转换为19216800  这样由小到大排列

谢谢了!

地主 发表时间: 05-03-04 10:02

回复: zhoen889 [zhoen889]   论坛用户   登录
数据库搞的怎么样了?这就是数据库中的部分代码吗?
顶顶!!

B1层 发表时间: 05-03-05 10:56

回复: lwei889 [lwei889]   论坛用户   登录
现在做的还顺利,问题已经解决了,不过我不是用上面的方法,我用的是ADOQUERY执行SQL语句搞定的,这样效率高啊!
再把贴一部分代码出来:下面这段代码能正常运行 (其实就是一条SQL语句+一个参数)
begin
  if edit6.Text='' then
  begin
    application.MessageBox('请输入IP地址','提示信息',mb_ok);
    exit;
  end;
  if adoquery1.Active then
    adoquery1.Close;
  adoquery1.SQL.Clear;
  adoquery1.SQL.Add('select * from ipinfo where ip=:searchip');
  adoquery1.Parameters[0].Value:=edit6.Text;
  adoquery1.Active:=true;
  dbedit1.Text:=inttostr(number.value);
  dbedit2.Text:=username.value;
  dbedit3.Text:=worker.value;
  dbedit4.Text:=position.value;
  dbedit5.Text:=ip_changer.value;
  dbedit6.Text:=inttostr(vlan.value);
  dbedit7.Text:=inttostr(port.value);
  dbedit8.Text:=ip.Value;
  dbedit9.Text:=mac.value;
  dbedit10.Text:=phone.value;
  dbedit11.Text:=email.value;
  dbedit12.Text:=datetostr(open_date.value);
  dbedit13.Text:=user_stat.value;
  edit6.Text:='';
  edit6.SetFocus;
end;
可是我第一次帖出来的问题还没有解决啊,还请赐教啊
(我绝对不是懒啊,我是在网上查了资料,delphi函数库也查了可是找不到,才发贴的!!)


B2层 发表时间: 05-03-05 17:39

回复: 286 [unique]   版主   登录
C里有类型强制转换,Delphi也应该有吧。
ADO是COM组件,这与语言无关,ADO中有一个rs.move 记录号
你找找这个功能在Delphi中是什么方法吧。

B3层 发表时间: 05-03-07 10:05

回复: lwei889 [lwei889]   论坛用户   登录
在delphi中用int()函数也可以
m:real;
可是我在用的时候如  m=int((1+4091)/2)  结果m=2 要是在转换过程中丢失也不至于就成了2了  不解
我去试下rs.move

谢谢286!

B4层 发表时间: 05-03-07 19:39

回复: 286 [unique]   版主   登录
1 “要是在转换过程中丢失也不至于就成了2了”什么意思?

2 是“rs.move 记录号”,而不是“rs.move”,如果没有,你不妨试试先移指针到头,再
ADOTABLE1.MOVEDBY(记录号)

B5层 发表时间: 05-03-08 09:09

回复: lwei889 [lwei889]   论坛用户   登录
如:m=int((1+4096)/2)
如果不用INT取整 m=2048.5  但是用int取整后,m=2  我不太理解,我想表达的也就是这个意思

再说明一下m我定义的是real类型,在用int转换后,类型发生了改变,是不是在这个过程中导致结果差别这么大!




B6层 发表时间: 05-03-08 17:05

回复: 286 [unique]   版主   登录
是的。一般某个变量类型与要赋给他值的表达式类型不一样,才转换。
你的“m=int((1+4096)/2)”表示,2048.5选转成int类型,然后又转成了real类型。

还有,delphi中赋值不是 m:=int(...)吗?
你这里等于2,是不是系统当成判断二者是否相等了?

B7层 发表时间: 05-03-08 17:16

回复: lwei889 [lwei889]   论坛用户   登录
现在看到你的提示,是我的表达式有问题 我在程序里写的是 m:=int((1+4096)/2) 但在发贴的时候给写漏了
因为m 定义为 real型,但表达是m:=int((1+4096)/2) 应该是表达式的问题,但程序运行过程没有提示,也没有报错

谢谢286
如果286再看到此贴,还想在请教一个问题:
我在用delphi做一个管理IP地址的程序,现在有个问题是批量输入ip地址
如起始ip地址是192.168.0.0  结束IP地址是192.168.10.255
我现在想对用户的输入做一个判断,就是开始IP地址不能大于结束IP地址,还有对起始和结束IP地址是否合法  如果满足以上两个条件 则将这些ip地址写入数据库,否则给出相应提示
286能否给个提示

(明天我把我的想法贴出来,希望286看到后给点指点)


B8层 发表时间: 05-03-11 20:25

回复: 286 [unique]   版主   登录
,这个简单。
你作两个函数,一个是由串转整型,一个由整型转串。

“就是开始IP地址不能大于结束IP地址,”
这个通过串转的整型进行判断

“还有对起始和结束IP地址是否合法”
在串转整型的过程中进行判断。

这样作有几大好处:
1 完成你上面的两个操作。
2 对输入没错但不标准的IP进行标准化。比如192.168.010.010也是一个合法IP,但不标准。

B9层 发表时间: 05-03-14 09:36

回复: lwei889 [lwei889]   论坛用户   登录
谢谢286

B10层 发表时间: 05-03-14 11:56

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号