数据集 BOF 和 EOF 不能确定的问题(50分)

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

savetime

Unregistered / Unconfirmed
GUEST, unregistred user!
一个Dataset打开后,Bof为真
跳到下一条记录,再跳回,Bof不为真
《Delph4开发大全》说这是因为另一个用户或者程序的另一个进程有可能
在数据集中插入了新的记录
^^^^^^^^^^^^^^

很奇怪,其它用户或进程插入记录不需要调用Dataset的方法吗?如果调
用Dataset的方法那Bof或Eof就应能确定,这是什么原因?
 
又是这个问题,打补丁
 
同意楼上的,
版本低了,找一个补丁
 
看来我还得再答一次这种问题,下载这些补丁:
ftp://ftpc.borland.com/pub/delphi/devsupport/updates/delphi5/D5EntUpdate.exe
ftp://ftpc.inprise.com/pub/delphi/devsupport/updates/adoexpress/d5adoupdate2.exe

sn:555-555-5555 9ex0-91x0 或 SKI-HD3-C139 92x0-92x1
 
什么补丁?
 
我倒,你们倒是看清题目啊!
这是原理的问题,怎么一出问题就是补丁补丁的。
 
  
这是正常的,各位可以查阅Delphi的手册。
Bof为真,当且仅当:
1、刚打开数据集时;
2、执行First方法时;
3、数据集已经在开头时再执行Prior 方法;
4、对空数据集执行SetRange。
这样设计,对某些循环操作的判断比较方便。
  
 
这是delphi的bug,下载补丁就可以了,好多delphi的网站上都有的
 
>>这样设计,对某些循环操作的判断比较方便。
还是不够明白,对于单线程的VCL,和循环操作有必然联系吗?
 
不好意思,看错题目。
实际上,BOF真正指的并不是数据集的第一条记录,而是指数据指针指向了第一条记录之前,
因为第一条记录之前并不存在记录,所以执行操作时它会按指向第一条记录来处理。
first并不会使bof为真,只有在打开数据集时和当记录指针处于第一条时,再执行prior,
才会使bof为真。
eof的情况也类似,在经常使用的while not eof循环中,当记录处于最后一条时,eof并不
为真,只有这时再执行一个next,指针指向了最后一条记录之后,eof才会为真。
 
不认真,first与last会使bof与eof为真。
 
>>first并不会使bof为真
First之后当然Bof为真了。
这个问题的实际意义是,如果用户在第一条记录时,Prior或First键仍可用
这是没有道理的。
 
补丁补丁,呵呵
 
我感觉Bof不是指针,而是一个内置属性
当打开数据集时Bof设为真
当First或Prior出错时Bof也设为真,以标明是否在首记录
其它记录移动则将Bof设为否

我猜想这样的设计很可能是出于性能的考虑
否则数据集就应该知道当前记录是否是首记录或末记录
 
不是什么补丁的问题,就是snowboat和HunterTeam两位老兄说的,并不是记录位于表首BOF就=true,细心的可以通过数据导航条的BUTTON 在浏览数据时他的ENabled可以看得出来。
 
savetime 和snowboat说得很对,不要动不动就补丁补丁的,这样是Delphi一开始设计的,
你调用Next,然后又Prior,bof当然不能变成true了,你在调用一次prior试试看,这时
bof就变成true了
 
>>很奇怪,其它用户或进程插入记录不需要调用Dataset的方法吗?如果调
>>用Dataset的方法那Bof或Eof就应能确定,这是什么原因?

我不明白,你说的其它用户难道和你用的是同一个DataSet?
其它用户在其它机器上用你的应用程序的一个副本更改记录集,
难道要通知你这台机器上的DataSet?
 
  
to savetime:
 呵呵,你想深了,我说的循环不是那个系统循环,我是说在用代码控制循环遍历数据集
的时候,循环条件比较好写。例如:
  Table1.First;
while not Table1.Eof do
begin
//Use the current record of Table1
Table1.Next;
end;
假如到了首尾记录就将Bof或Eof置真,循环条件就不好写了,还要专门判断是否空集。
  
 
又是这个问题
 
to ysai
>>其它用户在其它机器上用你的应用程序的一个副本更改记录集,
^^^^
应用程序的复本数据集还能不是副本?

to snowboat
有点道理,马上下班了,回去考虑一下。
 
后退
顶部