Страница 1 из 1
Формат числа в DBGrid
Добавлено: 13 сен 2006, 18:48
ILI4
У меня такая проблема. Есть поле формата NUMERIC(15,2), когда я его передаю в DBGrid, то он произвольно округляет это число, т.е. если запрос возвращает "6,10", то в гриде пишется "6,1", если "6,00", то просто "6". А мне нужно, чтобы формат был вида #,## ПОСТОЯННО. Как с этим бороться, подскажите пожалуйста
Добавлено: 13 сен 2006, 18:53
WildSery
Пользуйся TDBGridEh. Там у TDBGridColumnEh есть свойство DisplayFormat.
Как вариант - у самого наследника TDataSet при открытии TField.DisplayFormat заполняй.
Короче, тут дельфя, никакого FB.
Добавлено: 13 сен 2006, 18:53
kdv
см. региональные настройки (Пуск, панель управления). хелп по number format, decimalseparator и т.п.
к IB/FB и даже к DBGrid это не имеет отношения.
Добавлено: 13 сен 2006, 19:05
Merlin
Я бы даже сказал не регинальные настройки, а TField.DisplayFormat...
Добавлено: 13 сен 2006, 19:05
WildSery
kdv писал(а):см. региональные настройки (Пуск, панель управления). хелп по number format, decimalseparator и т.п.
к IB/FB и даже к DBGrid это не имеет отношения.
Региональные настройки - это ты его послал так послал
Добавлено: 13 сен 2006, 19:07
kdv
Я бы даже сказал не регинальные настройки, а TField.DisplayFormat...
если человек про это не знает, то он это не менял.
короче, не сердите меня
, топик ведь все равно прибью как полный оффтоп.
Добавлено: 13 сен 2006, 19:13
ILI4
Причем тут региональные настройки... Если бы все было так просто, я бы не задавал такой вопрос. Или мне не верить своим глазам? Ситуацию я по -моему четко описал. одно моджет быть поможет решить проблему- это полея я перекачал IBPumpом из фокспрошной базы. В Эксперте все нормально, в нормальном формате все показывается, а в гриде че- то не хочет. Создаю новое поле такого формата - все нормально показывает....
Добавлено: 13 сен 2006, 19:49
WildSery
Во-первых, ты игнорируешь подсказки
Во-вторых, ты задаёшь вопросы, не описывая что у тебя сделано, с помощью чего, и что уже пробовал/смотрел.
В-третьих, оффтоп, goto nearest Delphi forum
Добавлено: 14 сен 2006, 03:29
CyberMax
Решение:
Вместо TDBGrid использовать TDBGridEh (версия 3.6 - бесплатна). В ней изменяешь у требуемого столбца свойство DisplayFormat:
Запятая - для разделения тысяч и миллионов пробелами.
2
Merlin и
WildSery. У TField нет свойства DisplayFormat. А значит, речь идет чисто о настройке грида.
2
All. Здесь нет оффтопа. Раздел по
визуальным компонентам. Кто считает, что сетка - не визуальный компонент
, пусть бросит в меня камень.
Добавлено: 14 сен 2006, 09:18
Ivan_Pisarevsky
CyberMax писал(а):2 Merlin и WildSery. У TField нет свойства DisplayFormat. А значит, речь идет чисто о настройке грида.
Кладешь на форму ibquery потом по нему двойной тынц, открывается оконце, в нем правой кнопочкой тынц-add all fields потом тынц на нужное поле и в обжект инспекторе зрим свойство DisplayFormat, в него пишем 0.00 и телемаркет.
И все визуальные компоненты опирающиеся на этот датасэт будут казать аки нужно.
Добавлено: 14 сен 2006, 10:15
CyberMax
2 Ivan_Pisarevsky. Да, есть. Потому что там потомки от TField, в которых это свойство и появляется. Повторюсь, у базового класса TField нет DisplayFormat.
Добавлено: 14 сен 2006, 10:54
ILI4
Спасибо за DisplayFormat. Действительно, решило проблему.
Кладешь на форму ibquery потом по нему двойной тынц, открывается оконце, в нем правой кнопочкой тынц-add all fields потом тынц на нужное поле и в обжект инспекторе зрим свойство DisplayFormat, в него пишем 0.00 и телемаркет.
Через IDE TIBQuery уже давно не заполнял, предпочитаю все формировать динамически
. У TNumericField есть это свойство.
Только не пойму почему так все яро кричали что это оффтоп
, если тема ВИЗУАЛЬНЫЕ КОМПОНЕНТЫ + ДАННЫЕ.
Добавлено: 14 сен 2006, 11:24
kdv
да потому оффтоп, что это тема для "1-го класса".
Добавлено: 14 сен 2006, 11:38
WildSery
CyberMax писал(а):Повторюсь, у базового класса TField нет DisplayFormat.
Да что ты прицепился к этому базовому классу? Конечно, там нет, нафига скажем строке или булевому полю этот DisplayFormat? Есть у TNumericField, который и является предком для всех числовых. Но это вопрошающий и сам понимать должен...
Добавлено: 14 сен 2006, 11:43
ILI4
kdv писал(а):да потому оффтоп, что это тема для "1-го класса".
Прекрасный ответ!
Я никогда не юзал TDBGridEh, и не знал про свойство DisplayFormat (ну просто не знал,никогда не сталкивался с такой проблемой). В нете покопал, в свойствах грида и Query полазил, ничего не нашел, решил спросить у профессионалов, коими вас считаю, нашел подходящий топик, получил в большинстве нормальные ответы, все получилось.Извините, что украл МИНУТУ вашего драгоценного времени.
Добавлено: 14 сен 2006, 12:28
CyberMax
kdv писал(а):да потому оффтоп, что это тема для "1-го класса".
Дмитрий, я с вами не соглашусь. Когда начинал работать с базами данных, у меня стояла точно такая же проблема. А под рукой была только справка по delphi. В итоге, не поняв, как решить эту проблему, плюнул на это дело. Вышеупомянутый DisplayFormat виден только у статических полей, про которые говорил Ivan_Pisarevsky. То есть до них еще добраться надо...
WildSery писал(а):Есть у TNumericField, который и является предком для всех числовых. Но это вопрошающий и сам понимать должен...
В датасете через Fields и FieldByName работаешь непосредственно с TField. Поэтому без понятия, кто там для кого предок и потомок
. За все время работы с БД лично мне практически ни разу не приходилось опускаться ниже TField. Не думаю, что один такой...
Добавлено: 14 сен 2006, 12:56
kdv
to CyberMax: уговорил
правда, я не ожидал, что по умолчанию numeric в стандартном гриде выводится таким образом. Привык как-то все время формат указывать, хоть для статических полей, хоть для динамических...
Добавлено: 14 сен 2006, 13:03
WildSery
Код: Выделить всё
if Table1.Fields[i].DataType in ([ftInteger,ftSmallint,ftLargeint,ftBytes,ftWord,ftFloat,ftCurrency]) then
(Table1.Fields[i] as TNumericField).DisplayFormat:='#0.00';
Добавлено: 14 сен 2006, 13:23
CyberMax
Серега, ну ты и извратился через перечисление дататайпов
. Вот так же проще:
Код: Выделить всё
procedure FormatForMoney(Field: TField);
begin
if Field is TNumericField then
TNumericField(Fields).DisplayFormat := '#0.00'
else
raise Exception.Create('Field is not TNumericField');
end;
Конечно, "as" защищает от неверного приведения, но нам-то нужно проверить, что передали TNumericField. А уж что он там конкретно представляет собой - целое, дробное - неважно.
Добавлено: 14 сен 2006, 14:01
WildSery
Бывает
Это я кусок вырезал из CASE, допихав туда типов, а у меня там ещё много всякого делалось...