Domanda

Potrei essere l'ultimo ragazzo sul pianeta che fa affidamento su B-Tree Filer, ma ho fatto il salto da Delphi 2007 a XE2.

Dopo aver superato tutti i problemi di Ansichar e Pansichar, il codice ora si blocca con un controllo a portata con zero elementi su una pagina.

Qualcuno sta eseguendo correttamente il filer B-albero sotto Delphi XE2? Se è così, come hai fatto? :)

Aggiornare Errore di controllo dell'intervallo qui:

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; 

Mentre Page.ItemsonPage non dovrebbe mai essere zero (l'errore di controllo dell'intervallo è valido qui), potrebbe essere stato causato da problemi di allineamento dei dati. Questo codice, aggiunto a btdefine.inc sembra fare il trucco ...

{$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}
È stato utile?

Soluzione

Ho fatto una porta veloce, e attualmente l'ho praticamente Lavorando, Bene abbastanza per far funzionare la demo di Delphi inclusa. Il mio primo tentativo non è riuscito quando ho trascurato alcune stringa -> Ansistring Modifiche nel codice demo, che ha causato la funzione del codice demo PadCH al malfunzionamento. Dopo averlo risolto, la demo e la libreria sottostante appare funzionali, almeno per la lettura, ma non ho ancora testato la scrittura, la modifica e la creazione di file. Il file sopra nella demo è stato creato in una versione precedente, quindi almeno è compatibile con lettura binaria. Non sarei sorpreso se ci fossero molti bug, problemi di corruzione dei dati e così via, quindi per favore non utilizzare questo codice in produzione o, se lo fai, lo fai a tuo rischio.

enter image description here

Il mio lavoro è qui: ospitato su Microsoft Skydrive (4.3 megs, zip) (fileName tpbtreefiler_xe2_v2.zip)

Aggiornare Funzione isamunpack è in isamwork.inc.

Aggiornamento2 Sembra che l'OP abbia scoperto ora che l'aggiunta di un supporto costante per le versioni IFDEF provoca da cambiare il {$ r-} e alcune flag di allineamento su cui sono necessarie anche, affinché la biblioteca funzioni correttamente. Posso suggerire il seguente modo diverso di dichiarare in btdefine.inc, che aggira una classica "pausa ogni volta che cambiamo versioni del compilatore Delphi" utilizzando un confronto che non si romperà sulla prossima versione di 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}

Aggiornamento 3 Sospetto che ci siano ancora problemi di porting nel codice, che potrebbero causare perdita di dati e corruzione del file di dati. Ecco un esempio in cui il numero di record (che dovrebbe essere un numero nell'intervallo circa 50 nella mia app demo) viene segnalato come numero> 1 milione, il che è chiaramente non valido.

enter image description here

Altri suggerimenti

Altri due articoli da controllare

  1. Cambia "String" in "Ansistring"
  2. Se la build target è di 64 bit, le tue modifiche non lo rendono ancora pronto

Saluti

Dopo aver funzionato tutto, ho scoperto che la reindexing da un'app XE2 ha rotto le tabelle B-Treefiler (BTREEFiler) con un errore ISAM #10122 ("La dimensione della pagina per il blocco file è maggiore del maxPageSize"). Ecco la correzione:

Questo deve essere cambiato in Filer.Pas per il reindesting per funzionare:

IsamInfoRec = packed Record
    InfoRec : IsamSmallInfoRec;
    DummyFill : AnsiChar; <<<<<<<< Here!
    KeysUsed : LongInt;{Must start on an even offset for C-compatibility}
    PageSizeUsed : Word; {!!.42}
End;

Spero che Warren (sopra) abbia aggiornato il suo lavoro con questa soluzione aggiuntiva. Ho anche pubblicato questo sulla posizione di Turbopower Btreefiler SourceForge.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top