![]() |
Codezeile in Funktion umwandeln mit Schwierigkeiten
Ich habe gerade eine Gedankenslücke und weiß nicht weiter.
Ich habe eine Codezeile wie diese hier
Delphi-Quellcode:
Dasselbe habe ich auch für andere Enum-Typen.
var
aMode: TModes; begin aMode := TEnumFunctions.GetValue<TModes>(IniF.ReadString(sCurrentSection, TEnumFunctions.GetName(TIni_Idents.mode), TEnumFunctions.GetName(TModes.mManual))); // ... // Resultat in der Ini-Datei // [section-name] // mode=mManual // Das versuche ich zu erreichen.. // aMode = ReadEnum(TIni_Idents.mode, TModes); Wie kann ich daraus eine Funktion schreiben, die alle meine Enum-Typen annehmen kann? |
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Zitat:
Delphi-Quellcode:
function ReadFromIni<T>(IniF: TCustomInifile; const sCurrentSection: string; Ident: TIni_Idents; const Default: T): T;
begin Result := TEnumFunctions.GetValue<T>(IniF.ReadString(sCurrentSection, TEnumFunctions.GetName(Ident), TEnumFunctions.GetName<T>(Default))); end; Der Aufruf wäre dann:
Delphi-Quellcode:
begin
aMode := ReadFromIni<TModes>(IniF, sCurrentSection, TIni_Idents.mode, TModes.mManual); end; Wenn das Inifile und die Section im Scope der Funktion bekannt sind, kann man die Parameter dafür auch weglassen. |
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Soweit war ich tatsächlich noch nicht. Aber mit dem ReadFromIni<T> hatte ich dann ja wohl schon recht.
Nur habe ich es wieder gelöscht, da der Editor es rot unterstreicht, obwohl Generics.Collections in der Uses-Klausel steht. Edit Fehlerquelle gefunden. Ich wusste nicht, dass solche Funktionen und Prozeduren eine Deklaration im Unit-Kopf verlangen. Mein Resultat in meiner eigenen ini-Klasse
Delphi-Quellcode:
TEnumFunctions
type
TMemIniFile = class(IniFiles.TMemIniFile) ... function ReadEnum<T>(const Section: string; const Ident: TIniSettings; const Default: T): T; procedure WriteEnum<T>(const Section: string; const Ident: TIniSettings; Value: T); ... function TMemIniFile.ReadEnum<T>(const Section: string; const Ident: TIniSettings; const Default: T): T; begin Result := TEnumFunctions.GetValue<T>(ReadString(Section, TEnumFunctions.GetName(Ident), TEnumFunctions.GetName<T>(Default))); end; procedure TMemIniFile.WriteEnum<T>(const Section: string; const Ident: TIniSettings; Value: T); begin WriteString(Section, TEnumFunctions.GetName(Ident), TEnumFunctions.GetName<T>(Value)); end;
Delphi-Quellcode:
type
TEnumFunctions = record ... class function GetName<T>(AValue: T): string; static; class function GetValue<T>(AValue: string): T; static; ... class function TEnumFunctions.GetName<T>(AValue: T): string; begin Result := System.Rtti.TRttiEnumerationType.GetName(AValue); end; class function TEnumFunctions.GetValue<T>(AValue: string): T; var Temp: Integer; PTemp: Pointer; begin Temp := GetEnumValue(TypeInfo(T), AValue); if Temp < 0 then Temp := 0; // gebe 0 statt 255 zurück im Falle, dass AValue nicht existiert PTemp := @Temp; Result := T(PTemp^); // Result := System.Rtti.TRttiEnumerationType.GetValue<T>(AValue); end; |
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Eine Frage habe ich dann noch :pale:
Ginge auch das hier irgendwie?
Delphi-Quellcode:
Also Ident: T;? Dann wäre ich nicht auf einen Enum-Typen festgelegt.
procedure WriteEnum<T>(const Section: string; const Ident: T; Value: T);
Der Compiler sagt mir leider etwas unverständlich Zitat:
|
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Zitat:
Delphi-Quellcode:
procedure WriteEnum<T,T2>(const Section: string; const Ident: T2; Value: T);
|
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Scheint aber verdammt kompliziert zu sein oder ich stelle mich doof an.
Delphi-Quellcode:
function TMemIniFile.ReadEnum<T, T2>(const Section: string; const Ident: T2; const Default: T): T;
begin Result := TEnumFunctions.GetValue<T>(ReadString(Section, TEnumFunctions.GetName<T2>(Ident), TEnumFunctions.GetName<T>(Default))); end; // aJclCompressionMethod := IniF.ReadEnum<TIniSettings, TJclCompressionMethod>(sCurrentSection, TIniSettings.zipcompression, TJclCompressionMethod.cmDeflate); Zitat:
Dann sieht mein Konstrukt nun so aus und statt 6 Methoden habe ich nun nur noch 4
Delphi-Quellcode:
function TMemIniFile.ReadEnum<T>(const Section: string; const Ident: T; const Default: T): T;
begin Result := TEnumFunctions.GetValue<T>(ReadString(Section, TEnumFunctions.GetName(Ident), TEnumFunctions.GetName<T>(Default))); end; procedure TMemIniFile.WriteEnum<T>(const Section: string; const Ident: T; Value: T); begin WriteString(Section, TEnumFunctions.GetName(Ident), TEnumFunctions.GetName<T>(Value)); end; function TMemIniFile.ReadEnum<T, T2>(const Section: string; const Ident: T; const Default: T2): T2; begin Result := TEnumFunctions.GetValue<T2>(ReadString(Section, TEnumFunctions.GetName<T>(Ident), TEnumFunctions.GetName<T2>(Default))); end; // => aMode := IniF.ReadEnum<TIniSettings, TModes>(sCurrentSection, TIniSettings.mode, TModes.mManual); procedure TMemIniFile.WriteEnum<T, T2>(const Section: string; const Ident: T; Value: T2); begin WriteString(Section, TEnumFunctions.GetName<T>(Ident), TEnumFunctions.GetName<T2>(Value)); end; // => IniF.WriteEnum<TIniSettings, TModes>(sCurrentSection, TIniSettings.mode, TModes.mManual); |
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Zitat:
Delphi-Quellcode:
. Wann der Compiler das auch ohne die Angabe hinkriegt, habe ich auch noch nicht so richtig rausgefunden.
IniF.WriteEnum<TIniSettings, TModes>(...)
|
AW: Codezeile in Funktion umwandeln mit Schwierigkeiten
Zitat:
Danke für deine Hilfe und dafür, dass ich was neues gelernt habe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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