2014-12-30 5 views
4

데이터 서버와 클라이언트가 있습니다. 서버 시스템에는 십진수 분리 자 "."가 있습니다. 내 고객이 무엇을 가지고 있는지 알지 못해 프로그램에서 바꿀 수 있습니다.Firemonkey에서 인쇄 할 때 클라이언트의 형식 설정이 변경됩니다.

FormatSettings.DecimalSeparator:='.'; 
FormatSettings.ThousandSeparator:=' '; 

이제 클라이언트에서 인쇄하면 FormatSettings가 기본값으로 복원됩니다.

Printer.ActivePrinter.SelectDPI(600,600); 
    //formatsettings.Decimalseperator is now "," 

이것은 무엇입니까? 이거 버그 야?

보너스 Q : 클라이언트와 서버에 대해 동일한 형식 설정을 어떻게 유지합니까?

답변

5

FormatSettings은 전역 변수입니다. 어디서든 변경할 수 있으며이를 사용하는 모든 코드가 영향을받습니다.

TFormatSettings을 사용하는 올바른 방법은 전역 FormatSettings 변수에 의존하지 않고 서식을 지정할 때 자신의 인스턴스를 사용하는 것입니다. 그렇게하면 제어 할 수없는 다른 코드가 코드를 변경하지 않고 서식을 엉망으로 만들 수 있습니다.

고정 된 형식 설정은 저장 용도로만 사용하는 것이 좋으며 사용자에게 데이터를 표시 할 때는 해당 로캘에 따라 형식 설정을 사용하거나 형식 설정을 사용자 지정할 수있게하는 것이 좋습니다. 귀하의 신청서에 프리젠 테이션 목적으로 사용될 수 있습니다.

var 
    MyFormat: TFormatSettings; 

MyFormat := TFormatSettings.Create; 
MyFormat.DecimalSeparator:='.'; 
MyFormat.ThousandSeparator:=' '; 

그리고 나서 마지막 매개 변수로 모든 서식 지정 기능에 사용합니다.

글로벌 FormatSettings 변수를 사용하는 함수의 경우 서식 지정 기능을 호출하기 전에 전역 변수 FormatSettings 변수를 값으로 설정하고 완료시 이전 값을 복원하는 것이 유일한 방법입니다.

레코드의 경우 StrToFloat은 사용자 자신의 설정을 전달할 수있는 오버로드가 있습니다.

function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended; 
+0

'StrToFloat '와 같은 일부 시스템 방법은 FormatSettings를 사용합니다. 그리고 나는 클라이언트와 서버에서 같은 동작을 원합니다. 따라서 Formatsettings를 시작하십시오. 나는 당신의 방법을 향상 시키지만. –

+1

'StrToFloat'은 매개 변수로 자신의 설정을 취할 수있는 오버로드를 가지고 있습니다. 아마도 당신이 사용하는 기능의 대부분은 그것을 가지고 있습니다, 당신은 그것을 모르고 있습니다. –

+0

'Printer.ActivePrinter.SelectDPI'가 전역'FormatSettings'을 변경했다는 주장을 재현 할 수 없습니다. 그러나 XE6이 없으므로 귀하가 옳을 수도 있습니다. 'Printer.ActivePrinter.SelectDPI'에 대한 간단한 호출이'FormatSettings'을 변경했다는 것을 확인할 수 있다면 버그이며 https://quality.embarcadero.com/에보고해야합니다. –

관련 문제