чудеса tstringlist

Object Pascal в поєднанні з асемблером в сучасній його формі Delphi 5/6/7 надає необмежені можливості для польоту думки програміста, і цією статтею ми відкриємо серію, в якій послідовно будемо це демонструвати.

Почнемо ми з простого, вкрай корисного, але мало відомого, по крайней мере, для початківців, стандартного класу Дельфі TStringList. Зараз ми подивимося, як красиво вирішуються типові завдання за допомогою цього класу.

Для початку в двох словах, які такі чудові властивості є у об'єктів даного класу. TStringList - це клас, призначений для зберігання списку рядків і списку об'єктів з текстовим поданням (прямо як в 1С - це СпісокЗначеній). Крім того, цей список може бути відсортований в алфавітному порядку чи за допомогою порівняльної функції, написаної програмістом. Крім того, цей список може бути інтерпретований як список значень (Name = string). Крім того, цей список може бути збережений в файл або потік, перетворений в безперервну рядок або рядок, розділену запитом. Фізично отримується рядок або потік являє собою звичайний текст, в якому рядки розділені символами CR / LF (стандартний Windows Text File), або комами (CommaText, Excel). Ну і само собою, є можливість завантажувати список рядків з файлу, потоку, рядки і рядки, розділеної запитом. Слід особливо відзначити чудове властивість упаковки в рядок, розділену запитом: при зворотному розпакуванню рядки завжди відновлюються в їх початковому вигляді. Це означає, що допустима багаторазова вкладеність рядків, розділених комами, що дає величезний виграш при упаковці / розпакування багатовимірних структурних даних в текстовий формат, що ми і продемонструємо на другий завданню.

Отже, для початку розглянемо список рядків як список об'єктів з текстовим поданням, т. К. Саме в цьому ключі слід використовувати список рядків в реальних додатках. Що з себе являє об'єкт з текстовим поданням? Це може бути, наприклад, список товарів, що мають крім найменування ще й додаткові параметри типу одиниці виміру, кількості в упаковці і ціни. Отже, маємо приречення типів:

Набір об'єктів TTovar - це класичний довідник однорідних товарів, наприклад, хлібобулочних виробів. Поле Weight в класі TEdIzm потрібно для перекладу одних одиниць в інші. Повернемося до наших булкам. Припустимо, постачальник "Карякінскій Хлібозавод" надав нам текстовий файл, в якому знаходиться інформація про його нову продукцію і відпускних цінах в форматі текстового файлу:

Якщо вирішувати цю задачу в лоб (як читання по рядках та розбір текстового файлу), а так само безпосередньо додавати в ListBox, то це обернеться неефективною роботою комп'ютера, його подтормаживанием (на слабких машинах), і взагалі, для подальших внесень змін до програмний код це рішення не є найкращим. Набагато ефективніше зробити "фінт вухами", а саме, створити TStringList, завантажити в нього вихідний файл, створити другий TStringList, завантажити в нього товари, впорядкувати їх, і в кінці кінців, привласнити властивості ListBox.Items:

Зауважимо, що якщо написати функцію типу TStringListSortCompare, то можна буде сортувати не тільки по текстовому поданням, але і з будь-яких інших ознак, наприклад, ціною:

Ну і врешті-решт, продемонструємо реакцію на подвійне натискання на отриманому списку товарів. За подвійним клацанням ми покажемо відпускну ціну товару:

До речі, не забуваємо звільняти системні ресурси об'єктів перед видаленням рядків методами ListBox1.Items.Delete () / Clear () або str.Delete () / Clear () (str: TStringList), якщо це потрібно, а так само при закритті програми:

Варто відзначити, що при збереженні або завантаження списку рядків, прикріплені до рядків об'єкти не зберігаються і не відновлюються в стандартному TStringList, однак можна дуже красиво вирішити цю проблему - написати нащадка TStringList з перевизначеними процедурами GetTextStr і SetTextStr, в яких придумати і реалізувати власний формат зберігання об'єктів і їх текстового подання у вигляді безперервного тексту.

Отже, ми побачили, що TStringList дозволяє вирішувати найрізноманітніші завдання від угруповання об'єктів з текстовим поданням до простої обробки списку значень змінних. Тепер подивимося, як цей клас дозволяє вирішувати завдання упаковки / розпаковування складно-структурованих даних в текстовий вигляд і назад. Таке завдання дуже часто виникає в комунікаційних завданнях, наприклад, при передачі даних по мережі або між програмними модулями.

Припустимо, що нам треба запустити якусь програму obrab.exe з параметром командного рядка, в якій необхідно передати обраний товар з сформованого вище списку. Напишемо пакувальник і распаковщик даних. З TStringList ця задача програмується за дві секунди:

Схожі статті