Delphi 2010 Blockread, похоже, получает данные, отличные от предыдущей версии - PullRequest
0 голосов
/ 05 августа 2010

Мой старый считыватель тегов MP3 Id3 перекомпилирован под D2010, и кажется, что он больше не найдет теги. Код

очень прост, но он не работает. Отладчик показывает много нулевых и затем китайских знаков в результатах!

    var dat:file of char;
    id3:array [0..TAGLEN] of Char;  //is 0..127 for ID3 v1
begin
   vValid:=True;
   if FileExists(vFilename) then begin
      assignfile(dat,vFilename);
      If (FileGetAttr(vFilename)>32) or (FileGetAttr(vFilename)=1) then
        Filemode:= 0
      Else
        Filemode:= 2;
      reset(dat);
      seek(dat,FileSize(dat)-128);
      blockread(dat,id3,128);
      closefile(dat);
      vMP3tag:=copy(id3, 0, 3);
      if vMP3Tag='TAG' then begin
         vTitle:=strip(copy(id3, 4, 30),' ');
         vArtist:=strip(copy(id3, 34, 30), ' ');

Я что-то слышал о Unicode и PansiChar, но я все еще не очень понимаю, что они делают в любом случае

спасибо за поиск

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Попробуйте это:

 var dat:file of AnsiChar;
id3:array [0..TAGLEN] of AnsiChar;  //is 0..127 for ID3 v1

Это, конечно, если ваш файл основан на анси, а не на юникоде. Я понятия не имею, что может быть в теге id3 mp3-файла.

Если вы хотите понять разницу, эта белая бумага объяснила мне все это. В основном Unicode использует больше места в памяти для хранения одного символа (например, в 4 раза больше символа ANSI), но они допускают символы, такие как, например, китайский и японский, которые ANSI не предоставляет. Просто прочитайте официальный документ, и тогда все станет ясно.

Короче говоря, Ansichar и Ansistring - это то, что раньше было строкой в ​​Delphi до D2009. В те дни ваше приложение не было совместимо с юникодом (вы не могли печатать китайские символы по умолчанию). Начиная с D2009, определение строки изменилось с ANISRIST на широкую строку и ANSICHAR на WARCHAR. Это означает, что ваше приложение будет по умолчанию unicode. Но старый код, ожидающий, что строки будут ансикодными, должен быть адаптирован для отражения этого изменения. В вашем коде указано char, что означает ansichar для компиляторов до D2009, но widechar для компиляторов D2009 +. Другими словами, новые компиляторы читают ваш код по-другому.

Надеюсь, это немного объясняет.

0 голосов
/ 05 августа 2010

О!

похоже, что AnsiCHar вместо Char - это путь в D2010.

Ansi-char-them-all!

...