![]() |
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Nee das ist auch Murks :-D In etwa so müsste es aussehen:
Delphi-Quellcode:
var
Buffer: PChar; BufferLen: Integer; begin BufferLen := GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, nil, 0); if (BufferLen = 0) then begin RaiseLastOSError; end; Buffer := StrAlloc(BufferLen); if (not Assigned(Buffer)) then begin raise EOutOfMemory.Create('StrAlloc failed'); end; try if (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, Buffer, BufferLen) <> BufferLen) then begin RaiseLastOSError; end; Result := StrPas(Buffer); finally StrDispose(Buffer); end; end; |
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Was soll bei
Delphi-Quellcode:
denn schiefgehen?
Result := FormatSettings.ThousandSeparator;
|
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Zitat:
Delphi-Quellcode:
im Falle eines vorher erfolglosen
StrDispose
Delphi-Quellcode:
s.
StrAlloc
|
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Zitat:
Etwas Zufälliges und zwar "laut Definition" den Fehlercode irgendeiner WinAPI, welches davor als Letztes einen Fehler lieferte. Genau darum steht auch niemals "Ergebnis siehe GetLastError, sondern "prüfe Result und wenn was schief lief, dann siehe GetLastError". Zitat:
|
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Danke nochmals für die korrekte Handhabung per Api @Zacherl, ich hatte den Ansatz eigentlich nur gepostet wegen voriger Aussage warum ich nicht auf Compiler-Meldungen achte, das hatte ich da auch wenn Code falsch ist :-)
|
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Könnte man Dein Beispiel auch so abändern oder ginge dabei wieder etwas schief?
Delphi-Quellcode:
function ThousandSeparator : String;
const Default = ','; // Bei Fehler ein Default Wert nutzen um Meldungen zu überspringen var Buffer: PChar; BufferLen: Integer; begin BufferLen := GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, nil, 0); if (BufferLen = 0) then begin Result := Default; System.SetLastError(ERROR_SUCCESS); Exit; // RaiseLastOSError; end; Buffer := StrAlloc(BufferLen); if (not Assigned(Buffer)) then begin Result := Default; System.SetLastError(ERROR_SUCCESS); Exit; // raise EOutOfMemory.Create('StrAlloc failed'); end; try if (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, Buffer, BufferLen) <> BufferLen) then begin Result := Default; if Assigned(Buffer) then StrDispose(Buffer); System.SetLastError(ERROR_SUCCESS); Exit; // RaiseLastOSError; end; Result := StrPas(Buffer); finally StrDispose(Buffer); end; end; |
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Würde soweit funktionieren. Die extra Abfrage bezüglich String freigeben kannst du dir aber sparen, da der
Delphi-Quellcode:
Abschnitt in jedem Falle ausgeführt wird (selbst bei
finally
Delphi-Quellcode:
). Und
Exit
![]() |
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Vielen Dank! Ich habe nun das Extra StrDispose() und die SetLastError() Aufrufe entfernt.
|
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Abgesehn davon, dass
Delphi-Quellcode:
sowieso immer True geliefert hätte.
if Assigned(Buffer) then
Und zusammen mit dem Finally wäre StrDispose dann doppelt ausgeführt worden. Zitat:
IMHO wäre SUCCESS laut Definition somit falsch. |
AW: GetLocaleInfo() Aufruf, ist es so richtig?
Mit dem "System.SetLastError(ERROR_SUCCESS);" wollte ich halt Verhindern das aus dem Programm heraus irgendwelche Fehler-Meldungen aufploppen könnten wenn die Funktion ThousandSeparator aufgerufen wird.
Die Delphi Hilfe über RaiseLastOSError brachte mich darauf. Die Funktion soll nur ein Ergebnis abliefern aber nie einen Fehler, total transparent, so als ob es Sie nicht gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz