Строки формата "Hello %type %username"

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Строки формата "Hello %type %username"

Сообщение krab »

В Lazarus есть функция Format, которая делает подстановку параметров в строки формата. Например:

Код: Выделить всё

ResourceString
  greeting = '"Hello %s. %s, welcome to ..."
begin
  Label1.Caption := Format(greeting, ['Mr' 'John']);
end


Как быть, если таких параметров много и желательно их как-то именовать, чтобы не запутаться? Т. е. хотелось бы Format2('Hello %type. %username, welcome to ...', [type='Mr', name='John', age=25, address='bbbbccccdd']) или чего-то подобного, но в стиле Delphi.
Последний раз редактировалось krab 21.07.2010 18:49:35, всего редактировалось 2 раза.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Пишем данную функцию ручками :wink:
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

Mr.Smart писал(а):Пишем данную функцию ручками :wink:

Видимо, без создания своей библиотеки-расширения к Lazarus для 101 мелочи не обойдется. :D
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Делается элементарно. Но, что-то я не понимаю каким ты образом собрался определять где %type, а где %username в параметрах, если синтаксис будет идентичен синтаксису format?
Или это не нужно? Тогда, зачем, вообще, усложнять, если что к чему возможно определить по списку параметров?
Или это для переводчика? Думаю, лишнее.
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

А.Н. писал(а):Делается элементарно.

Ясно, что элементарно. Просто было бы хорошо по-максимуму пользоваться стандартными решениями, а не переопределять/дополнять Lazarus вплоть до создания "своего" диалекта Паскаль. Со своими уникальными граблями и тонкостями.

А.Н. писал(а):Делается элементарно. Но, что-то я не понимаю каким ты образом собрался определять где %type, а где %username в параметрах, если синтаксис будет идентичен синтаксису format?

Не идентичен, уже исправил. Format2('Hello %type. %username, welcome to ...', [type='Mr', name='John', age=25, address='bbbbccccdd'])
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

вплоть до создания "своего" диалекта Паскаль.

Так есть уже. :D В lazreport модуль LR_Pars.

Format2('Hello %type. %username, welcome to ...', [type='Mr', name='John', age=25, address='bbbbccccdd'])

o.O Вы хотите поменять синтаксис Паскаля? Или переопределить оператор сравнения?
Может, тогда уж так:
Format2('Hello %type. %username, welcome to ...', ['type=Mr', 'name=John', 'age=25', 'address=bbbbccccdd']);
И сделать, например, экран, чтобы было возможно вводить '=' или дублирование, как для апострофа.

Добавлено спустя 1 минуту 28 секунд:
Как вариант: ['type', 'Mr', 'name', 'John']. Первый - название параметра, второй - значение.
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

А.Н. писал(а):Вы хотите поменять синтаксис Паскаля? Или переопределить оператор сравнения?

Часть фич, введенных в новых Delphi и FPC пока не знаю. Ожидал, что без потери удобства найдется что-то более подходящее, чем переопределение оператора сравнения.
А.Н. писал(а):Как вариант: ['type', 'Mr', 'name', 'John']. Первый - название параметра, второй - значение.

Единственный подоходящий вариант из перечисленных, т. к. значения параметров это и выражения в том числе: ['type', StrPrefix, 'name', NameEditBox.Text].
Последний раз редактировалось krab 21.07.2010 19:15:24, всего редактировалось 1 раз.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Подойдет только так, т. к. значения параметров это и выражения в том числе: ['type', StrPrefix, 'name', NameEditBox.Text].

['type=' + StrPrefix, 'name=' + NameEditBox.Text]

В любом случае, стандартной функции вы не найдёте. Возможно либо посмотреть в интернете, что есть.
Либо, написать самому. Код format(...) достаточно прост. Обработку массива возможно взять оттуда.
По параметрам и значениям надо построить список параметр-значение.
Разбор строки формата тривиален: цикл, поиск '%', чтение имени параметра до разделителя.
Затем, подстановка значения вместо имени, в другой буфер.
Т.е., по-идее, больших сложностей возникнуть не должно.

Добавлено спустя 1 минуту 57 секунд:
Да, ещё есть %%. :-) Про который надо помнить. Ну, это тонкости.
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

А.Н. писал(а):Да, ещё есть %%. :-) Про который надо помнить. Ну, это тонкости.

А что это? Гугл не находит ничего вменяемого.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Это печатание %. s := format('%%s', []). s = '%s'

Добавлено спустя 5 минут 52 секунды:
o.O Чего-то я сам не нашёл что это такое, даже в справке по delphi. Это, наверное, только в printf.
Да, и, конечно же, если вы всю функциональность format(...) решите сделать, это будет уже не так тривиально.
Хотя, с другой стороны... Код format(...) есть.
yurgel
новенький
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Сообщение yurgel »

единственное, что должна сделать эта функция - это вместо всех %type, %name и т.д. подставить %S, а дальше - вызвать формат. пишется это... ну... минут за 10, наверное.

з.ы. это если автор просто хочет наглядности, без контроля самих параметров и их типов.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

единственное, что должна сделать эта функция - это вместо всех %type, %name и т.д. подставить %S, а дальше - вызвать формат. пишется это... ну... минут за 10, наверное.

Ну, тоже вариант.

Добавлено спустя 10 минут 10 секунд:
Кстати, не только %s, но ещё и корректные параметры format. Поскольку %type может входить в строку формата несколько раз, а в параметрах он имеет единственное вхождение.
Кстати, а учёт стандартных спецификаторов? Надо проверять есть ли такой параметр.
Если нет - оставлять имя после %.
Плюс, %*typename, как %*s? Или %1:s, по аналогии: %1:typename.
Должно быть format('%1:s', ['type_name_value']);
Нужно ли, вообще, вызывать format?

Добавлено спустя 3 минуты 7 секунд:
sysformt.inc и сделать, по аналогии, именно то, что нужно.

Добавлено спустя 1 минуту 18 секунд:
Кстати, %% в format тоже есть.

Добавлено спустя 1 минуту 44 секунды:
Короче, лучше выпить и забить.
yurgel
новенький
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Сообщение yurgel »

А.Н. писал(а):Короче, лучше выпить и забить.


+1 ;)
Ответить