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

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

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

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

Сообщение krab » 21.07.2010 16:18:19

В 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 раз(а).
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

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

Сообщение Mr.Smart » 21.07.2010 17:59:12

Пишем данную функцию ручками :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение krab » 21.07.2010 18:04:17

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

Видимо, без создания своей библиотеки-расширения к Lazarus для 101 мелочи не обойдется. :D
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

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

Сообщение А.Н. » 21.07.2010 18:36:05

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

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

Сообщение krab » 21.07.2010 18:49:45

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

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

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

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

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

Сообщение А.Н. » 21.07.2010 19:01:45

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

Так есть уже. :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']. Первый - название параметра, второй - значение.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

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

Сообщение krab » 21.07.2010 19:08:11

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

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

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

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

Сообщение А.Н. » 21.07.2010 19:09:14

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

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

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

Добавлено спустя 1 минуту 57 секунд:
Да, ещё есть %%. :-) Про который надо помнить. Ну, это тонкости.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

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

Сообщение krab » 21.07.2010 19:18:11

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

А что это? Гугл не находит ничего вменяемого.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

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

Сообщение А.Н. » 21.07.2010 19:31:35

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

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

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

Сообщение yurgel » 21.07.2010 20:02:10

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

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

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

Сообщение А.Н. » 21.07.2010 20:03:24

единственное, что должна сделать эта функция - это вместо всех %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 секунды:
Короче, лучше выпить и забить.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

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

Сообщение yurgel » 21.07.2010 20:21:09

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


+1 ;)
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Рейтинг@Mail.ru