Delphi

Delphi tstrings: TStrings и TStringList

Класс TStrings Delphi » DelphiComponent.ru

 

 

Класс TStrings Delphi

СвойстваTStrings

count — это свойство, которое вы можете только читать. Здесь хранится коли­чество строк, содержащихся в объекте.

strings — здесь хранится набор строк. К любой строке можно получить доступ, написав такую конструкцию:

 

Переменная:=Имя Объекта.Strings[Номер строки];

Имя Объекта.Strings[Номер строки]:= Переменная;

 

Первая строка кода запишет в переменную содержимое указанной строки. Вто­рая строка, наоборот, запишет содержимое переменной в указанную строку. За­помните, что строки в этом объекте нумеруются с нуля.

 

Text — в этом свойстве хранятся все строки в виде одной целой строки, разде­ленные кодами конца строки и перевода каретки.

Методы объекта TStrings

  • Add (Строка) — метод добавляет строку, указанную в качестве параметра в конец набора строк объекта. Возвращает номер, под которым добавлена новая строка.
  • Append (Строка) —этот метод тоже добавляет строку, указанную в качестве па-раметра, в конец набора строк объекта. Он ничего не возвращает.
  • AddStrings (Набор строк типа TStrings) — метод добавляет все Строки ИЗ другого объекта типа TStrings.
  • Assign— метод присваивает вместо своего набора строк новый, указанный в качестве параметра.
  • clear — метод удаляет все строки из объекта.
  • Delete (Номер строки) — позволяет удалить строку под указанным номером.
  • Equals (Набор строк типа TStrings) — метод допускает сравнение собственного набора строк с указанным в качестве параметра. Если наборы равны, то метод вернет true, иначе false.
  • Exchange
    (Номер1, номер2) — метод меняет местами строки указанных номеров.
  • Get (номер строки) — метод возвращает строку указанного номера.
  • indexof (Строка) —этот метод позволяет найти указанную в качестве параметра строку. Если такая строка существует в наборе, то метод вернет ее индекс, иначе— 1.
  • insert (Номер, Строка) — метод позволяет вставить в набор новую строку под указанным номером.
  • LoadFromFile (Имя файла) — данный метод используется, чтобы загрузить набор строк из указанного текстового файла.
  • saveToFile(Имя файла) — метод обеспечивает сохранение набора строк в ука-занном текстовом файле.
  • Move (номер 1, номер2) — метод перемещает строку под номером номер1 на место строки Номер2.
Пока этих свойств и методов больше чем достаточно. Позже будут рассматриваться в основном эти методы, хотя это далеко не все.

Помоги проекту! Расскажи друзьям об этом сайте:


Delphi, Pascal, Windows, Итерации, Приведенный, Создавать, данных, диалоговое, значение, использовать, компонентов, компоненты, компьютер, которого, логики, между, модуль, модуля, можете, можно, ничего, операции, писать, получается, помощью, программ, программа, программирования, программист, программы, прямо, работе, работы, разработки, скачать, среду, строками, строке, существующего, чтобы

Показать все теги

IDA 7 не распознает/не правильно ссылается на 16-битные строки Delphi

спросил

Изменено 4 года, 8 месяцев назад

Просмотрено 848 раз

Я балуюсь с приложением XE3 Delphi в IDA 7.

0 и не могу получить Представление строк для правильной работы:


При выборе Delphi (16 бит) в окне строк дают правильные результаты:


Ссылки на строки в представлении разборки являются неудачными .

  • Ниже приведено определение строки по адресу .text:008717DC :

  • Ниже приведена (неудачная) ссылка на него:


Попытка изменить тип строки на Delphi (16 бит) завершается с ошибкой с Ошибка команды "SetStrlitStyle"


Как ни странно, не все строки имеют неверные ссылки:


Для справки, IDR (Interactive Delphi Reconstructor) дает правильные представления:


я поставил По умолчанию Тип строки от до Delphi (16 бит) в опциях:


Вот параметры компилятора :


Вся помощь приветствуется, спасибо!

  • ida
  • строки
  • delphi

Это не только проблема Delphi, это общая проблема обнаружения юникода в IDA. Я не могу быть уверен, как именно это работает, но я чувствую, что у IDA есть проблема при определении типа данных. И это связано с приоритетом адресного представления над строковым литералом. т.е. когда он находит какую-либо инструкцию, которая ссылается на адрес, он пытается определить, какие данные находятся по этому адресу. В вашем случае он нашел mov eax, смещение 8717E0, он прочитал 4 байта по адресу 8717E0. Получил 0x6F0053, проверил, похоже ли 0x6F0053 на адрес? Да, в текущей базе данных это действительный адрес. Тогда к черту все дальнейшее определение, сделаем данные по смещению 8717E0 на loc_6F0053. Если бы такого адреса 0x6F0053 не было, он бы подвергся дальнейшему анализу и в итоге пришел к выводу, что это юникодная строка.

Итак, чтобы исправить это, вам нужно подключить анализ в модуле процесса и выполнить собственное определение типа. Это не может быть решено ни одной из настроек IDA.

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

Delphi 2009 — Струнное исполнение — Te Waka o Pascal

[Приблизительное время прочтения: 6 минут]

ПРИМЕЧАНИЕ. Загрузки теперь исправлены!

Андреас Хаусладен щедро потратил время, чтобы сделать несколько подробных комментариев к моему предыдущему сообщению, один из которых побудил меня собрать несколько дополнительных тестов производительности для типов String . Результаты были чем-то вроде смешанной сумки и содержали некоторые сюрпризы.

Тесты

Методология

При любом обсуждении тестирования производительности методология неизбежно подвергается тщательному анализу — я не собираюсь вдаваться в это обсуждение — относительные различия представляют интерес здесь и с точки зрения тестируемого кода I пытались быть осторожными, чтобы уравнять игровое поле, насколько это возможно. Конечно, если кто-то найдет что-то, что полностью опровергает какой-либо из тестов, это совсем другое дело.

Настройки компилятора были одинаковыми во всех случаях  Конкретные настройки, о которых следует упомянуть:

— для Delphi 2009 новая настройка компилятора $STRINGCHECKS OFF . Стоит отметить, что по умолчанию это ON , что влечет за собой снижение производительности, которое не нужно, если ваши проекты Delphi также не используют или не используют C++ Builder.

— Для всех протестированных версий Delphi использовался FastMM 4.90.

Диспетчер памяти в Delphi 2009 кажется на самом деле немного более эффективным, даже чем эта последняя версия FastMM, которая сама по себе интересна, и для практических целей, конечно, мы бы использовали встроенный менеджер памяти, если он наиболее эффективен. .

Но в целях сравнительного тестирования производительности использование одного и того же диспетчера памяти со всеми компиляторами гарантирует, что на результаты не повлияют различия в реализации диспетчера памяти.

Тестируемые области

В комментариях Андреаса упоминалось использование объявлений параметров const , поэтому я рассмотрел их, в частности, сравнив вызовы процедуры с параметром const и с процедурой без const 9Объявление 0012 по тому же параметру. Последующие комментарии, в которых обсуждалась настройка $STRINGCHECKS, пролили некоторый свет на первоначальные выводы Андреаса, но тем не менее результаты этих тестов содержали сюрприз, поэтому я их оставил. и Удалить() .

Я включил IntToStr() , чтобы повторить тесты, которые ранее вызывали у меня беспокойство по поводу производительности строк ANSI в Delphi 2009..

Я также протестировал использование Pos() для поиска подстроки в строке — как там, где интересующая подстрока существовала в строке темы, так и там, где ее не было.

Последний тест, выполненный в каждой версии компилятора, был для функции Replace() .

Затем в определенных компиляторах был проведен ряд дополнительных тестов.

Для Delphi 7 и Delphi 2007 я также включил тесты FastStrings FastPos() и FastReplace() функции. Я не стал включать эти тесты в Delphi 2009 после комментариев Андреаса (подтвержденных тестами) о том, что FastStrings были заменены улучшениями в RTL.

Для Delphi 2009 я включил повторы различных тестов с использованием строк, объявленных как ANSIString — ни в одном из этих тестов не было явных преобразований в Unicode — все переменные, параметры и т. д. были последовательно объявлены как ANSIString .

Было предложено провести сравнение с WideString может представлять интерес. Я не уверен, что это действительно даст много информации — мы уже знаем, что WideString — это очень неэффективный тип, который принципиально не изменился в Delphi 2009, и что UnicodeString намного эффективнее — тем не менее я включил эти тесты, чтобы удовлетворить любознательных в этой области.

Также для Delphi 2009 я повторил тест Concat с использованием TStringBuilder , просто чтобы посмотреть, как производительность этого класса сравнивается с обычными операциями построения строк (в частности, с конкатенацией в данном случае).

Тесты и результаты

[dm]8[/dm]

Без моего фреймворка Smoketest (скоро, обещаю!) это не скомпилируется, не говоря уже о каких-либо результатах тестов, но я предоставляю исходный код, чтобы каждый мог найти артефакты в моем тестовом коде, которые, по их мнению, могут объяснить результаты тестов, которые они считают неточными или нерепрезентативными.

[dm]9[/dm]

Кстати, Smoketest не выдает результаты (хочу!). Тестовый проект скомпилирован как КОНСОЛЬНОЕ приложение и выдает результаты производительности в виде выходных данных CSV на консоль, которые я перенаправил в файлы, которые затем импортировал в Excel. В результате этого упражнения я уже имею в виду некоторые усовершенствования Smoketest, чтобы облегчить такое сравнительное тестирование в будущем.

Для тех, кого не интересуют полные необработанные результаты теста, вот снимок вкладки сводки, показывающий фактические данные результатов для Delphi 2009.и относительное сравнение этих результатов с результатами для Delphi 7 и Delphi 2007 (результаты для которых находятся на отдельных листах рабочей книги).

Цветовая схема должна быть довольно очевидной и следовать шкале градиента от красного (ухудшение производительности) до зеленого (улучшение производительности). Третий столбец сравнений показывает относительную производительность в самой Delphi 2009 для ANSIString и WideString по сравнению с String (т. е. UnicodeString 9).0012).

Во-первых, хорошие новости

UnicodeString

На основе протестированных операций производительность строк Unicode кажется — за некоторыми исключениями — в целом лишь немного медленнее, чем для строк ANSI в Delphi 7. Разрыв между Delphi 2009 и 2007, однако, больше, по-видимому, потому, что Delphi 2007 включает улучшения по сравнению с Delphi 7, как предложил Андреас.

Неудивительно, что больше всего страдают символьные операции — Copy() и Pos() например.

ANSIString

Здесь есть неожиданные крайности — некоторые вещи выполняются значительно быстрее, чем в Delphi 7, но некоторые важные операции выполняются значительно медленнее, и в некоторых случаях я затрудняюсь объяснить, почему. Отсутствие ANSI-версии IntToStr() сильно вредит, если вы явно используете ANSIString .

WideString

Никаких сюрпризов. Широкая строка работает медленно, и производительность в Delphi 2009 не отличается от Delphi 7 или Delphi 2007. из которых кажутся улучшенными по сравнению с Delphi 7, но не с Delphi 2007.  т. е. эти улучшения появились в Delphi 2007 и остались в Delphi 2009, а не являются улучшениями Delphi 2009 как таковыми.

FastStrings

Не выделено на изображении выше, но доступно в данных результатов тестирования. Сравнительная производительность FastStrings по сравнению с подпрограммами RTL в Delphi 7 и Delphi 2007 подтвердила то, что предположил Андреас: FastStrings уже не так полезны, как раньше. был.

По общему признанию, в моих тестах использовались только FastPos() и FastReplace() , так как эти процедуры наиболее важны для меня. Из этих FastPos() были явно заменены улучшениями в RTL, но не настолько FastReplace() , которая по-прежнему в два раза быстрее, чем подпрограмма RTL StringReplace() (но версия FastStrings, по общему признанию, немного более громоздка для вызова).

Не очень хорошие новости

Как уже упоминалось, общая производительность UnicodeString сравнима с производительностью обработки строк в Delphi 7 и несколько менее эффективна, чем в Delphi 2007.

Однако в ряде случаев обработка строк в Delphi 2009 год не просто немного, а значительно хуже.

Подпрограмма RTL Copy() является наиболее очевидным и, возможно, важным примером, поскольку она в три раза медленнее, чем реализация Delphi 2007.

Процедура Pos() сильно пострадала в Delphi 2009, будучи лишь вдвое менее эффективной, чем в Delphi 2007.

Плохая новость — строки ANSI

было поднято, одно предложение состояло в том, чтобы «ANSIify» любой необходимый код. То есть сделайте объявления строки (и символа и т. д.) явно ANSI, чтобы сохранить предыдущее поведение строки ANSI в тех областях приложения, где это необходимо.

К сожалению, если в таких случаях важна производительность, это может не сработать.

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

Для меня результаты были преимущественно обнадеживающими.

Двумя самыми большими проблемами, связанными с реализацией Unicode, были производительность и объем памяти. Приняв UTF16, просто невозможно избежать проблемы с объемом памяти, но кажется, что проблема производительности — в значительной степени — не является серьезной проблемой.

Но это не обязательно универсальная истина.

Если производительность кода обработки строк имеет решающее значение для вашего приложения, возможно, было бы целесообразно специально протестировать ваш подход к реализации и убедиться, что вы получаете максимальную отдачу от компилятора. Когда это был простой вопрос о ANSIString и WideString , это было довольно просто.

С UnicodeString и ANSIString все может быть сложнее.

Что касается меня, то меня больше не слишком беспокоит ситуация с FastStrings в Delphi 2009, хотя на всякий случай я мог бы использовать ANSI-интерфейсы FastStrings для собственного использования, в частности FastReplace() .

Проект, для которого эти проблемы были наиболее актуальны для меня, в настоящее время все еще находится в Delphi 5, поэтому я подозреваю, что возможный переход на Delphi 2009 фактически покажет общее улучшение по сравнению с этой базой Delphi 5 (хотя мы уже используем FastStrings). и FastMM).

Прощальная мысль:

– Зачем ты TStringBuilder?

Результаты простого объединения строк с использованием TStringBuilder были ошеломляющими. Из тестового кода вы заметите, что я был осторожен, чтобы не запутать результаты теста созданием и разрушением самого TStringBuilder , но, конечно, в реальном мире некоторые дополнительные накладные расходы связаны с необходимостью возведения и разрыва. вниз экземпляров TStringBuilder по мере необходимости.

Я еще не проверял преимущества, которые дает

TStringBuilder в Delphi.NET, и если судить об опыте коллег с эквивалентом C#, он может быть огромным. Но это просто не применимо к Win32, и на самом деле TStringBuilder , кажется, ничего не требует, кроме штрафов — это приводит к тому, что код становится труднее читать и кажется медленнее — значительно — чем «сырые» строковые операции.

Конечно, если бы вы использовали TStringBuilder , имея в виду производительность, похоже, вы совершаете ужасную ошибку, хотя тест в этом упражнении вряд ли представляет собой всеобъемлющий тест всех функциональных возможностей TStringBuilder . Возможно, есть другие операции, где это происходит быстрее.

Но мне кажется, что TStringBuilder существует в первую очередь как приспособление для совместимости с .NET, а не для предоставления каких-либо реальных преимуществ разработчикам приложений Win32, за возможным исключением разработчиков, желающих или нуждающихся в едином источнике Win32.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *