Как сделать форматный вывод в делфи
урок из цикла: Учебное пособие по программированию на языке Delphi
2.10.1. Строковые значения
Строка - это последовательность символов. При программировании строковые значения заключаются в апострофы, например:
Так как апостроф является служебным символом, для его записи в строке как значащего символа применяются два апострофа, следующих непосредственно друг за другом:
Строка, которая не содержит символов, называется пустой: Теперь, когда известно, что представляют собой строковые значения, займемся строковыми переменными.
2.10.2. Строковые переменные
Строковая переменная объявляется с помощью зарезервированного слова string или с помощью идентификатора типа данных AnsiString, например:
Строку можно считать бесконечной, хотя на самом деле ее длина ограничена 2 ГБ. В зависимости от присваиваемого значения строка увеличивается и сокращается динамически. Это удобство обеспечивается тем, что физически строковая переменная хранит не сами символы, а адрес символов строки в области динамически распределяемой памяти (о динамически распределяемой памяти мы расскажем ниже). При создании строки всегда инициализируются пустым значением (''). Управление динамической памятью при операциях со строками выполняется автоматически с помощью стандартных библиотек языка Delphi.
Вы конечно же можете описывать строковые типы данных и использовать их при объявлении переменных и типизированных констант, например:
Для того чтобы в программе обратиться к отдельному символу строки, нужно сразу за идентификатором строковой переменной или константы в квадратных скобках записать его номер. Например, FriendName[1] возвращает значение 'A', а FriendName[4] - 'x'. Символы, получаемые в результате индексирования строки, принадлежат типу Char.
2.10.3. Строки в формате Unicode
Для поддержки работы со строками формата Unicode в язык Delphi имеется строковый тип данных WideString. Работа со строками типа WideString почти не отличается от работы со строками типа AnsiString; существуют лишь два отличия.
Первое отличие состоит в представлении символов. В строках типа WideString каждый символ кодируется не одним байтом, а двумя. Соответственно элементы строки WideString - это символы типа WideChar, тогда как элементы строки AnsiString - это символы типа AnsiChar.
Второе отличие состоит в том, что происходит при присваивании строковых переменных. Об этом вы узнаете чуть позже, прочитав параграф "Представление строк в памяти".
2.10.4. Короткие строки
Короткая строка объявляется с помощью идентификатора типа ShortString или зарезервированного слова string, за которым следует заключенное в квадратные скобки значение максимально допустимой длины, например:
Короткая строка может иметь длину от 1 до 255 символов. Предопределенный тип данных ShortString эквивалентен объявлению string [255].
Реальная длина строки может быть меньше или равна той, что указана при ее объявлении. Например, максимальная длина строки Friend в примере выше составляет 30 символов, а ее реальная длина - 9 символов. Реальную длину строки можно узнать с помощью встроенной функции Length . Например, значение Length(Friend) будет равно 9 (количество букв в слове Alexander).
Все символы в строке типа ShortString пронумерованы от 0 до N, где N - максимальная длина, указанная при объявлении. Символ с номером 0 - это служебный байт, в нем содержится реальная длина короткой строки. Значащие символы нумеруются от 1. Очевидно, что в памяти строка занимает на 1 байт больше, чем ее максимальная длина. Поэтому значение SizeOf(Friend) будет равно 31.
Обратиться к отдельному символу можно так же, как и к символу обычной строки. Например, выражения FriendName[1] и FriendName[9] возвращают соответственно символы 'A' и 'r'. Значения FriendName[10] .. FriendName[30] будут случайными, так как при объявлении типизированной константы FriendName символы с номерами от 10 до 30 не были инициализированы. Символы, получаемые в результате индексирования короткой строки, принадлежат типу Char.
Поскольку существует два типа строк: обычные (длинные) строки и короткие строки, возникает закономерный вопрос, можно ли их совмещать. Да, можно! Короткие и длинные строки могут одновременно использоваться в одном выражении, поскольку компилятор языка Delphi автоматически генерирует код, преобразующий их тип. Более того, можно выполнять явные преобразования строк с помощью конструкций вида ShortString(S) и AnsiString(S).
2.10.5. Операции над строками
Выражения, в которых операндами служат строковые данные, называются строковыми . Они состоят из строковых констант, переменных, имен функций и строковых операций. Над строковыми данными допустимы операции сцепления и отношения.
Операция сцепления (+) применяется для сцепления нескольких строк в одну строку.
Если короткой строке присваивается значение, длина которого превышает максимально допустимую величину, то все лишние символы справа отбрасываются.
Допускается смешение в одном выражении операндов строкового и символьного типа, например при сцеплении строки и символа.
2.10.6. Строковые ресурсы
В языке Delphi существует специальный вид строковых данных - строковые ресурсы. Строковые ресурсы очень похожи на строковые константы, но отличаются от них тем, что размещаются не в области данных программы, а в специальной области выполняемого файла, называемой ресурсами. Если данные всегда загружаются вместе с кодом программы и остаются в оперативной памяти вплоть до завершения программы, то ресурсы подгружаются в оперативную память лишь по мере надобности.
В программе строковые ресурсы описываются как обычные строковые константы, с той лишь разницей что раздел их описания начинается не словом const , а словом resourcestring :
Использование строковых ресурсов ничем не отличается от использования строковых констант:
2.10.7. Форматы кодирования символов
Существуют различные форматы кодирования символов. Отдельный символ строки может быть представлен в памяти одним байтом (стандарт Ansi), двумя байтам (стандарт Unicode) и даже четырьмя байтами (стандарт UCS-4 - Unicode). Строка "Wirth" (фамилия автора языка Pascal - прародителя языка Delphi) будет представлена в указанных форматах следующим образом (рисунок 2.11):
Существует также формат кодирования MBCS (Multibyte Character Set), согласно которому символы одной строки кодируются разным количеством байт (одним или двумя байтами в зависимости от алфавита). Например, буквы латинского алфавита кодируются одним байтом, а иероглифы японского алфавита - двумя. При этом латинские буквы и японские иероглифы могут встречаться в одной и той же строке.
2.10.8. Стандартные процедуры и функции для работы со строками
Так как обработка строк выполняется практически в каждой серьезной программе, стандартно подключаемый модуль System имеет набор процедур и функций, значительно облегчающих этот процесс. Все следующие процедуры и функции применимы и к коротким, и к длинным строкам.
Программы, которые были ранее разработаны в системе Delphi, позволяли выводить информацию на экран компьютера или вводить информацию с клавиатуры с отображением ее на экране. Однако основными задачами, ради которых были разработаны компьютеры, являются задачи по обработке информации, в том числе задачи вычислительного характера. Поэтому дальнейший материал будет посвящен составлению программ для решения вычислительных задач.
Простейшими программами являются программы с линейной алгоритмической структурой, которая предполагает выполнение команд последовательно друг за другом. Программы линейной структуры с вычислениями обычно включают в себя следующие этапы:
1. ввод исходных данных;
2. вычисление требуемой величины;
3. вывод результата.
Соответствующая этим этапам блок-схема линейного алгоритма будет следующей:
Рис. 62 Блок-схема линейного алгоритма
Простейшим оператором ввода и вывода является рассмотренный нами оператор присваивания. В системе программирования Delphi ввести исходные данные и вывести результат позволяют различные компоненты.
Для ввода данных удобно использовать компонент TEdit. Для этого необходимо с помощью мыши установить в текстовом поле курсор и ввести с клавиатуры текст. Вводимая строка отображается в свойстве Text компонента TEdit и воспринимается программой как набор символов. Цифровые символы можно преобразовать в числа с помощью соответствующих типу числа функций преобразования.
Таблица 9. Функции преобразования
Функция | Значение функции |
IntToStr (x) | Преобразует целое число в строку символов. |
StrToInt (x) | Преобразует строку символов в целое число. |
FloatToStr (x) | Преобразует вещественное число в строку символов. |
StrToFloat (x) | Преобразует строку символов в вещественное число. |
FloatToStrF(x, f, k, m) | Преобразует вещественное число в строку символов в соответствии с указанными параметрами: f – формат (способ изображения); k – точность (нужное количество цифр); m – количество цифр после десятичной точки |
Chr (x) | Возвращает символ, соответствующий ASCII коду числа х. |
Для вывода информации можно использовать компонент TLabel. Чтобы увидеть результат работы программы, нужно присвоить свойству Caption компонента TLabel новое значение. Свойство Caption символьного типа. Поэтому выводимое число следует преобразовать в строку символов с помощью соответствующих типу числа функций преобразования.
Рассмотрим проект, в котором реализуется линейная алгоритмическая структура, и используются функции преобразования.
Пример.На рис. 62 приведен вид диалогового окна пересчета скорости из км/ч в м/с. Составить программу, которая по щелчку на кнопке выполняет этот перевод (исходная скорость выражается целым числом). |
Рис. 63 Графический интерфейс окна
Исходные данные – скорость в км/ч – будем вводить в текстовое поле Edit1. Результат перевода выведем в надпись Label2.
В данном проекте можно выделить следующие этапы линейного алгоритма:
1. Ввести в поле Edit1 скорость в км/ч.
2. Перевести скорость из км/ч в м/с.
3. Вывести в надпись Label2 скорость в м/с.
Рассмотрим каждый этап линейного алгоритма.
1. Для обозначения исходной скорости в км/ч введем дополнительную переменную целого типа V1. Присвоим переменной V1 значение свойства Text компонента Edit1.
Однако такая запись является неверной, так как типы данных до и после знака присваивания не совпадают: переменная V1 целого типа, а свойство Text компонента Edit1 имеет строковый тип данных. Чтобы далее производить вычисления с вводимыми в поле Edit1 цифрами, которые пока воспринимаются программой как текст, необходимо преобразовать их в числовой формат. В данном случае необходимо использовать функцию StrToInt (преобразует строку в целое число). Таким образом, текст команды ввода будет иметь следующий вид:
V1:= StrToInt (Edit1.Text);
2. Чтобы перевести скорость из км/ч в м/с нужно умножить значение скорости на 1000 и разделить 3600 (в 1 километре – 1000 метров, в 1 часе – 3600 секунд). Введем еще одну переменную V2 для обозначения скорости в м/с. Таким образом, для расчета скорости в м/с используется следующий оператор:
Переменная V2 будет вещественного типа, так как в выражении для ее вычисления имеется операция деления.
3. Для вывода полученной скорости предназначен компонент Label2. Поэтому необходимо свойству Caption компонента Label2 присвоить значение переменной V2:
Данная запись опять нарушает соответствие типов данных, так как в свойстве Caption у надписи могут отображаться только данные символьного типа, а переменная V2 – это вещественное число. Поэтому необходимо преобразовать переменную V2 вещественного типа в строку функцией FloatToStr (преобразовать вещественное число в строку). Текст команды вывода будет выглядеть следующим образом:
При выводе результата часто к полученным значениям добавляют комментарии. Например, в данном проекте можно к значению скорости добавить запись её единиц измерения ‘м/с’. В программе эта запись указывается в одиночных кавычках (апострофах), т.к. является символьной константой. Таким образом, вывод результата может иметь следующий вид: Label2.Caption:= FloatToStr(V2)+ ‘м/с’;
Так как мы ввели дополнительные переменные V1 и V2, то нужно указать их тип в разделе описаний переменных. Все переменные, используемые в Delphi, подразделяются на два основных вида. Это глобальныепеременные, которые могут использоваться во всей программе, и локальныепеременные, которые можно использовать только внутри определенной процедуры.
В данном случае опишем переменные как локальные внутри процедуры TForm1.Button1Click. Для этого после заголовка процедуры введем раздел описания переменных, который открывается зарезервированным словом var. Описание переменных будет выглядеть так:
var V1: integer; V2: real;
Таким образом, текст обработчика события для кнопки Пересчет будет выглядеть следующим образом:
procedure TForm1.Button1Click(Sender: TObject); |
var V1: integer; V2: real; |
begin |
V1:= StrToInt (Edit1.Text); |
V2:= V1*1000/3600; |
Label2.Caption:= FloatToStr(V2) + ‘м/с’; |
end; |
Рис. 64 Работающее приложение
Можно было написать программу и без ввода дополнительных переменных:
procedure TForm1.Button1Click(Sender: TObject); |
begin |
Label2.Caption:= FloatToStr((StrToInt (Edit1.Text))*1000/3600) + ‘м/с’; |
end |
Чтобы программа была готова к вводу новых данных, нужно очистить текстовое поле и поместить в него курсор. В Delphi для этого применяются методы:
Некоторое время назад я рассказывал о нововведении в Delphi 2010 – автоформатировщике исходного исходного кода. Описание составило две статьи в блоге:
Новый инструмент по [Ctrl+D] помогал привести в относительный порядок исходный код модуля, расставлял где надо отступы, менял регистр символов и т.д. В общем брал на себя довольно муторную работу, особенно когда дело касалось работы с чужими исходниками. Но, как и большинство впервые выпущенных инструментов, Formatter не был лишен некоторых недостатков. И в Delphi XE у Formatter’a появилась ещё одна страница свойств.
На странице “Profiles and Statuses” вы можете:
1. Включить/Отключить использование форматтера (флажок с Enable Formatter)
2. Включить/Отключить вывод предупреждения о форматировании модуля (флажок Show Confirmation)
Если показ предупреждения включен, то после нажатия Ctrl+D будет показываться вот такое информационное окно: 3. Сохранить/Загрузить свой набор настроек форматтера
Очень удобная возможность. Каждый набор настроек Formatter Delphi XE теперь можно сохранить ф отдельный файл, дав ему соответствующее название, загрузить дефолтные настройки, если вдруг что-то настроили неправильно и забыли где и т.д.
В общем, разработчики из Embarcadero в версии Delphi XE постарались учесть максимум потребностей пользователей, что не может не радовать. Захотели включить форматирование – поставили галку и форматируйте исходник на автомате, нет? – отключили. Хотя я сколько работал в Delphi 2010 (и продолжаю работать) могу сказать, что этот инструмент выручал меня уже очень много раз и каких-либо серьезных нареканий по его работе у меня не было. Надеюсь и у Вас, при использовании Delphi XE, с форматтером сложатся хорошие отношения ;)
Книжная полка
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
Описание: Книга рассчитана на подготовленного пользователя ПК, желающего самостоятельно научиться программировать и разрабатывать приложения и базы данных в среде Delphi. Опытные программисты смогут использовать издание как справочник. В тексте подробно описаны более 80 компонентов VCL, функции Object Pascal и Win32 API.
Описание: Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
. (продолжение следует) .
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца.
Подскажите пожалуйста. Можно ли в делфи организовать, так же как в паскале работу с вещественными числами, т.е. есть вещественное число которое вывожу в лейбл, необходимо как в паскале установить формат вывода(Х:4:2). Если это можно сделать в делфи подскажите как, и если можно поподробнее.
Заранее спасибо.
Посмотри в help'e Delphi.. Format Strings.
Перед этим тебе естественно нужно перевести IntToStr.
Зачем.
Format может вывести все что хочешь. Если нужно дробные числа, то дробные.
Файл — структура данных, находящаяся на носителе данных (энергонезависимом или энергозависимом).
Подробное рассмотрение работы с текстовым файлом «Delphi работа с файлами«.
Типы файлов.
В Delphi различают три типа файлов:
- текстовые
- типизированные
- нетипизированные
Текстовые файлы.
В тектсовых файлах хранится информация, интерпретируемая как непрерывный последовательный набор текстовых символов.
Типизированный файл.
В типизированном файле информация хранится как набор последовательностей, имеющих одинаковую длину. Тип каждой последовательности может быть:
- Порядковый
- Вещественный
- Массив
- Запись
- Множество
Нетипизированные файлы.
Исходная информация переводится в двоичный вид, разбивается на блоки одинакового объёма и записывается на носитель.
Файловая переменная.
С помощью файловой переменной указывается тип файла.
- varF=TextFile; текстовый файл
- varF=File of тип_допустимый_для_типизированного_файла
Например: varF=File of integer; - varF=File; — нетипизированный файлж
Оператор AssignFile.
Этот оператор связывает файловую переменную и путь доступа к файлу. Формат оператора:
Запись в текстовый файл.
Запись осуществляется операторами WriteLn и Write
Процедура WriteLn.
Procedure WriteLn( varF, Var1,Var2,Var3, … , VarI, … , VarN)
Процедура записывает символьные представления переменных. После переменной VarN будет записан признак конца строки EOLN (End of Line).
Чтобы записать следующую строку, надо вновь применить процедуру WriteLn, и так далее.
Например. s1:=’123′; s2:=’abc’; s3:=’456′; s4:=’xyz’;WriteLn( varF, s1,s2); WriteLn( varF,s3,s4); Будут сфомированы две строки:
Формат записи в файл.
Запись производится посимвольно. Каждый символ занимает 1 байт (или 2 байта в системе Unicode). Например, слово АБВГ займёт 4 байта, а целое число 123456 займёт 6 байт.
Процедура Write.
Она аналогична процедуре WriteLn,но не вставляет символы конца строки. Если в предыдущем примере заменить WriteLn на Write, то будем иметь:
Процедура ReadLn.
Однократное применение рпоцедуры приводит к считыыванию одной строки.
Например. Файл записан двукратным применением процедуры WriteLn. Применим двукратно процедуру ReadLn(varF,s); где s — строковая переменная.
Первое прочтение даст s=’123abc’, а второе s=’456xyz’.
Замечание 2.Если применить процедуру в виде ReadLn(varF), то будет просто пропущена очередная запись.
Процедура Read.
Если файл записан с помощью процедуры WriteLn, то процедура Read стчитывает только первую запись. Второе применение Read приводитк тому же результату, то есть считываение не идёт дальше первой записи.
Если файл записан с помощью процедуры Write, то Read(varF,s) прочитает весь файл до конца и разместит его содержимое в переменной s.
Например. Если файл сформирован с помощью процедуры Write (как показано выше):
то Read(varF,s) вернёт s=123abc 456xyz.
Запись чисел в текстовый файл.
Целые и вещественные числа записываются обычным образом.
Например, writeLn(varF,i); где i — переменная целого типа. Аналогично записывается вещественное число.
Запись числа можно считать или обычным образом, представив его в виде строки: ReadLn(varF,s), или непосредственно в формате целого числа: ReadLn(varF,i).
Для вещественного числа процедура ReadLn(varF,s)вернёт:
edit4.Text:=floatToStr(r); где r — переменная вещественного типа, вернёт:
Создание нового файла.
Процедура ReWrite(varF) либо создаёт новый файл, либо уничтожает уже имеющийся и на его месте создаёт новый.
Открытие существующего файла.
Существующий текстовый файл можно открыть для чтения.
Процедура Reset(varF) открывает файл для чтения (или переоткрывает его). Указатель файла перемещается в начальную позицию.
Добавление записей в существующий файл.
Добавить новую запись в текстовый файл можно только в его конец.
Процедура Append(varF) открывает текстовый файл для добавления записи в конец текстового файла.
Пример.
procedure TForm1.Button2Click(Sender: Tobject);
var s,s1:string; f:textFile;
begin
assignFile(f,’myTextFile.txt’);
append(f);//открываем файл для добавления записей
s:=’123′;
s1:=’abc’;
writeLn(f,s,s1);//записываем первую строку
s:=’456′;
s1:=’xyz’;
writeLn(f,s,s1);//записываем вторую строку
closeFile(f);//закрываем файл
self.ListBox1.Items.LoadFromFile(‘myTextFile.txt’);//отображаем содержимое файла в компоненте ListBox1
В результате имеем:
procedure TForm1.Button3Click(Sender: Tobject);
var s,s1,s2,s3,s4:string; f:textfile; i,ii:integer; c:char; r:real;
begin
assignfile(f,’3.txt’);
reset(f);//открываем текстовый файл для чтения
В результате будем иметь:
procedure TForm1.Button4Click(Sender: Tobject);
var s,s1:string; f:textFile;
begin
assignFile(f,’myTextFile.txt’);
append(f);//открываем файл для добавления записей
s:=’123′;
s1:=’abc’;
write(f,s,s1);//записываем первую строку
s:=’456′;
s1:=’xyz’;
write(f,s,s1);//записываем вторую строку
closeFile(f);//закрываем файл
self.ListBox1.Items.LoadFromFile(‘myTextFile.txt’);//отображаем содержимое файла в компоненте ListBox1
В результате имеем:
procedure TForm1.Button5Click(Sender: Tobject);
var s,s1:string; f:textFile;
begin
read(f,s);
self.Memo1.Lines.Add(s);
В результате имеем:
Посимвольное прочтение файла.
procedure TForm1.Button6Click(Sender: Tobject);
var s,s1:string; f:textFile; c:char;
begin
Читайте также: