Класс 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
- 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.
При выборе 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.