AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows Codepages - Kernel32.dll - EnumSystemCodePages
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Codepages - Kernel32.dll - EnumSystemCodePages

Ein Thema von arcticwolf · begonnen am 21. Jun 2023 · letzter Beitrag vom 28. Jun 2023
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 22. Jun 2023, 18:16
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

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? 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.
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 27. Jun 2023, 15:19
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.
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 28. Jun 2023, 05:57
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 28. Jun 2023, 09:48
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]
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.
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#15

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 28. Jun 2023, 10:17
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 const könntest du den Parameter dann lokal neu zuweisen, was aber wenig Sinn ergibt.

Bei 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 TStrings für den Parameter ausreicht. Damit könnte man das Einsatzfeld etwas erweitern.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 28. Jun 2023, 11:34
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?
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#17

AW: Windows Codepages - Kernel32.dll - EnumSystemCodePages

  Alt 28. Jun 2023, 12:07
In der Tat. Ich hatte da wohl gerade noch einen anderen Code-Abschnitt im Blick.

Und: Mit TStrings ginge ja auch kein var .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 Uhr.
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