Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Windows registry çoklu dize (multi string) değeri okuma ve yazma
#1
İyi günler. Delphi TRegistry sınıfı için bir çok tipte okuma ve yazma metotu varken çoklu dize (multi string) değeri okuma ve yazma işlemini destekleyen direkt metotlar bulunmamaktadır (varsada gözüme ilişmedi şimdiye kadar  Big Grin ). untRegistryHelper.pas isimli aşağıdaki gibi bir dosya oluşturup uses'a bu uniti eklemek gerekli yeteneği kazanmaya yeterli olacaktır.
unit untRegistryHelper;

interface

uses Classes, Registry;

type
 TRegistryHelper=class helper for TRegistry
 public
   function ReadMultiStrings(const Name: String): String;
   function WriteMultiStrings(const Name: String;const sList:TStrings): Boolean;overload;
   function WriteMultiStrings(const Name:String;Values: String;const isLineBreak:Boolean=True): Boolean;overload;
   function WriteMultiStrings(const Name:String;const Values:array of String):Boolean;overload;
 end;

implementation

uses Windows, SysUtils, StrUtils;

function TRegistryHelper.ReadMultiStrings(const Name: String): String;
var rdiBilgi:TRegDataInfo; DataType, iLen:Integer;
{$IF CompilerVersion<18.0}
function Trim(const S: string): string;
var
  I, L: Integer;
begin
  Result:=S;
  L := Length(S) - 1;
  I := 0;
  if (L > -1) and (S[I] > ' ') and (S[L] > ' ') then Exit;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then begin
    Result:='';
    Exit;
  end;
  while S[L] <= ' ' do Dec(L);
  Result := Copy(S, I , L - I + 1);
end;
{$IFEND}
begin
 Result:='';
 if GetDataInfo(Name, rdiBilgi) then begin
   iLen:=Round(rdiBilgi.DataSize / SizeOf(Char));
   SetLength(Result, iLen);
   DataType:=REG_MULTI_SZ{=7};
   if RegQueryValueEx(CurrentKey, PChar(Name), nil, @DataType, Pointer(Result), @rdiBilgi.DataSize)=ERROR_SUCCESS then begin
     Result:=ReplaceText(Trim(Result), #0, sLineBreak);
   end;
 end;
end;

function TRegistryHelper.WriteMultiStrings(const Name: String; const Values: array of String): Boolean;
var sVal:String; iPos:Integer;
begin
 sVal:='';
 for iPos := Low(Values) to High(Values) do
  sVal:=sVal+Values[iPos]+#0;
 Result:=WriteMultiStrings(Name, sVal, False);
end;

function TRegistryHelper.WriteMultiStrings(const Name: String; Values: String; const isLineBreak: Boolean): Boolean;
begin
 if isLineBreak then
  Values:=ReplaceText(Trim(Values), sLineBreak, #0)+#0;
 Result:=(RegSetValueEx(CurrentKey, PChar(Name), 0, REG_MULTI_SZ {=7}, PChar(Values), Length(Values) * SizeOf(Char)))=ERROR_SUCCESS;
end;

function TRegistryHelper.WriteMultiStrings(const Name: String; const sList: TStrings): Boolean;
begin
 Result:=WriteMultiStrings(Name, ReplaceText(Trim(sList.Text), sList.LineBreak, #0)+#0, False);
end;

end.
Bu örneğe bağlı olarak sistemde yüklü olan (32 ve 64 bit) SQL Server hizmetlerinin InstanceName değerlerini elde eden şöyle bir kod yazabiliriz artık.
uses untRegistryHelper;

procedure TForm1.BitBtn1Click(Sender: TObject);
const
{$IF CompilerVersion<18.0}
 KEY_WOW64_32KEY        = $0200;
 KEY_WOW64_64KEY        = $0100;
{$IFEND}
 SQLPath='\SOFTWARE\Microsoft\Microsoft SQL Server';
 SQLInstanceRegName='InstalledInstances';
var Reg:TRegistry; sDeger:String;
begin
 sDeger:='';
 try
   Reg:=TRegistry.Create;
   Reg.RootKey:=HKEY_LOCAL_MACHINE;
   Reg.Access:=KEY_READ or KEY_WOW64_32KEY;
   if Reg.OpenKey(SQLPath, False) then
    sDeger:=Reg.ReadMultiStrings(SQLInstanceRegName);
   Reg.Access:=KEY_READ or KEY_WOW64_64KEY;
   if Reg.OpenKey(SQLPath, False) then
    sDeger:=Trim(sDeger+sLineBreak+Reg.ReadMultiStrings(SQLInstanceRegName));
 finally
   Reg.Free;
 end;
 ShowMessage(sDeger);
end;
İyi çalışmalar.

Not : Kodlarda eski sürüm Delphi üzerinde de çalışması için bazı uyarlamalar yapıldı ve buna dikkat çekmek için {$IF CompilerVersion<18.0} şartına bağlı olarak derleyici direktifi içine alındı. Kodları (doğru) çalıştıramayan diğer delphi sürümlerinde bu direktiflerin kaldırması yeterli olacaktır.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Hazır pdf okuma, ekleme, imzalama ve yazdırma projesi (kaynak kod) delphicim 5 3.109 21-12-2021, Saat: 11:23
Son Yorum: Mikdad
  Microsoft Windows Mağaza Store (.appx / Metro / UWP) uygulama yükleme adımları emozgun 3 2.731 27-07-2020, Saat: 09:55
Son Yorum: nguzeller
  Transaction Log (İşlem Günlüğü) Dosyasını Okuma csunguray 9 8.888 30-12-2018, Saat: 09:07
Son Yorum: csunguray
  Multi Platform - Uygulama İzin Kontrolü TescilsizUzman 18 15.259 23-10-2018, Saat: 08:35
Son Yorum: yhackup
  Levenshtein Distance Algoritması (string karşılaştırma) delphi-x 0 2.687 01-02-2017, Saat: 17:08
Son Yorum: delphi-x



Konuyu Okuyanlar: 1 Ziyaretçi