Jump to content


Photo

Saving and loading TNextGridLayout reliably (using registry)


  • Please log in to reply
No replies to this topic

#1 tonyamosza

tonyamosza
  • Members
  • 3 posts

Posted 22 October 2014 - 08:19 PM

I'm posting this for anyone interested in reliably saving/loading of grid layout (using registry).

To use, create instance of class and then use Store and Restore methods e.g.

Persist := TNextGridPersist.Create('My Application Name', mxrlCurrentUser);
try
Persist.Store(grdMyGrid, 'MyGrid');
finally
Persist.Free;
end;

Persist := TNextGridPersist.Create('My Application Name', mxrlCurrentUser);

try
Persist.Restore(grdMyGrid,'MyGrid');
finally
Persist.Free;
end;

Unit starts here:

unit mxNextGridPersistClasses;

interface

uses
NxGrid;

const
PREFIX = 'SOFTWARE\';

type
TmxRegistryLocation = (mxrlLocalMachine, mxrlCurrentUser);

TmxNextGridPersist = class
private
FApplication: string;
FRegistryLocation: TmxRegistryLocation;
public
constructor Create(AApplication: string; ARegistryLocation: TmxRegistryLocation = mxrlCurrentUser);
procedure Restore(ANextGrid: TNextGrid; AGridName: string); overload;
procedure Store(ANextGrid: TNextGrid; AGridName: string); overload;
end;

implementation

uses
Registry, Windows, Classes, NxCustomGrid, SysUtils, NxColumns;

{ TmemPersist }

constructor TmxNextGridPersist.Create(AApplication: string; ARegistryLocation: TmxRegistryLocation = mxrlCurrentUser);
begin
FApplication := AApplication;
FRegistryLocation := ARegistryLocation;
end;

procedure TmxNextGridPersist.Restore(ANextGrid: TNextGrid; AGridName: string);
var
ColumnCount: Integer;
I: Integer;
Layout: TStringList;
Position: Integer;
R: TRegistry;
begin
R := TRegistry.Create;
Layout := TStringList.Create;
try
case FRegistryLocation of
mxrlLocalMachine:
R.RootKey := HKEY_LOCAL_MACHINE;
mxrlCurrentUser:
R.RootKey := HKEY_CURRENT_USER;
end;
R.OpenKey(
PREFIX + FApplication + '\Grids\' + AGridName,
True);
if R.ValueExists('ColumnCount') then
begin
try
ColumnCount := R.ReadInteger('ColumnCount');
if ColumnCount <> ANextGrid.Columns.Count then
Exit;

for Position := 0 to ColumnCount - 1 do
begin
{ Find column for Position }
for I := 0 to ColumnCount - 1 do
begin
Layout.Delimiter := ';';
Layout.DelimitedText := R.ReadString('Column' + IntToStr(I));
if StrToInt(Layout[3]) = Position then
begin
ANextGrid.Columns[I].Position := Position;
ANextGrid.Columns[I].SortKind := TSortKind(StrToInt(Layout[0]));
ANextGrid.Columns[I].Visible := Boolean(StrToInt(Layout[1]));
ANextGrid.Columns[I].Sorted := Boolean(StrToInt(Layout[2]));
ANextGrid.Columns[I].Width := StrToInt(Layout[4]);
end;
end;
end;
except
end;
end;
finally
R.Free;
Layout.Free;
end;
end;

procedure TmxNextGridPersist.Store(ANextGrid: TNextGrid; AGridName: string);
var
I: Integer;
Layout: string;
R: TRegistry;
begin
R := TRegistry.Create;
try
case FRegistryLocation of
mxrlLocalMachine:
R.RootKey := HKEY_LOCAL_MACHINE;
mxrlCurrentUser:
R.RootKey := HKEY_CURRENT_USER;
end;
R.OpenKey(
PREFIX + FApplication + '\Grids\' + AGridName,
True);
R.WriteInteger(
'ColumnCount',
ANextGrid.Columns.Count);
for I := 0 to ANextGrid.Columns.Count - 1 do
begin
Layout := IntToStr(Ord(ANextGrid.Columns[I].SortKind));
Layout := Layout + ';' + IntToStr(Ord(ANextGrid.Columns[I].Visible));
Layout := Layout + ';' + IntToStr(Ord(ANextGrid.Columns[I].Sorted));
Layout := Layout + ';' + IntToStr(Ord(ANextGrid.Columns[I].Position));
Layout := Layout + ';' + IntToStr(Ord(ANextGrid.Columns[I].Width));
R.WriteString(
'Column' + IntToStr(I),
Layout);
end;
finally
R.Free;
end;
end;

end.




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users