Hallo.
Ich habe eine Objekteigenschaft, die einen HKEY enthält. Leider kann diese im Objektinspektor nicht aufgelistet werden, da ein HKEY nicht im Bereich des Integers liegt.
Daher möchte ich TRegsitry ableiten, sodass ein "TRootKey" aufgelistet werden kann. Natürlich möchte ich die "Kompatibilität" zu den HKEYs behalten. Daher akzueptiert nun meine Ableitung die Werte $0000000x (Auflistungswerte für den
OI) und $8000000x ("HKEY").
Leider funktioniert diese Auflistung einfach nicht. Ich habe mir schon alles von TColor abgeschaut, doch es klappt einfach nicht. Kompilierung funktioniert Problemlos. Aber im
OI sehe ich nur die Zahl. Was kann ich tun?
Delphi-Quellcode:
unit Registry2;
// Registry2.pas von Daniel Marschall
// Der Typ HKEY ist ein vorzeichenloser 32-Bit und kann daher nicht mit einem
// TIdentMapEntry erfasst werden, da er nur vorzeichenbehaftete Integer
// akzeptiert. Daher können in VCLs die HKEYs nicht im Objektinspektor
// aufgelistet werden. Diese Ableitung behebt das Problem.
interface
uses
Classes, Registry, Windows;
type
TRootKey = LongWord;
TRegistry2 =
class(TRegistry)
private
function GetRootKey: TRootKey;
procedure SetRootKey(Value: TRootKey);
published
property RootKey: TRootKey
read GetRootKey
write SetRootKey
default HKEY_CURRENT_USER;
end;
const
RootKeys:
array[0..6]
of TIdentMapEntry = (
(Value: HKEY_CLASSES_ROOT - $80000000;
Name: '
HLEY_CLASSES_ROOT'),
(Value: HKEY_CURRENT_USER - $80000000;
Name: '
HKEY_CURRENT_USER'),
(Value: HKEY_LOCAL_MACHINE - $80000000;
Name: '
HKEY_LOCAL_MACHINE'),
(Value: HKEY_USERS - $80000000;
Name: '
HKEY_USERS'),
(Value: HKEY_PERFORMANCE_DATA - $80000000;
Name: '
HKEY_PERFORMANCE_DATA'),
(Value: HKEY_CURRENT_CONFIG - $80000000;
Name: '
HKEY_CURRENT_CONFIG'),
(Value: HKEY_DYN_DATA - $80000000;
Name: '
HKEY_DYN_DATA')
);
function IdentToRootKey(
const Ident:
string;
var RootKey: Longint): Boolean;
function RootKeyToIdent(RootKey: Longint;
var Ident:
string): Boolean;
implementation
function TRegistry2.GetRootKey: TRootKey;
begin
if (
inherited RootKey > $80000000)
then
result :=
inherited RootKey - $80000000
else
result :=
inherited RootKey;
end;
procedure TRegistry2.SetRootKey(Value: TRootKey);
begin
if (Value < $80000000)
then
inherited RootKey := Value + $80000000
else
inherited RootKey := Value;
end;
function RootKeyToIdent(RootKey: Longint;
var Ident:
string): Boolean;
begin
Result := IntToIdent(RootKey, Ident, RootKeys);
end;
function IdentToRootKey(
const Ident:
string;
var RootKey: Longint): Boolean;
begin
Result := IdentToInt(Ident, RootKey, RootKeys);
end;
initialization
RegisterIntegerConsts(TypeInfo(TRootKey), IdentToRootKey, RootKeyToIdent);
end.
Wenn es fertig ist, möchte ich es natürlich in die CodeLib setzen.
PS: Meine vorherige Version arbeitete mit einem Aufzählungstyp, der schlicht und einfach die HKEY_* Symbole überschrieben hatte. Das blöde daran war, dass dadurch beim Anwender oftmals einen TRootKey <-> HKEY Compilerfehler entsteht. Deswegen möchte ich die Symbole nun nicht mehr überschreiben.
Gruß
blackdrake