Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Точка, а не запятая в DbGrid ? / 14 сообщений из 14, страница 1 из 1
01.07.2003, 04:47
    #32195587
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Как заставить DBGrid или dxDBGrid(Quatum) вводить вещественные числа через точку (Delphi5+DBF+Table+DbGrid).
В Win2000 стоит разделитель по умолчанию ','
На OnCreate формы пишу:
DecimalSeparator:='.';
В таблице добавлены все поля, в свойствах вещественных полей:
DisplayFormat:='#######0.00;#######0.00;#';
EditFormat:='#######0.00;#######0.00;#';
Что и где еще можно прописать что бы при редактировании можно было бы вводить точку, а не запятую (изменить в windows-е разделитель не предлагать :)
При вышеуказанных настройках отображение происходит через точку, но при редактировании меняется на запятую и вводить можно только запятую, нажатие точки не воспринимается.
Но если выйти из редактирования с запятой, то кричит неверный разделитель.
Такая строчка:
caption:=floattostr(strtofloat('3.14'));
отрабатывает нормально, т.е. strtofloat с точкой нормально работает, а вот почему грид не дает точку вводить ? :((
Если DisplayFormat и EditFormat убрать, тот же.
...
Рейтинг: 0 / 0
01.07.2003, 05:02
    #32195588
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Попробовал для обычного грида из таблицы удалить все поля, что бы они просто автоматически подставлялись при Table.open, после этого шаманства можно стало вводить точку при DecimalSeparator:='.'
Но динамическое подключение неудобно, это же нужно в realtime при старте вносить все описания полей width/caption и прочее.
Тем более что dxDBGrid(Quatum) при простом открытии таблицы не прописывает сам поля в отличие от стандартного DBGrid.
Так что неужели это неисправимый глюк Делфи ?
При настроенном Table (все поля с масками) и dxDBGrid(Quatum) c подключенными полями точку ввести не получается.
Может все же можно где еще что прописать, подшаманить или все придется делать динамически(без TFloatField и TdxDBGridMaskColumn)?
...
Рейтинг: 0 / 0
01.07.2003, 05:39
    #32195591
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Ура, вроде нашел :)
На AfterOpen делаем:
var
i: integer;
begin
for i:=0 to Pred(DataSet.FieldCount) do begin
if ((DataSet.Fields is TFloatField) and (DataSet.Fields.FieldKind=fkData))
then DataSet.Fields.ValidChars:=['0'..'9','.',','];
end;
end;

и тогда вводится и точка и запятая.
Надо будет во всех режимах погонять.
Может все же кто знает как сделать без этой процедуры на AfterOpen на каждой Table ?
...
Рейтинг: 0 / 0
01.07.2003, 08:33
    #32195641
Andrew Campball
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
procedure TDocEditForm.ItemsGridKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) and (QueryItems.State in [dsInsert, dsEdit]) then
QueryItems.Post;
if (Key in ['.', ',']) and ((ItemsGrid.SelectedField.DataType = ftFloat) or
(ItemsGrid.SelectedField.DataType = ftBCD))then
Key := DecimalSeparator;
end;
...
Рейтинг: 0 / 0
02.07.2003, 03:47
    #32196721
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
To: Andrew Campball
Данное решение подходит тогда, когда DecimalSeparator программы совпадает с DecimalSeparator windows или если поля в Grid-е подключаются динамически, а не в дизайнере.

Если в Table добавлены поля базы (и настроены русские title.caption) и на create формы указывается DecimalSeparator отличный от DecimalSeparator windows (для примера в системе "," а в программе "."), то данный пример ничем помочь не может, т.е. тогда ни точку ни запятую ввести нельзя :(
Любой из вас может это сам проверить на простом примере.

Ключевое же для решения именно "статической" таблицы и несовпадающего с системным DecimalSeparator является DataSet.Fields.ValidChars:=['0'..'9','.',','];
Т.е. разрешить полю обрабатывать нажатия кнопок "," и "."

Как дополнение к этому (т.е. к процедуре из предыдущего моего поста) можно использовать еще такую процедуру:

procedure TForm1.TablePoleSetText(Sender: TField; const Text: String);
var
i: integer;
s: String;
begin
s:=Text;
i:=Pos('.',s);
if (i>0) then s :=DecimalSeparator
else begin
i:=Pos(',',s);
if (i>0) then s:=DecimalSeparator
end;
try
Sender.Value:=StrToFloat(s);
except on EConvertError do
begin
Application.MessageBox(pChar('Недопустимое значение "'+Text+'"!'), 'Внимание ошибка!', MB_OK+MB_ICONERROR);
Abort;
end
end;
end;
...
Рейтинг: 0 / 0
02.07.2003, 04:09
    #32196722
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
блин вроде писал нормально, а [ i ] вырвыло, т.е. вместо
s:=DecimalSeparator
должно быть конечно
s [ i ] :=DecimalSeparator
...
Рейтинг: 0 / 0
02.07.2003, 08:17
    #32196763
Andrew Campball
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Что и где еще можно прописать что бы при редактировании можно было бы вводить точку, а не запятую (изменить в windows-е разделитель не предлагать :)

Я вам кажется ответил на Ваш вопрос.
И что вам мешает в указаном примере написать не Key := DecimalSeparator а
Key := '.' ?

Обычно при вводе чисел используется цифровая часть клавиатуры и точку используют именно с нее. Но в русской раскладке там ',', а в английской - '.'.
...
Рейтинг: 0 / 0
02.07.2003, 16:12
    #32197472
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
>>Я вам кажется ответил на Ваш вопрос.

Цитировать вопрос нужно было с этими строчками:
>>В Win2000 стоит разделитель по умолчанию ','
>>На OnCreate формы пишу:DecimalSeparator:='.';
>>В таблице добавлены все поля, в свойствах вещественных полей...
:)
А теперь попробуйте c при этих условиях работоспособность вашего примера.
У меня при таких настройках нельзя ввести ни точку ни запятую и Key := '.' не поможет.
Ваш пример помогает в том случае, если просто нужно обрабатывать нажатия и точки и запятой независимо от раскладки клавиатуры, но DecimalSeparator в программе должен совпадать с системным или таблица не должна содержать прописанных в дизайнере полей, а подключать их динамически.
P.S. Специально проверил кроме delphi5 и на delphi7 - эффект тот же.
P.P.S. Так что похоже только ValidChars помогает от Всех бед :)
...
Рейтинг: 0 / 0
03.07.2003, 06:35
    #32197887
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Видимо это потому, что при автогенерации таблицы поле ValidChars формируется уже с учётом изенений и всё работает, а вот при создании полей в режиме проектирования Delphi использует для формирования ValidChars те настройки, которые в данный момент установлены на машине разработчика.
Может быть попробовать именно на машине разработчика поменять в системе разделитель с ',' на '.' ? Тогда в момент проектирования будут сгенерированны корректные строки ValidChars? Хотя, видимо там в этом случае будет именно . вместо запятой, а не . и , как в ваших примерах. Не знаю, как оно будет в этом случае работать.
В общем, это нужно попробовать.
...
Рейтинг: 0 / 0
03.07.2003, 13:00
    #32198340
_designer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
Не пробовал вставить DecimalSeparator := '.' не в FormCreate, а после begin в Project.Source? Хотя разницы большой нет, но у меня подобных проблем никогда не возникало. Ставил DecimalSeparator := '.' и волосы были мягкими и шелковистыми... :-\
...
Рейтинг: 0 / 0
03.07.2003, 16:37
    #32198759
Гость2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
TO: _designer_
Это самое лучшее решение, действительно помогло!!!
Т.е. если вставляем DecimalSeparator := '.' в Project.Source, то при создании таблицы делфи уже успевает узнать, что DecimalSeparator точка, а раньше он сначала создавал все компоненты и таблицу в том числе, а только потом вызывал OnCreate у главной формы и уже тут было поздно что либо менять.
А так до создания формы, первой строчкой пишем DecimalSeparator := '.' не забыв SysUtils в uses добавить и как сказал _designer_ "волосы будут мягкими и шелковистыми..."
Так что похоже вопрос решен самым оптимальным способом.
...
Рейтинг: 0 / 0
03.07.2003, 19:06
    #32199000
Точка, а не запятая в DbGrid ?
А еще можно в SysUtils процедурку GetFormatSettings поправить и забыть навсегда. Ну по крайней мере до перестановки дельфей.
...
Рейтинг: 0 / 0
03.07.2003, 22:03
    #32199107
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точка, а не запятая в DbGrid ?
А вот править исходники самой Delphi нужно очень осторожно. Если у вас для всех компонентов есть исходные тексты, тогда проблем нет. А вот если что-то имеется только в виде уже откомпилированных dcu, то если они используют SysUtils, то захотят, чтобы их перекомпилировали...
...
Рейтинг: 0 / 0
04.07.2003, 11:26
    #32199399
Точка, а не запятая в DbGrid ?
Полностью согласен с предыдущим оратором. Поторопился я с таким советом, уже привык к ситуевине когда все всегда есть с исходниками.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Точка, а не запятая в DbGrid ? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]