Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetLocaleInfo() Aufruf, ist es so richtig? (https://www.delphipraxis.net/195865-getlocaleinfo-aufruf-ist-es-so-richtig.html)

Zacherl 2. Apr 2018 18:35

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;

günni0 2. Apr 2018 18:37

AW: GetLocaleInfo() Aufruf, ist es so richtig?
 
Was soll bei
Delphi-Quellcode:
 Result := FormatSettings.ThousandSeparator;
denn schiefgehen?

Zacherl 2. Apr 2018 18:39

AW: GetLocaleInfo() Aufruf, ist es so richtig?
 
Zitat:

Zitat von günni0 (Beitrag 1397903)
Was soll bei
Delphi-Quellcode:
 Result := FormatSettings.ThousandSeparator;
denn schiefgehen?

Nichts. Wenn man die gekapselte Version nimmt, ist man so ziemlich auf der sicheren Seite. Das "Schiefgehen" bezog sich auf den WinAPI Ansatz bzw. insbesondere das
Delphi-Quellcode:
StrDispose
im Falle eines vorher erfolglosen
Delphi-Quellcode:
StrAlloc
s.

himitsu 2. Apr 2018 18:41

AW: GetLocaleInfo() Aufruf, ist es so richtig?
 
Zitat:

Delphi-Quellcode:
  buf := StrAlloc(10);
  if GetLastError() = ERROR_SUCCESS then

Was soll GetLastError liefern, wenn StrAlloc keinen Fehler lieferte?

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:

Delphi-Quellcode:
if GetLocaleInfo(
       LOCALE_SYSTEM_DEFAULT,
       LOCALE_STHOUSAND,
       buf,
       10) <> 0 then Result := StrPas(buf);
   if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then

Wenn GetLocaleInfo erfolgreich war, dann war in StrPas die letzte WinAPI, aber vielleicht kommt das Result auch von irgendeiner WinAPI von irgendwann weit davor.

KodeZwerg 2. Apr 2018 19:17

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 :-)

KodeZwerg 2. Apr 2018 20:03

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;

Zacherl 2. Apr 2018 20:19

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:
finally
Abschnitt in jedem Falle ausgeführt wird (selbst bei
Delphi-Quellcode:
Exit
). Und MSDN-Library durchsuchenSetLastError lass am besten auch komplett weg.

KodeZwerg 2. Apr 2018 21:36

AW: GetLocaleInfo() Aufruf, ist es so richtig?
 
Vielen Dank! Ich habe nun das Extra StrDispose() und die SetLastError() Aufrufe entfernt.

himitsu 3. Apr 2018 00:13

AW: GetLocaleInfo() Aufruf, ist es so richtig?
 
Abgesehn davon, dass
Delphi-Quellcode:
if Assigned(Buffer) then
sowieso immer True geliefert hätte.
Und zusammen mit dem Finally wäre StrDispose dann doppelt ausgeführt worden.

Zitat:

Zitat von Zacherl (Beitrag 1397915)
Und MSDN-Library durchsuchenSetLastError lass am besten auch komplett weg.

Es heißt ja auch SetLastError und nicht LastState.
IMHO wäre SUCCESS laut Definition somit falsch.

KodeZwerg 3. Apr 2018 07:52

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.
Seite 2 von 3     12 3      

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