Формат числа в DBGrid

Вопросы стыковки визуальных компонент (DataControls, EhGrid, VirtualTreeView, DevExpress и т.п.) с данными из БД.

Модераторы: kdv, CyberMax

Ответить
ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Формат числа в DBGrid

Сообщение ILI4 » 13 сен 2006, 18:48

У меня такая проблема. Есть поле формата NUMERIC(15,2), когда я его передаю в DBGrid, то он произвольно округляет это число, т.е. если запрос возвращает "6,10", то в гриде пишется "6,1", если "6,00", то просто "6". А мне нужно, чтобы формат был вида #,## ПОСТОЯННО. Как с этим бороться, подскажите пожалуйста :cry:

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 сен 2006, 18:53

Пользуйся TDBGridEh. Там у TDBGridColumnEh есть свойство DisplayFormat.
Как вариант - у самого наследника TDataSet при открытии TField.DisplayFormat заполняй.
Короче, тут дельфя, никакого FB.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 сен 2006, 18:53

см. региональные настройки (Пуск, панель управления). хелп по number format, decimalseparator и т.п.
к IB/FB и даже к DBGrid это не имеет отношения.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 сен 2006, 19:05

Я бы даже сказал не регинальные настройки, а TField.DisplayFormat...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 сен 2006, 19:05

kdv писал(а):см. региональные настройки (Пуск, панель управления). хелп по number format, decimalseparator и т.п.
к IB/FB и даже к DBGrid это не имеет отношения.
Региональные настройки - это ты его послал так послал :lol:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 сен 2006, 19:07

Я бы даже сказал не регинальные настройки, а TField.DisplayFormat...
если человек про это не знает, то он это не менял.

короче, не сердите меня :) , топик ведь все равно прибью как полный оффтоп.

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Сообщение ILI4 » 13 сен 2006, 19:13

Причем тут региональные настройки... Если бы все было так просто, я бы не задавал такой вопрос. Или мне не верить своим глазам? Ситуацию я по -моему четко описал. одно моджет быть поможет решить проблему- это полея я перекачал IBPumpом из фокспрошной базы. В Эксперте все нормально, в нормальном формате все показывается, а в гриде че- то не хочет. Создаю новое поле такого формата - все нормально показывает....

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 сен 2006, 19:49

Во-первых, ты игнорируешь подсказки
Во-вторых, ты задаёшь вопросы, не описывая что у тебя сделано, с помощью чего, и что уже пробовал/смотрел.
В-третьих, оффтоп, goto nearest Delphi forum

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 сен 2006, 03:29

Решение:
Вместо TDBGrid использовать TDBGridEh (версия 3.6 - бесплатна). В ней изменяешь у требуемого столбца свойство DisplayFormat:

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

Column[N].DisplayFormat := ',0.00';
Запятая - для разделения тысяч и миллионов пробелами.

2 Merlin и WildSery. У TField нет свойства DisplayFormat. А значит, речь идет чисто о настройке грида.

2 All. Здесь нет оффтопа. Раздел по визуальным компонентам. Кто считает, что сетка - не визуальный компонент :roll:, пусть бросит в меня камень.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 14 сен 2006, 09:18

CyberMax писал(а):2 Merlin и WildSery. У TField нет свойства DisplayFormat. А значит, речь идет чисто о настройке грида.
Кладешь на форму ibquery потом по нему двойной тынц, открывается оконце, в нем правой кнопочкой тынц-add all fields потом тынц на нужное поле и в обжект инспекторе зрим свойство DisplayFormat, в него пишем 0.00 и телемаркет. :) И все визуальные компоненты опирающиеся на этот датасэт будут казать аки нужно.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 сен 2006, 10:15

2 Ivan_Pisarevsky. Да, есть. Потому что там потомки от TField, в которых это свойство и появляется. Повторюсь, у базового класса TField нет DisplayFormat.

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Сообщение ILI4 » 14 сен 2006, 10:54

Спасибо за DisplayFormat. Действительно, решило проблему.

Кладешь на форму ibquery потом по нему двойной тынц, открывается оконце, в нем правой кнопочкой тынц-add all fields потом тынц на нужное поле и в обжект инспекторе зрим свойство DisplayFormat, в него пишем 0.00 и телемаркет.
Через IDE TIBQuery уже давно не заполнял, предпочитаю все формировать динамически :) . У TNumericField есть это свойство.


Только не пойму почему так все яро кричали что это оффтоп :?: , если тема ВИЗУАЛЬНЫЕ КОМПОНЕНТЫ + ДАННЫЕ.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 сен 2006, 11:24

да потому оффтоп, что это тема для "1-го класса".

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 11:38

CyberMax писал(а):Повторюсь, у базового класса TField нет DisplayFormat.
Да что ты прицепился к этому базовому классу? Конечно, там нет, нафига скажем строке или булевому полю этот DisplayFormat? Есть у TNumericField, который и является предком для всех числовых. Но это вопрошающий и сам понимать должен...

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Сообщение ILI4 » 14 сен 2006, 11:43

kdv писал(а):да потому оффтоп, что это тема для "1-го класса".
Прекрасный ответ!
Я никогда не юзал TDBGridEh, и не знал про свойство DisplayFormat (ну просто не знал,никогда не сталкивался с такой проблемой). В нете покопал, в свойствах грида и Query полазил, ничего не нашел, решил спросить у профессионалов, коими вас считаю, нашел подходящий топик, получил в большинстве нормальные ответы, все получилось.Извините, что украл МИНУТУ вашего драгоценного времени.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 сен 2006, 12:28

kdv писал(а):да потому оффтоп, что это тема для "1-го класса".
Дмитрий, я с вами не соглашусь. Когда начинал работать с базами данных, у меня стояла точно такая же проблема. А под рукой была только справка по delphi. В итоге, не поняв, как решить эту проблему, плюнул на это дело. Вышеупомянутый DisplayFormat виден только у статических полей, про которые говорил Ivan_Pisarevsky. То есть до них еще добраться надо...
WildSery писал(а):Есть у TNumericField, который и является предком для всех числовых. Но это вопрошающий и сам понимать должен...
В датасете через Fields и FieldByName работаешь непосредственно с TField. Поэтому без понятия, кто там для кого предок и потомок :). За все время работы с БД лично мне практически ни разу не приходилось опускаться ниже TField. Не думаю, что один такой...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 сен 2006, 12:56

to CyberMax: уговорил :)

правда, я не ожидал, что по умолчанию numeric в стандартном гриде выводится таким образом. Привык как-то все время формат указывать, хоть для статических полей, хоть для динамических...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 13:03

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

if Table1.Fields[i].DataType in ([ftInteger,ftSmallint,ftLargeint,ftBytes,ftWord,ftFloat,ftCurrency]) then
  (Table1.Fields[i] as TNumericField).DisplayFormat:='#0.00';

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 сен 2006, 13:23

Серега, ну ты и извратился через перечисление дататайпов :D. Вот так же проще:

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

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. А уж что он там конкретно представляет собой - целое, дробное - неважно.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 14:01

Бывает :) Это я кусок вырезал из CASE, допихав туда типов, а у меня там ещё много всякого делалось...

Ответить