我可能是这个星球上依靠B-Tree Filer的最后一个人,但我从Delphi 2007跳到了XE2。
在克服了所有AnsiChar和PAnsiChar问题后,代码现在崩溃,并在页面上显示零项目的范围检查。
是否有人在Delphi XE2下成功运行B-Tree Filer?如果是这样,你怎么做的? :)
更新范围检查错误:
procedure IsamUnPack(var Page : IsamPage; KeyL : Word);
var
I, K, S : Word;
P : Array [0..0] Of Byte absolute Page; {Real bounds [0..65535]}
begin
K := KeyL + 9;
S := Pred (Page.ItemsOnPage) * K + 6;
if KeyL <> MaxKeyLen then begin
for I := Page.ItemsOnPage downto 2 do begin
Move(P[S], Page.ItemArray[I], K); // Range Check error in Warren P's suggestion
S := S - K;
end;
end;
end;
虽然Page.ItemsOnPage永远不应为零(范围检查错误在此处有效),但它可能是由数据对齐问题引起的。这段代码,添加到BTDEFINE.INC似乎正在做的伎俩...
{$IFDEF VER230}
{$DEFINE UsingDelphi}
{$ENDIF}
{$IFDEF VER230} {Delphi XE2}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}
答案 0 :(得分:1)
我做了一个快速端口,我目前基本上已经正常工作,足以让所包含的Delphi演示工作。当我忽略一些字符串时,我的第一次尝试失败了 - &gt; DEMO代码中的ansistring更改,导致演示代码函数PadCH
出现故障。在我修复之后,演示和底层库看起来很有用,至少对于阅读而言,但我还没有测试编写,修改和创建文件。演示中的上述文件是在早期版本中创建的,因此至少它与二进制读取兼容。如果存在大量错误,数据损坏等问题,我不会感到惊讶,所以请不要在生产中使用此代码,否则请自行承担风险。
我的工作在这里:托管在microsoft skydrive(4.3 megs,ZIP) (filename tpbtreefiler_xe2_v2.zip)
更新功能IsamUnpack位于ISAMWORK.INC中。
Update2 OP似乎现在发现添加一些ifdef-version-constant支持导致{$ R-}和一些对齐标志被打开,这也是必需的,对于图书馆工作正常。我可以建议在BTDEFINE.INC中使用以下不同方式声明,通过使用在下一个delphi版本中不会破坏的比较来解决经典Delphi“每次更改Delphi编译器版本时中断”:
{$IF CompilerVersion > 20.0 }
{ Keep working from Delphi 2009 UP}
{$DEFINE UsingDelphi}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}
更新3 我怀疑代码中仍然存在移植问题,这可能会导致数据丢失和数据文件损坏。这是一个示例,其中记录的数量(应该是我的演示应用程序中大约50的范围内的数字)被报告为数字&gt; 100万,这显然是无效的。
答案 1 :(得分:0)
还有两件要检查的项目
干杯
答案 2 :(得分:0)
在我完成所有工作之后,我发现从XE2应用程序重新索引打破了B-TreeFiler(BTreeFiler)表,其中包含isam错误#10122(“文件块的页面大小大于MaxPageSize” )。这是修复:
需要在Filer.pas中更改此版本以便重新编制索引:
IsamInfoRec = packed Record
InfoRec : IsamSmallInfoRec;
DummyFill : AnsiChar; <<<<<<<< Here!
KeysUsed : LongInt;{Must start on an even offset for C-compatibility}
PageSizeUsed : Word; {!!.42}
End;
我希望Warren(上图)通过这个额外的修复更新了他的工作。我还在TurboPower BTreeFiler SourceForge位置发布了这个。