Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows Codepages - Kernel32.dll - EnumSystemCodePages (https://www.delphipraxis.net/213235-windows-codepages-kernel32-dll-enumsystemcodepages.html)

arcticwolf 22. Jun 2023 18:16

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
Zitat:

Vermutlich nicht relevant, aber der Form halber: StrToUIntDef
Du hast natürlich Recht, vielen Dank für den Hinweis.

Zitat:

Result := AName.Remove(0, AValue.ToString.Length + 1).TrimLeft.Trim(['(', ')']);
Eleganter Ansatz, aber funktioniert so leider nicht, weil die Funktion zum Beispiel "20290 (IBM EBCDIC - Japanisch (erweitertes Katakana))" liefert. Dann macht er hinten beide Klammern weg. Ich werde meinen Code aber an der Stelle aber noch ein bisschen smarter machen.

Zitat:

Sollte die EnumCodePagesProc nicht ein BOOL als Rückgabewert haben?
Ja, ist mir auch schon aufgefallen, habe ich korrigiert. -> Müssen wir uns nicht darüber streiten :wink:

Zitat:

Für reine "statischen" Klassen verwende ich inzwischen auch stattdessen gern Records.
Absolut, auf dem Trichter war ich auch schon. Erübrigt sich dann nicht auch die Frage um die Compiler-Warnung wenn jemand eine Instanz erstellt? :gruebel: Da muss ich noch einmal darüber nachdenken, beziehungsweise ausprobieren was da möglich oder sinnvoll ist.


Ich feile noch ein bisschen an der Klasse und werde diese in Kürze als Teil einer größeren Bibliothek auf GitHub veröffentlichen. Sobald die Bibliothek veröffentlich ist, werde ich diese hier auch noch einmal verlinken, falls jemand nach einer CodepageListe basierend auf EnumSystemCodePages sucht.

arcticwolf 27. Jun 2023 15:19

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
Wie versprochen, hier nun mein Code wie ich ihn letzendlich verwende:
Delphi-Quellcode:
Type TWindowsCodepages = record
     strict private
       class threadvar FList: TStrings;
       class function EnumCodePagesProc(CodePage:PWideChar) : Boolean; static; stdcall;
       class function GetCodepageName(Codepage:Cardinal) : String; static;
     public
       class function GetInstalled(Var CodePageList:TStrings) : Boolean; static;
       class function GetSupported(Var CodePageList:TStrings) : Boolean; static;
       class function GetName(CodePage: Cardinal) : String; static;
     end;

class function TWindowsCodepages.GetCodepageName(Codepage:Cardinal) : String;
var CpInfoEx : TCPInfoEx;
begin
  Result := '';
  if IsValidCodePage(Codepage) then
  begin
    if (GetCPInfoEx(Codepage, 0, CpInfoEx)) then
    begin
      Result := CpInfoEx.CodePageName;
      Result := Result.Substring(7,Length(Result)-8);
    end;
  end;
end;

class function TWindowsCodepages.EnumCodePagesProc(CodePage:PWideChar) : Boolean;
Var CP : cardinal;
begin
  Result := False;
  if (CodePage<>Nil) then
  begin
    if (Length(Codepage)>0) then
    begin
      CP := StrToUIntDef(CodePage,0);
      if (CP>0) then
      begin
        FList.Add(Format('%.5d: %s', [CP, GetCodepageName(CP)]));
        Result := True;
      end;
    end;
  end;
end;

class function TWindowsCodepages.GetInstalled(Var CodePageList:TStrings) : Boolean;
begin
  Result := False;
  FList := TStringList.Create;
  try
    if (EnumSystemCodePagesW(@EnumCodePagesProc,CP_INSTALLED)) then
    begin
      CodePageList.AddStrings(FList);
      FList.Clear;
      Result := True;
    end;
  finally
    FList.Free;
    FList := Nil;
  end;
end;

class function TWindowsCodepages.GetSupported(Var CodePageList:TStrings) : Boolean;
begin
  Result := False;
  FList := TStringList.Create;
  try
    if (EnumSystemCodePagesW(@EnumCodePagesProc,CP_SUPPORTED)) then
    begin
      CodePageList.AddStrings(FList);
      FList.Clear;
      Result := True;
    end;
  finally
    FList.Free;
    FList := Nil;
  end;
end;

class function TWindowsCodepages.GetName(CodePage: Cardinal) : String;
begin
  Result := GetCodepageName(CodePage);
end;
Zu finden ist der Code auch in der Ply.SysUtils.pas auf GitHub:

https://github.com/playcom-de/Console

Ein Anwendungsbeispiel gibt es dort in der Demo08.

DeddyH 28. Jun 2023 05:57

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
2 Fragen dazu:
1. Wieso sind die Stringlisten als Var-Parameter deklariert? Ich persönlich würde eher const nehmen und per Assertion sicherstellen, dass mir auch eine Instanz übergeben wurde.
2. Wozu die temporäre Liste, wenn man auch gleich die übergebene verwenden kann?

arcticwolf 28. Jun 2023 09:48

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
Zitat:

Zitat von DeddyH (Beitrag 1523847)
2 Fragen dazu:
1. Wieso sind die Stringlisten als Var-Parameter deklariert? Ich persönlich würde eher const nehmen und per Assertion sicherstellen, dass mir auch eine Instanz übergeben wurde.
2. Wozu die temporäre Liste, wenn man auch gleich die übergebene verwenden kann?

Zu 1) Ich lerne gerne dazu. Kannst Du mir ein Beispiel (mit Assertion) geben, wie du das machen würdest?
Mit Const vs. Var liege ich oft im Clinch, wann ich was verwende. Und dann gibt es noch das [ref] :gruebel:
Aber bei einer Klasse wird sowieso nur ein Zeiger / eine Referenz übergeben, deshalb reicht auch Const, oder?

Zu 2) Die FList brauche ich doch wegen der Callback-Funktion, damit EnumCodePagesProc darauf zugreifen kann.

Uwe Raabe 28. Jun 2023 10:17

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
Zitat:

Zitat von arcticwolf (Beitrag 1523861)
Aber bei einer Klasse wird sowieso nur ein Zeiger / eine Referenz übergeben, deshalb reicht auch Const, oder?

Eigentlich kannst du alles weglassen. Im Gegensatz zu
Delphi-Quellcode:
const
könntest du den Parameter dann lokal neu zuweisen, was aber wenig Sinn ergibt.

Bei
Delphi-Quellcode:
var
könntest du das auch machen, aber damit schiebst du dem Aufrufer eine andere Instanz unter. Ich glaube nicht, dass das beabsichtigt ist.

Weiterhin würde ich prüfen, ob nicht ein
Delphi-Quellcode:
TStrings
für den Parameter ausreicht. Damit könnte man das Einsatzfeld etwas erweitern.

arcticwolf 28. Jun 2023 11:34

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
Ok, habe ich verstanden und auf Const umgestellt, vielen Dank.

Zitat:

Weiterhin würde ich prüfen, ob nicht ein TStrings für den Parameter ausreicht. Damit könnte man das Einsatzfeld etwas erweitern.
Das verstehe ich nicht, CodePageList ist doch TStrings?

Uwe Raabe 28. Jun 2023 12:07

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
 
In der Tat. Ich hatte da wohl gerade noch einen anderen Code-Abschnitt im Blick.

Und: Mit TStrings ginge ja auch kein
Delphi-Quellcode:
var
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz