Bileşenlerin, Published tipindeki özellikleri, kayıt defterine yazılarak, gelecekte tekrar kullanılmak üzere saklanabilir. Örnek kod aşağıdadır.
unit unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,registry,TypInfo,StdCtrls;
type
TForm1 = class(TForm)
xxzzbtn1: TButton;
procedure xxzzbtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure SaveToRegistry(Obj: TPersistent; Reg: TRegistry);
procedure SaveToKey(Obj: TPersistent; const KeyPath: string);
procedure SaveSetToRegistry(const Name: string; Value: Integer; gTypeInfo:PTypeInfo; Reg: TRegistry);
procedure SaveObjToRegistry(const Name: string; Obj: TPersistent; Reg:TRegistry);
procedure SavePropToRegistry(Obj: TPersistent; PropInfo: PPropInfo;Reg:TRegistry);
var
Form1: TForm1;
implementation
{$R *.DFM}
{integer sayıların, bitlerine ulaşabilmek için, bir tip kümesi oluşturulmalıdır. }
const
BitsPerByte = 8;
type
TIntegerSet = set of 0..SizeOf(Integer)*BitsPerByte - 1; { Özellik kümesini, ayrı bir alt anahtar altına BOLLEAN olarak kaydederek, sonradan REGEDIT vasıtasıyla düzeltme imkanı elde edilir.}
procedure SaveToRegistry(Obj: TPersistent; Reg: TRegistry);
var
PropList: PPropList; PropCount,I: Integer;
begin // Published özelliklerin listesini oluştur.
PropCount := GetTypeData(Obj.ClassInfo)^.PropCount;
GetMem(PropList, PropCount*SizeOf(PPropInfo));
try
GetPropInfos(Obj.ClassInfo, PropList); //Her özelliği, mevcut anahtara ait bir değer olarak sakla
for I := 0 to PropCount-1 do
SavePropToRegistry(Obj, PropList^[I], Reg);
finally
FreeMem(PropList, PropCount*SizeOf(PPropInfo));
end;end;
//Published özellikleri, verilen anahtarın altına değer olarak yaz. Bu anahtar, //HKEY_CURRENT_USER.anahtarının altında yer alacaktır.
procedure SaveToKey(Obj: TPersistent; const KeyPath: string);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
if not Reg.OpenKey(KeyPath, True) then
raise ERegistryException.CreateFmt('Anahtar yaratılamadı: %s',[KeyPath]);
SaveToRegistry(Obj, Reg);
finally
Reg.Free;
end;end;
Procedure SaveSetToRegistry(const Name: string; Value: Integer;gTypeInfo: PTypeInfo; Reg: TRegistry);
var
OldKey: string;
I: Integer;
pppTypeInfo:PPTypeInfo;
begin
pppTypeInfo := GetTypeData(gTypeInfo)^.CompType;
OldKey := '\' + Reg.CurrentPath;
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt('Anahtar yaratılamadı: %s',[Name]);
{ Enumarated tipli değişken değerlerini teker teker dolaş }
with GetTypeData(gTypeInfo)^ do
for I := MinValue to MaxValue do
{ her küme elemanı için, bir BOOLEAN değer yaz. }
Reg.WriteBool(GetEnumName(gTypeInfo, I), I in TIntegerSet(Value));
//Üst anahtara dön.
Reg.OpenKey(OldKey, False); end;
//Bütün alt nesnelerin özelliklerini, alt anahtar altına yaz.
procedure SaveObjToRegistry(const Name: string; Obj: TPersistent;Reg:TRegistry);
var
OldKey: string;
begin
OldKey := '\' + Reg.CurrentPath;
//Nesne için bir alt anahtar aç.
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt('Anahtar yaratılamadı: %s',[Name]);
{ Nesne özelliklerini sakla }
SaveToRegistry(Obj, Reg);
//Üst anahtara dön.
Reg.OpenKey(OldKey, False);end;
//Bir davranışın kayıt defterine saklanması.
procedure SaveMethodToRegistry(const Name: string; const Method:TMethod;Reg: TRegistry);
var
MethodName: string;
begin
//Method işaretçisi nil ise sadece boş bir karakter dizisi yaz.
if Method.Code = nil then
MethodName := ''
else
//davranışın adını bul.
MethodName := TObject(Method.Data).MethodName(Method.Code);
Reg.WriteString(Name, MethodName);
end;
//Tek bir özelliği kayıt defterine mevcut anahtarın altına kaydetmek için
procedure SavePropToRegistry(Obj: TPersistent; PropInfo: PPropInfo;Reg:TRegistry);
begin
with PropInfo^ do
case PropType^.Kind of
tkInteger,
tkChar,
tkWChar:
begin
//Ordinal özellikleri integer olarak sakla.
Reg.WriteInteger(Name, GetOrdProp(Obj, PropInfo));
end;
tkEnumeration:
//enumerated değerleri kendi isimleriyle sakla.
Reg.WriteString(Name, GetEnumName(PropType^, GetOrdProp(Obj,PropInfo)));
tkFloat:
//floating point değerleri Double olarak sakla.
Reg.WriteFloat(Name, GetFloatProp(Obj, PropInfo));
tkString,
tkLString:
//Store değerler strin olarak kalsın.
Reg.WriteString(Name, GetStrProp(Obj, PropInfo));
tkVariant:
//variant değerler string olarak saklansın.
Reg.WriteString(Name, GetVariantProp(Obj, PropInfo));
tkSet:
//kümeler alt anahtara saklansın.
SaveSetToRegistry(Name, GetOrdProp(Obj, PropInfo), PropType^,Reg);
tkClass:
//sınıflar da alt sınıf olarak saklansın, özellikleri de bu anahtarın altına değer //olarak yazılsın.
SaveObjToRegistry(Name, TPersistent(GetOrdProp(Obj, PropInfo)),Reg);
tkMethod:
//davranışlar isim olarak yazılsın.
SaveMethodToRegistry(Name, GetMethodProp(Obj, PropInfo), Reg);
end;end;
procedure TForm1.xxzzbtn1Click(Sender: TObject);
var
r:tregistry;
begin
r:=tregistry.create;
r.openkey('f1delphi\'+form1.name,true);
SaveToRegistry(form1, R);
r.free;
end;end.
27 Mart 2010 Cumartesi
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder