Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2011, 18:46   #1
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
Счастье Изменение символа разделителя

Всем привет! Попалась мне тут прога, которая, к сожалению, воспринимает только запятую, а на точку ругается. Чтобы не лазить по настройкам Винды каждый раз, стало интересно написать мне прогу на Delphi 7, чтоб ГЛОБАЛЬНО (т.е. в самой windows) меняла системный разделитель. Прогу задумал простую: две кнопки- "точка" и "запятая". Полез в инет, нашел вариант решения:

Код:
procedure SetDecimalSeparator( Ch: Char );
var
  DefLCID: LCID;
  Buffer: LPSTR;
begin
   Application.UpdateFormatSettings := true;
   StrPCopy( Buffer, Ch );
   DefLCID := GetThreadLocale;
   if SetLocaleInfo( DefLCID, LOCALE_SDECIMAL, Buffer ) then
      DecimalSeparator := StrPas( Buffer )[1];
   Application.UpdateFormatSettings := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   SetDecimalSeparator( '.' );
end;
Че-то он у меня не пашет. Хотел бы, чтоб кто-то просвещенный поподробнее объяснил как работает этот код.
Также буду рад услышать другие способы.
Программирую по необходимости

Последний раз редактировалось tsar_; 30.03.2011 в 19:30.
tsar_ вне форума Ответить с цитированием
Старый 30.03.2011, 20:42   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По идее это будет воздействовать только на приложение, но ни как не глобально
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2011, 10:54   #3
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Да, я после того, как написал, внимательнее посмотрел на код, оказалось не то .
По инету другого пока не нашел .
Может есть другой способ программного изменения системного разделителя?
Если с таким вариантом не проходит, возможно ли измненение разделителя для другого приложения из моей проги, т.е. не глобально?
Главная задача- из моей проги изменить символ разделителя для другой проги.
Программирую по необходимости

Последний раз редактировалось tsar_; 31.03.2011 в 11:01.
tsar_ вне форума Ответить с цитированием
Старый 31.03.2011, 12:08   #4
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

поменять разделитель целой и дробной части можно через реестр.
HKEY_CURRENT_USER\Control Panel\International - в этой ветке находятся региональные настройки, в том числе и разделитель.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 31.03.2011, 12:18   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Угу. Значение sDecimal.
А не проще один раз в Панели управления изменить и забыть?
_SERGEYX_ вне форума Ответить с цитированием
Старый 31.03.2011, 12:18   #6
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

MaxNik2009, спасибо за совет, но был бы признателен за пример, т.к. в правке реестра я, чего уж стесняться, дуб .
Сегодня вспомнил, что сразу после регистрации на форуме скачал ваш FAQ. Полез туда (Операционная система > Разное > DecimalSeparator, нашел такое:
Цитата:
DecimalSeparator

В Initialization поставь:

Initialization
SaveDecimalSeparator := SysUtils.DecimalSeparator;
DecimalSeparator := '.';
Finalization
DecimalSeparator := SaveDecimalSeparator;
но не понял, что именно этот код делает и куда его пихать. Поясните пожалуйста, форумчане.

P.S. _SERGEYX_ , попалась кривая, но нужная прога, которая некорректно работает с системным разделителем, из-за нее все это... А при работе в других пусть все остается по стандартному, не я ж один за компом работаю.
Программирую по необходимости

Последний раз редактировалось tsar_; 31.03.2011 в 12:23.
tsar_ вне форума Ответить с цитированием
Старый 31.03.2011, 12:53   #7
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

ну вот тебе пример
Код:
uses ....,Registry;


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    Reg.RootKey:= HKEY_CURRENT_USER;
    Reg.OpenKey('Control Panel\International', false);
    Reg.WriteString('sDecimal', '.' { новый разделитель } );
  finally
    Reg.Free;
  end;
end;
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 31.03.2011, 13:32   #8
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Благодарствую, работает.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удвоение символа Aleksander Помощь студентам 13 13.02.2011 12:16
Тип символа dyusha2006 Помощь студентам 6 25.11.2010 21:14
удаление К-го символа. с++ parovoz121 Фриланс 8 13.06.2010 00:12
Как использовать несколько знаков в качестве разделителя дробных чисел prikolist Общие вопросы C/C++ 2 25.03.2009 22:19
шифрование символа TRISTAR Общие вопросы C/C++ 2 08.06.2008 01:35