:: Visual Foxpro, Foxpro for DOS
Непонятное с PADR()
Каратаев
Автор

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
Добрый день!
Из курсора нужно получить текстовую переменную со строками одинаковой длины. Для этого использую PADR()...
Но результат корявый:
[attachment 36582 padr.png]
Вот тестовый код:
LOCAL lcPageList, lcRes
m.lcPageList = ""
m.lcRes = ""
CREATE CURSOR cur_page (n_gr_tov C(80), page_ I)
INSERT INTO cur_page (n_gr_tov, page_) values("Банки и ведерки", 2)
INSERT INTO cur_page (n_gr_tov, page_) values("Крышки к стаканам", 14)
INSERT INTO cur_page (n_gr_tov, page_) values("Пакеты бумажные", 27)
INSERT INTO cur_page (n_gr_tov, page_) values("Прочее", 112)
LOCAL n_gr_tov, lcRes, lcNom
SCAN
m.lcRes = PADR(alltrim(n_gr_tov),80,'.') + TRANSFORM(PADL(page_,3,' '))
m.lcPageList = IIF(EMPTY(m.lcPageList), m.lcRes, m.lcPageList + CHR(13) + m.lcRes)
ENDSCAN
USE IN SELECT("cur_page")
MESSAGEBOX(m.lcPageList,0,TRANSFORM(LEN(m.lcPageList)))
RETURN
Что не так делаю?


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Результат ГДЕ корявый в messagebox?

Лечение - использовать моноширинный шрифт. forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
TRANSFORM(PADL(page_,3,' '))
Заинтересовало назначение TRANSFORM в этом коде.
Какую задачу он решает?
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
PaulWist
Лечение - использовать моноширинный шрифт
Проблема в том, что MESSAGEBOX() не имеет параметров управления шрифтом выводимого текста.
Те, кому это требовалось, уже давно написали замену этой стандартной функции (заодно расширив и прочую, достаточно ограниченную, её функциональность).



Исправлено 1 раз(а). Последнее : akvvohinc, 29.05.23 16:26
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
Цитата:
TRANSFORM(PADL(page_,3,' '))
Заинтересовало назначение TRANSFORM в этом коде.
Какую задачу он решает?
Преобразует числовой результат функции Len() в строку.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
ssa
akvvohinc
Цитата:
TRANSFORM(PADL(page_,3,' '))
Заинтересовало назначение TRANSFORM в этом коде.
Какую задачу он решает?
Преобразует числовой результат функции Len() в строку.
Но здесь нет функции Len().
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
ssa
akvvohinc
Цитата:
TRANSFORM(PADL(page_,3,' '))
Заинтересовало назначение TRANSFORM в этом коде.
Какую задачу он решает?
Преобразует числовой результат функции Len() в строку.
Но здесь нет функции Len().
Уп-с, не туда глянул...

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
danton1973

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
К стати:
PADR(alltrim(n_gr_tov),80,'.')
не имеет смысла, т.к. PADR и так обрезает/дополняет строку до указанной длины.
PADR(n_gr_tov,80,'.')
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
Каратаев
Автор

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
PaulWist
Результат ГДЕ корявый в messagebox?
akvvohinc
Проблема в том, что MESSAGEBOX() не имеет параметров управления шрифтом выводимого текста.
Те, кому это требовалось, уже давно написали замену этой стандартной функции (заодно расширив и прочую, достаточно ограниченную, её функциональность).
Дело не в MESSAGEBOX(). Его я вставил только для наглядности проблемы. На самом деле это я пытаюсь в репорт вставить содержание отчёта. И в репорте такая же кривизна.
akvvohinc
Заинтересовало назначение TRANSFORM в этом коде.
Верное замечание. Осталось после нескольких экспериментов-манипуляций в демонстрационном коде - в одной из них действительно числовые данные преобразовывались в строку. В программе, естественно, этого нет. Да и суть вопроса была в другом.
Проблема разрешилась изменением шрифта этой конкретной вставки на Courier...
[attachment 36583 padr.png]
Правда сама реализация мне не нравится, попробую вообще сделать по другому...
Спасибо всем за советы!


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/2 positive
Re: Непонятное с PADR()
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
Каратаев
На самом деле это я пытаюсь в репорт вставить содержание отчёта. И в репорте такая же кривизна.

Если речь идет именно о выравнивании в рамках отчета, то есть следующие варианты

1. Примерный расчет через TXTWIDTH() и FontMetric(). Но это будет очень приблизительно и все-равно "криво"
2. Моноширинный шрифт типа Courier
3. Вместо одного объекта отчета использовать 2 объекта наложенных друг на друга. У одного выровнять по левому краю (text alignment = Left), у другого - по правому (text alignment = right). Такое сложно сопровождать, поскольку один объект становится "невидимым". Он целиком "под" другим
3.1. Можно два объекта расположить рядом (как 2 ячейки строки таблицы), если ширина каждого из них гарантированно достаточно для содержимого



Исправлено 1 раз(а). Последнее : Владимир Максимов, 30.05.23 11:05
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
Каратаев
Автор

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
danton1973
не имеет смысла, т.к. PADR и так обрезает/дополняет строку до указанной длины.
В данном случае имеет, так-как мне эти пунктиры от названия до номера надо проставить. А если alltrim() не использовать, то от названия до номера получается много пустого места.
Владимир Максимов
Если речь идет именно о выравнивании в рамках отчета, то есть следующие варианты
Владимир, спасибо. Я думал над такими вариантами, кроме TXTWIDTH() и FontMetric()... Проблему решил просто заменив шрифт в нужном месте:
Каратаев
Проблема разрешилась изменением шрифта этой конкретной вставки на Courier...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Непонятное с PADR()
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
danton1973
К стати:
PADR(alltrim(n_gr_tov),80,'.')
не имеет смысла, т.к. PADR и так обрезает/дополняет строку до указанной длины.
PADR(n_gr_tov,80,'.')
Это замечание совсем некстати:
1) PADR() работает со строкой справа, а ALLTRIM() обрезает её с двух сторон.
2) ALLTRIM() здесь обрезает пробелы, а PADR() дополняет уже освобожденную от пробелов строку точками.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика