Delphi Programlama Dilinde Registry İşlemleri - (ListView Sütunlarının Genişliklerinin Kaydedilmesi ve Okunması)

Herkese selam,
Registry (Windows Kayıt Defteri) ile ilgili genel bilgilendirmeyi daha önceki konumda işlemiştim. Eğer bu makaleyi ilk defa okuyorsanız öncelikle aşağıdaki link adresine tıklayarak Windows Kayıt Defteri (Registry) Hakkında Genel Bilgilendirme başlıklı makaleminizi okumanizi oneririz...

http://www.programciyim.com/content/windows-kayit-defteri-registry-hakkinda-genel-bilgilendirme 

ListView Sütun Genişliklerinin Registry'de Saklanması ve Tekrar Yüklenmesi

Bu makalemizde bir programcının geliştirmiş olduğu uygulama içerisinde yer alan formlarda Registry ile çalışma konusundan ListView sütun uzunluk değerlerinin Registry'de saklanması ve bu değerlerin tekrar Registry'den okunması konusuna değinmek istiyorum.

Programınızın kullanımını kolaylaştırmak sizin elinizde...

Öncelikle böyle bir özellik ne işime yarayacak şeklinde bir soru aklınıza gelebilir. Ancak bir uygulama geliştirdiğiniz ve uygulamanızın bir ekranında da ListView kullandığınızı ve ListView'inizde 10 adet sütunun olduğunu varsayarsak bu çok işinize yarayacaktır. Programınızı kullanan kişi ekranı açıyor ve bazı sütunların genişlikleri dar geldiği için mouse yardımı ile kendi isteğine göre ayarlıyor ve aynı işlemi diğer 9 sütun içinde yapıyor. Ohh ekran artık daha bir okunur hale geldi ancak bu işlemleri yapması kullanıcının 30 saniyesini aldı. Daha sonra kullanıcı ekranda işini bitirdi ve formu kapattı. Belli bir zaman sonra tekrar ilgili ekrandan bir şey bakma ihtiyacı hissetti formu açtı ve tam bir hayal kırıklığına uğradı bir baktı ki bütun sütunlar ilk hallerine dönmüş ve yine tek tek bütun sütunları ayarlardı ve tekrar çalışmaya başladı ama aklında hep şu soru var formu kapatınca herşey eski haline dönecek. Bu arada programı yazan arkadaşıda sevgiyle yaad etmeyide ihmal etmiyor.

 

Hedefiniz, daima iyi bir programcı olmak, olsun...

İşte iyi bir programcı olarak bu tarz sıkıntıların önüne geçebilmek için önemsiz gibi görünsede formlarınınzın ve formların içerisinde kullanmış olduğunuz componentlerin bazı değerlerini;
- EditBox'ın değerini
- Formun yükseklik ve genişliğini
- DataGrid'in sütun genişlikleri ve başlık bilgileri
...
kayıt defterinde saklayıp tekrar okuya biliriz. Bu sayede uygulamamızı kullanan kişilerin bazı değerleri kendine göre özelleştirmesini sağlayabiliriz. Aşağıda formumuzda kullandığımız ListView componentinin sütun genişliklerinin form kapanışında kayıt defterine yazılıp form açılışında da kayıt defterinden okunması ile ilgili kaynak kod örneği vereceğim; 

 

Delphi Programlama Dili'nde ListView Sütunlarının Windows Kayıt Defterinde Saklanması ve Değerlerin Tekrar Kayıt Defterinden Okunması İle İlgili Kaynak Kod Örneği

unit frmCariBorclar1;

interface

uses
//Uses Kısmına Registry Unit'ini eklemeyi unutmayın
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frmReportListMain1, ImgList, cxPropertiesStore, ExtCtrls, DB,
  ADODB, ComCtrls, StdCtrls, Registry, StrUtils, dmRealMatrix1, Menus;

type
  TfrmCariBorclar = class(TfrmReportListMain)
    psfrmCariBorclar: TcxPropertiesStore;
    popFirmaDetaylari: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure rbReportOptionsClick(Sender: TObject);
    procedure LVReportMainCustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure popFirmaDetaylariClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure RegistryYaz;//Formun OnClose olayında çağrılan procedure (Form Kapatılırken)
    procedure RegistryOku;//Formun OnShow olayında çağrılan procedure  (Form Açılırken)
    procedure LoadReportDataSet;
    procedure LoadReportDataSet_Month;
  end;

var
  frmCariBorclar: TfrmCariBorclar;

implementation

uses frmCariDetaylari1;

{$R *.dfm}
var
Regs    :TRegistry;
DList    :array[0..100]of Double;

procedure TfrmCariBorclar.RegistryYaz;
var
i       :Integer;
op_key  :String;
begin
inherited;
Regs := TRegistry.Create;//Registry nesnesi oluşturuluyor...
    try
        with Regs do
		begin
			RootKey := HKEY_CURRENT_USER;//HKEY_CURRENT_USER ana anahtar olarak belirleniyor...
            if rbReportOptions.ItemIndex <> -1 then op_key := IntToStr(rbReportOptions.ItemIndex)
            else op_key := '0';
	if OpenKey('Software\RealkomMatrix\frmCariBorclar' + op_key,True)then
				try
                    for i := 0 to LVReportMain.Columns.Count - 1 do begin
					    WriteInteger('Col'+IntToStr(i),LVReportMain.Column[i].Width);
                    end;
				finally
				CloseKey;
			end;
		end;
	finally
	Regs.Free;
	end;
end;

procedure TfrmCariBorclar.RegistryOku;
var
i       :Integer;
op_key  :String;
begin
inherited;
	Regs := TRegistry.Create;
	try
		with Regs do
		begin
			RootKey := HKEY_CURRENT_USER;
            if rbReportOptions.ItemIndex <> -1 then op_key := IntToStr(rbReportOptions.ItemIndex) 
else op_key := '0';
	if OpenKey('Software\RealkomMatrix\frmCariBorclar' + op_key,True)Then
				try
                    for i := 0 to LVReportMain.Columns.Count - 1 do begin
                        LVReportMain.Column[i].Width := ReadInteger('Col'+IntToStr(i));
                    end;
				finally
				CloseKey;
			end;
		end;
	finally
	Regs.Free;
	end;
end;

procedure TfrmCariBorclar.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
RegistryYaz;
frmCariBorclar := nil;
Action := caFree;
end;

procedure TfrmCariBorclar.FormShow(Sender: TObject);
var
i       :Integer;
itm     :Integer;
begin
  inherited;
for i := 0 to 100 do DList[i] := 0;
rbReportOptions.Items.Add('Liste');
rbReportOptions.Items.Add('Ay Toplamları');
rbReportOptions.Columns := rbReportOptions.Items.Count;

itm := 0;
LVReportMain.Columns.Add;
LVReportMain.Columns[itm].Caption := 'Grup Adı';Inc(itm);
LVReportMain.Columns.Add;
LVReportMain.Columns[itm].Caption := 'Döviz';
LVReportMain.Columns[itm].Alignment := taRightJustify;Inc(itm);
LVReportMain.Columns.Add;
LVReportMain.Columns[itm].Caption := 'Adet';
LVReportMain.Columns[itm].Alignment := taRightJustify;Inc(itm);
LVReportMain.Columns.Add;
LVReportMain.Columns[itm].Caption := 'Bakiye';
LVReportMain.Columns[itm].Alignment := taRightJustify;Inc(itm);

RegistryOku;
LoadReportDataSet;
end;
end.

Yukarıdaki kaynak kod örneğimizde RegistryYaz ve RegistryOku fonksiyonlarında makalenin başında bahsettiğim Windows Kayıt Defteri'nden okuma ve yazma işlemleri yapılmaktadır. Formumuzun ekran görüntüsü aşağıdaki gibidir. 
 

Aşağıdaki ekran görüntüsünde de kayıt işlemlerinden sonra Windows Kayıt Defterinde oluşmuş olan anahtarlara ait detaylar görülmektedir. Ekran görüntüsünün sağ kısmında yer alan
Col1
Col2
Col3
...
gibi DWORD (Sayılsal Anahtar Değerleri) anahtar değerlerinin oluştuğunu görmekteyiz.

 

ListView'e ait kayıt defteri anahtar değerleri