Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#2

Re: IdentMap funktioniert nicht

  Alt 2. Aug 2009, 21:47
Auch wenn ich vermutlich nichts zum Problem direkt beitragen kann ... statt Bits zu ändern, würde ich einfach nur den LongWord (HKEY) in einen Integer casten

und dann als Integer, aber dennoch mit allen Bits, im OI anbieten.

Dann würden praktisch einfach nur alle Werte ab $80000000 in den negativen Bereich des Integers verschoben und es würde im Wert kein Bit verloren gehen, da ja in deiner aktuellen Ableitung $8000000x gleich $0000000x entspräche.



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 = type LongInt;

  TRegistry2 = class(TRegistry)
  private
    function GetRootKey: TRootKey;
    procedure SetRootKey(Value: TRootKey);
  published
    property RootKey: TRootKey
      read GetRootKey write SetRootKey default TRootKey(HKEY_CURRENT_USER);
  end;

const
  RootKeys: array[0..6] of TIdentMapEntry = (
    (Value: Integer(HKEY_CLASSES_ROOT); Name: 'HLEY_CLASSES_ROOT'),
    (Value: Integer(HKEY_CURRENT_USER); Name: 'HKEY_CURRENT_USER'),
    (Value: Integer(HKEY_LOCAL_MACHINE); Name: 'HKEY_LOCAL_MACHINE'),
    (Value: Integer(HKEY_USERS); Name: 'HKEY_USERS'),
    (Value: Integer(HKEY_PERFORMANCE_DATA); Name: 'HKEY_PERFORMANCE_DATA'),
    (Value: Integer(HKEY_CURRENT_CONFIG); Name: 'HKEY_CURRENT_CONFIG'),
    (Value: Integer(HKEY_DYN_DATA); Name: 'HKEY_DYN_DATA')
  );

function IdentToRootKey(const Ident: String; var RootKey: Integer): Boolean;
function RootKeyToIdent(RootKey: Integer; var Ident: String): Boolean;

implementation

function TRegistry2.GetRootKey: TRootKey;
begin
  Result := TRootKey(inherited RootKey);
end;

procedure TRegistry2.SetRootKey(Value: TRootKey);
begin
  inherited RootKey := HKEY(Value);
end;

function RootKeyToIdent(RootKey: Integer; var Ident: String): Boolean;
begin
  Result := IntToIdent(RootKey, Ident, RootKeys);
end;

function IdentToRootKey(const Ident: String; var RootKey: Integer): Boolean;
begin
  Result := IdentToInt(Ident, RootKey, RootKeys);
end;

initialization
  RegisterIntegerConsts(TypeInfo(TRootKey), IdentToRootKey, RootKeyToIdent);
end.
[edit]
vielleicht hilft's ja, wenn man TRootKey als eigenständigen Typ definiert?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat