D2009 TStringlist - PullRequest
       17

D2009 TStringlist

15 голосов
/ 13 июля 2009

Началось деловое затишье лета, поэтому я перешел на D2009. Я грубо определил для каждой подсистемы программы, должны ли они оставаться ascii или могут быть в кодировке Unicode, и начал портировать.

Все прошло нормально, все компоненты были в версиях D2009 (некоторые, например, VSTView, хотя и немного несовместимы), но теперь я столкнулся с проблемой, в какой-то части, которая должна оставаться неизменной, я широко использую TStringList, в основном базовая карта.

Уже есть что-то, что легко заменить, или я должен просто включить сокращенный список tistringlist, основанный на старых источниках Delphi или FPC?

Не могу представить, что я первый столкнулся с этим?

Изменения должны быть относительно локализованы, чтобы код оставался компилируемым с BDS2006, пока я прохожу траекторию проверки. Несколько ifdefs здесь и без проблем. Конечно, string-> ansistring и char -> ansichar и т. Д. Не считаются модификациями в моем источнике, так как в любом случае я должен это сделать, и он полностью обратный.

Редактировать: я смог отработать некоторые вещи в классах чтения / записи. Это делает решение Мэйсона легче, чем я думал. Я буду иметь в виду предложение Габра как запасной вариант.

Дженерики - в значительной степени причина, по которой я купил D2009. Жаль, что они сделали его FPC несовместимым, хотя

Ответы [ 5 ]

13 голосов
/ 13 июля 2009

JCL реализует TAnsiStrings и TAnsiStringList в модуле JclAnsiStrings.

9 голосов
/ 13 июля 2009

TStringList.LoadFromFile / SaveToFile также принимает необязательный параметр типа TEncoding, который позволяет использовать TStringList для хранения любого типа строки, которую вы хотите.

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual;

Также обратите внимание, что по умолчанию TStringList использует ANSI в качестве кодовой страницы, чтобы весь существующий код работал так, как он работает.

9 голосов
/ 13 июля 2009

Если под «картой» вы подразумеваете «хеш-таблицу», вы можете заменить ее на общий TDictionary. Попробуйте объявить что-то вроде этого:

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;

Затем просто замените свои StringLists на TStringMaps правильного типа объекта. (Лучшая безопасность типов добавляется бесплатно.) Кроме того, если вы хотите, чтобы словарь владел объектами и освобождал их, когда закончите, измените его на TObjectDictionary и, когда вы вызываете конструктор, передайте [doOwnsValues] в соответствующий параметр.

(Кстати, если вы собираетесь использовать TDictionary, обязательно загрузите обновление D2009 3. В первоначальном выпуске были некоторые серьезные ошибки в TDictionary, которые делали его практически непригодным для использования.)

РЕДАКТИРОВАТЬ: Если он все еще должен компилироваться под D2006, то вам придется немного подправить. Попробуйте что-то вроде этого:

type
  TStringMap =
{$IFDEF UNICODE}
    class TDictionary<ansiString, TObject>
    (Add some basic wrapper functions here.)
    end;
{$ELSE}
    TStringList;
{$ENDIF}

Оболочка не должна занимать слишком много времени, если вы изначально использовали ее в качестве карты. Вы теряете дополнительную безопасность типов в обмен на обратную совместимость, но вы получаете реальную хеш-таблицу, которая выполняет поиск в O (1) раз.

3 голосов
/ 13 июля 2009

Должны ли эти подсистемы оставаться неизменными или просто как они взаимодействуют с внешним миром (RS232, текстовые файлы и т. Д.)? Как и в случае с C #, я рассматриваю строки в Delphi 2009 как строки и беспокоюсь о преобразованиях только тогда, когда они нужны кому-то еще.

Это также поможет избежать непреднамеренных неявных преобразований в коде и при вызове методов Windows API, что повысит производительность.

2 голосов
/ 13 июля 2009

Вы можете изменить классы TStrings и TStringList в Delphi 2007 (или более ранних версиях) и переименовать их в TAnsiStrings и TAnsiStringList. Вы должны найти, что это очень простая модификация, и она даст вам нужные вам классы.

...