Как сделать форматный вывод в делфи

Добавил пользователь Skiper
Обновлено: 05.10.2024

урок из цикла: Учебное пособие по программированию на языке 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 различают три типа файлов:

  1. текстовые
  2. типизированные
  3. нетипизированные

Текстовые файлы.

В тектсовых файлах хранится информация, интерпретируемая как непрерывный последовательный набор текстовых символов.

Типизированный файл.

В типизированном файле информация хранится как набор последовательностей, имеющих одинаковую длину. Тип каждой последовательности может быть:

  1. Порядковый
  2. Вещественный
  3. Массив
  4. Запись
  5. Множество


Нетипизированные файлы.

Исходная информация переводится в двоичный вид, разбивается на блоки одинакового объёма и записывается на носитель.

Файловая переменная.

С помощью файловой переменной указывается тип файла.

  1. varF=TextFile; текстовый файл
  2. varF=File of тип_допустимый_для_типизированного_файла
    Например: varF=File of integer;
  3. 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

Читайте также: