[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    {****************************************************************
     * 	TExtIniF class																							*
     *	created and copyright by Ferdinand Soethe 1996  						*
     *	(email: f.soethe@oln.comlink.apc.org)												*
     *																															*
     *	You may use this source code in your applications           *
     *	(a word of credit would be nice) but you must not 					*
     *	resell it as part of a library or publish it in paper-			*
     *	or electronic form without asking my permission.						*
     *																															*
     *	TExtIniF extends Delphi's TIniFile to simplify saving a 		*
     *	components state to an INI-File. After creation you can 		*
     *	register any number of components and	save and retrieve     *
     *  their settings with just one call to StoreObjectStates.			*
     *																															*
     ****************************************************************}

    unit extINIF;

    interface

    uses
    	{unfortunately we need to include a units of classes
     	 that we want to be able to store}
      IniFiles, Files, Classes, Forms, StdCtrls, FileCtrl, Menus,
      sysUtils, TabNotBK;

    type
    	EExtIniFError = class(Exception);
    	TExtIniF = class(TIniFile)
      private
        { Private-Deklarationen }
    		FAutoStore: boolean;    {store all objects states before TExtIniF is destroyed}
    		FRegObjects: TStringList; {list of all registered objects}
    		FIniSection: String;    {Name of [section] where values are stored}
      protected
        { Protected-Deklarationen }
      public
        { Public-Deklarationen }
    		constructor create(IniFName: TFileName);
    		destructor destroy; override;
    		{find the ini section for a registered object}
    		function GetIniSection(obj: TObject): string;
    		{Add a component to the list of objects}
    		procedure RegisterObject(obj: TObject; INISection: string);
    		{Remove a component to the list of objects}
        procedure UnRegisterObject(obj: TObject; INISection: string);
    		{Retrieve the setting of a single Object}
        procedure ReStoreObjectState(obj: TObject; INISection: string);
    		{Restore states of all registered objects}
    		procedure RestoreObjectStates;
    		{Restore states of all registered objects}
    		procedure StoreObjectState(obj: TObject; INISection: string);
    		{Store state of a single object}
    		procedure StoreObjectStates;
    		{Store states of all registered objects}
      published
        { Published-Deklarationen }
    		property AutoStore: boolean read FAutoStore write FAutoStore;
    		property IniSection: string read FIniSection write FIniSection;
      end;

    implementation

    { find the section string to a registered object
       if not registered or section string is empty
       return default value}
    function TExtIniF.GetIniSection(obj: TObject): string;
    var
    	index: integer;
    begin
    	index:= FRegObjects.indexOfObject(obj);
    	if ( index > -1 ) then begin
    		result:= FRegObjects.strings[index];
    		if result = '' then
    			result:= FIniSection;
    	end else
    		result:= FIniSection;
    end; {GetIniSection}

    {}
    constructor TExtIniF.create(IniFName: TFileName);
    begin
    	{if you don't pass your own name for the ini-File, it will be the name
    	 of your exe-file with the extension '*.INI'}
    	if ( IniFName = '' ) then IniFName:= ExtraxtFileBaseName(application.exename)+'.ini';
    	inherited create(IniFName);
      FRegObjects:= TStringList.Create;
    	FIniSection:= 'Options';
    end;

    {}
    destructor TExtIniF.Destroy;
    begin
    	{If AutoStore is set, values are stored
    	 before TExtIniF-Object is destroyed}
    	if FAutoStore then StoreObjectStates;
    	FRegObjects.destroy;
    	inherited destroy;
    end;

    { Add an object to the list of monitored objects. If you pass an empty string
       for INISection, the default value will apply and no name will be stored}
    procedure TExtIniF.RegisterObject(obj: TObject; INISection: string);
    begin
    	{check if object is already registered}
    	if ( FRegObjects.indexOfObject(obj) = -1 ) then
    		FRegObjects.addObject(INISection,obj);
    end;

    { Remove an object from the list of monitored objects.}
    procedure TExtIniF.UnRegisterObject(obj: TObject; INISection: string);
    var
    	index: integer;
    begin
    	index:= FRegObjects.indexOfObject(obj);
    	if ( index > -1 ) then
    		FRegObjects.delete(index);
    end;

    { Restores the name of an object from the INI-File
       Note: When there is no entry in the INI-File, the object's value
     				 is not changed.}
    procedure TExtIniF.ReStoreObjectState(obj: TObject; INISection: string);
    var
    	strBuf: string;
    begin
    	if ( INISection = '' ) then INISection:= FIniSection;
    	{the next lines check for the type of object and
    	 restore whatever property we would like to store of that object
    	 if you make changes here you will need to make changes in
    	 StoreObjectState as well!!!}
      if (obj.classInfo <> nil ) then begin
        if (obj is TCheckBox) then begin
          with (obj as TCheckBox) do begin
    				{Checkboxes: restore checked state}
            checked:= readBool(INISection,Name,checked);
          end;
        end else
        if (obj is TEdit) then begin
          with (obj as TEdit) do begin
    				{Editfield: restore text}
            text:= readString(INISection,Name,text);
          end;
        end else
        if (obj is TMenuItem) then begin
          with (obj as TMenuItem) do begin
    				{Menuitem: restore checked state}
            checked:= readBool(INISection,Name,checked);
          end;
        end else
    		if (obj is TTabbedNoteBook) then begin
            with (obj as TTabbedNoteBook) do begin
    					{Notebook: restore open Tab}
              pageIndex:= readInteger(INISection,Name,pageIndex);
            end;
        end else
        if (obj is TDriveComboBox) then begin
          with (obj as TDriveComboBox) do begin
    				{DriveCombo: restore selected drive}
    				strBuf:= readString(INISection,Name,Drive);
            Drive:= strBuf[1];
          end;
        end else
        if (obj is TDirectoryListBox) then begin
          with (obj as TDirectoryListBox) do begin
    				{DirectoryList: restore current directory}
            Directory:= readString(INISection,Name,Directory);
          end;
        end else
        	raise EExtIniFError.create('This object is not supported!');
    	end;
    end;

    { Restores the state of all registered objects
       from the INI-File}
    procedure TExtIniF.RestoreObjectStates;
    var
    	objNo: integer;
    begin
    	{iterate through all registered objects}
    	for objNo:= 0 to FRegObjects.count - 1 do
        ReStoreObjectState(FRegObjects.objects[objNo],FRegObjects.strings[objNo]);
    end;

    { Stores the state of an object to the INI-File}
    procedure TExtIniF.StoreObjectState(obj: TObject; INISection: string);
    var
    		strBuf: string;
    begin
    	if ( INISection = '' ) then INISection:= FIniSection;

    	{the next lines check for the type of object and
    	 store whatever property we would like to store of that object
    	 if you make changes here you will need to make changes in
    	 ReStoreObjectState as well!!!}

      if (obj.classInfo <> nil ) then begin
          if (obj is TCheckBox) then begin
    				{Checkboxes: store checked state}
            with (obj as TCheckBox) do begin
              writeBool(INISection,Name,checked);
            end;
          end else
          if (obj is TEdit) then begin
    				{Editfield: store text}
            with (obj as TEdit) do begin
              writeString(INISection,Name,text);
            end;
          end else
          if (obj is TMenuItem) then begin
    				{Menuitem: restore checked state}
            with (obj as TMenuItem) do begin
              writeBool(INISection,Name,checked);
            end;
          end else
    			if (obj is TTabbedNoteBook) then begin
            with (obj as TTabbedNoteBook) do begin
    					{Notebook: restore open Tab}
              writeInteger(INISection,Name,pageIndex);
            end;
      	  end else
    			if (obj is TDriveComboBox) then begin
          	with (obj as TDriveComboBox) do begin
    					{DriveCombo: restore selected drive}
    					writeString(INISection,Name,Drive);
          	end;
        	end else
    			if (obj is TDirectoryListBox) then begin
    				{DirectoryList: restore current directory}
            with (obj as TDirectoryListBox) do begin
              writeString(INISection,Name,Directory);
            end;
    	    end else
      	  	raise EExtIniFError.create('This object is not supported!');
    		end;
    end;

    { Stores the state of all registered objects
       to the INI-File}
    procedure TExtIniF.StoreObjectStates;
    var
    	objNo: integer;
    begin
    	for objNo:= 0 to FRegObjects.count - 1 do
        StoreObjectState(FRegObjects.objects[objNo],FRegObjects.strings[objNo]);
    end;

    end.

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]