![]() |
AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
Zitat:
Zitat:
Zitat:
Zitat:
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. |
AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
Wie versprochen, hier nun mein Code wie ich ihn letzendlich verwende:
Delphi-Quellcode:
Zu finden ist der Code auch in der Ply.SysUtils.pas auf GitHub:
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; ![]() Ein Anwendungsbeispiel gibt es dort in der Demo08. |
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? |
AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
Zitat:
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. |
AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
Zitat:
Delphi-Quellcode:
könntest du den Parameter dann lokal neu zuweisen, was aber wenig Sinn ergibt.
const
Bei
Delphi-Quellcode:
könntest du das auch machen, aber damit schiebst du dem Aufrufer eine andere Instanz unter. Ich glaube nicht, dass das beabsichtigt ist.
var
Weiterhin würde ich prüfen, ob nicht ein
Delphi-Quellcode:
für den Parameter ausreicht. Damit könnte man das Einsatzfeld etwas erweitern.
TStrings
|
AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages
Ok, habe ich verstanden und auf Const umgestellt, vielen Dank.
Zitat:
|
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 14:12 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