Domanda

Analizzando alcuni dei miei vecchi progetti Delphi e aggiornandoli a D2009, trovando questa versione un grande miglioramento (Generics.Collections - wow!;)) rispetto a tutte le versioni precedenti, ho riscontrato vari problemi. Questo sono riuscito a risolvere, ma la soluzione non sembra la metà elegante di quanto credo possa essere. (Nota, non scrivo il codice Delphi da circa tre anni e anche allora era un hacking piuttosto amatoriale che una comprensione approfondita di ciò che sta succedendo).

Il mio codice dovrebbe avere un TFileStream e leggere da esso. I file sono stati scritti in precedenza dalla mia vecchia app Delphi in modo che i primi tre caratteri nel file fossero CTR per riconoscere il tipo di file come valido. Il lettore leggeva nei primi tre byte in una matrice di caratteri (ed ecco il problema, ora che sizeof (char) è 2 byte) e quindi tratta questa matrice come stringa per vedere se legge "CTR".

var ...
buffer: array[0..2] of char;
begin
...
InStream.read(buffer, 3);
if buffer <>'CTR' then begin ShowMessage('Not a valid file!'); exit; end;
...

Questo verrà compilato e funzionava, ma ora il buffer è praticamente lungo 6 byte e quindi non equivale a "CTR" mai .

Ho risolto questo problema modificando il buffer in array [0..2] di byte e ho introdotto alcune altre variabili locali per fare quanto segue:

for b in buffer do s := s + chr(b); //notice the for..in loop now available in D2009
if s<>'CTR'...

Quindi in pratica trasformo i singoli byte in una stringa e poi faccio il confronto, ma ci deve essere un modo più semplice per farlo. Puoi per favore far luce su questo problema?

È stato utile?

Soluzione

È possibile impostare il buffer su

var
  buffer: array[0..2] of AnsiChar;

e leggerai esattamente la stessa cosa di prima.

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