Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сохранение состояния ВСЕХ компонентов

Delphi , Компоненты и Классы , Компоненты

Сохранение состояния ВСЕХ компонентов

Автор: Святослав
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Сохраняет состояние !!!ВСЕХ!!! компонентов (втч и вложенных, втч TYesOrNoDialog)
на форме в реестр. Знает кучу классов. Очень удобен, напримр, для руссификации приложения
(Создаете *.reg файл, с переведенными property text, caption и т.д.)

TStateSaver.RegistryPath:String - то мето в реестре, куда сохранять.
.WriteTop, .WriteLeft, .WriteHeight, ... :Boolean - сохранять ли соответствующее
Property (нет динамического списка, который можно было бы реализовать, используя
GetFieldAddress, по причине невозможности определить состояние ReadOnly :( )
property OnNewComponentSaving:TSaverEvent read _ONNC write _ONNC;
property OnNewComponentLoading:TSaverEvent read _ONNCL write _ONNCL; - event'ы
вызывающиеся при сохранении/загрузки состояния какого-то компонента.
Параметр DoIt:Boolean - сохранить/загрузить или нет.
procedure SaveComponentState(C:TComponent; preffix, postfix:String);
procedure LoadComponentState(C:TComponent; preffix, postfix:String);
-сохранить/загрузить состояние всех под-компонентов компонента C.
preffix и postfic - префикс и постфикс имени при сохранении в реестр.

Зависимости: Windows, Messages, SysUtils, Classes, Registry, Dialogs, Controls,
StdCtrls, ExtCtrls, Buttons, UBPFD.YesOrNoDialog, Menus;
Автор:       Святослав, lisin@asicdesign.ru, ICQ:138752432, Saint Petersburg
Copyright:   (C) NetBreaker666[AWD]<SP666>@Svjatoslav_Lisin - т.е. я сам
Дата:        11 августа 2002 г.
***************************************************** }

unit StateSaver;

interface

uses
  Windows, Messages, SysUtils, Classes, Registry, Dialogs, Controls, StdCtrls,
    ExtCtrls, Buttons, YesOrNoDialog, Menus;
type
  TSaverEvent = procedure(Sender: TObject; Target: TComponent; var DoIt: Boolean)
    of object;

  TStateSaver = class(TComponent)
  private
    { Private declarations }
    RegPath: string;
    RegRoot: string;
    RegRootHKEY: HKEY;
    WTOP, WLEFT, WWIDTH, WHEIGHT, WTAG: Boolean;
    WCAPTION, WTEXT, WCOLOR: Boolean;
    WEnabled, WVisible, WChecked: Boolean;
    _ONNC, _ONNCL: TSaverEvent;
    procedure SetRegRoot(S: string);
    procedure SetRegRootHKEY(HK: HKEY);
  protected

    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property RegistryRoot: string read RegROOT write SetRegROOT;
    property RegistryRootHKEY: HKey read RegRootHKEY write SetRegRootHKEY default
      HKEY_CURRENT_USER;
    property RegistryPath: string read RegPath write RegPath;
    property WriteTop: Boolean read WTOP write WTOP;
    property WriteLeft: Boolean read WLeft write WLeft;
    property WriteWidth: Boolean read WWIDTH write WWidth;
    property WriteHeight: Boolean read WHEIGHT write WHeight;
    property WriteCaption: Boolean read WCaption write WCaption;
    property WriteText: Boolean read WText write WText;
    property WriteColor: boolean read WColor write WColor;
    property WriteTag: Boolean read WTAG write WTag;
    property WriteEnabled: Boolean read WEnabled write WEnabled;
    property WriteVisible: Boolean read WVisible write WVisible;
    property WriteChecked: Boolean read WChecked write WChecked;
    property OnNewComponentSaving: TSaverEvent read _ONNC write _ONNC;
    property OnNewComponentLoading: TSaverEvent read _ONNCL write _ONNCL;
    procedure SaveComponentState(C: TComponent; preffix, postfix: string);
    procedure LoadComponentState(C: TComponent; preffix, postfix: string);
  end;

  TUPC = class(TControl)
  public
    property Color;
    property Caption;
    property Text;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('NetBreakers', [TStateSaver]);
end;

procedure TStateSaver.SetRegRoot(S: string);
begin
  S := UpperCase(S);
  if S = 'HKEY_LOCAL_MACHINE' then
  begin
    RegRootHKEY := HKEY_LOCAL_MACHINE;
    RegRoot := S;
    Exit;
  end;
  if S = 'HKEY_CURRENT_USER' then
  begin
    RegRootHKEY := HKEY_CURRENT_USER;
    RegRoot := S;
    Exit;
  end;
  if S = 'HKEY_CLASSES_ROOT' then
  begin
    RegRootHKEY := HKEY_CLASSES_ROOT;
    RegRoot := S;
    Exit;
  end;

  if S = 'HKEY_USERS' then
  begin
    RegRootHKEY := HKEY_USERS;
    RegRoot := S;
    Exit;
  end;

  if S = 'HKEY_PERFORMANCE_DATA' then
  begin
    RegRootHKEY := HKEY_PERFORMANCE_DATA;
    RegRoot := S;
    Exit;
  end;
  if S = 'HKEY_CURRENT_CONFIG' then
  begin
    RegRootHKEY := HKEY_CURRENT_CONFIG;
    RegRoot := S;
    Exit;
  end;
  if S = 'HKEY_DYN_DATA' then
  begin
    RegRootHKEY := HKEY_DYN_DATA;
    RegRoot := S;
    Exit;
  end;

  ShowMessage('Invalid registry key.');

end;

procedure TStateSaver.SetRegRootHKEY(HK: HKEY);
begin
  case HK of
    HKEY_LOCAL_MACHINE:
      begin
        RegRoot := 'HKEY_LOCAL_MACHINE';
      end;

    HKEY_CURRENT_USER:
      begin
        RegRoot := 'HKEY_CURRENT_USER';
      end;

    HKEY_CLASSES_ROOT:
      begin
        RegRoot := 'HKEY_CLASSES_ROOT';
      end;

    HKEY_USERS:
      begin
        RegRoot := 'HKEY_USERS';
      end;

    HKEY_PERFORMANCE_DATA:
      begin
        RegRoot := 'HKEY_PERFORMANCE_DATA';
      end;

    HKEY_CURRENT_CONFIG:
      begin
        RegRoot := 'HKEY_CURRENT_CONFIG';
      end;

    HKEY_DYN_DATA:
      begin
        RegRoot := 'HKEY_DYN_DATA';
      end;
  else
    begin
      ShowMessage('Unknown registry key.');
      Exit;
    end;

  end;
  RegRootHKEY := HK;

end;

procedure TStateSaver.SaveComponentState(C: TComponent; preffix, postfix:
  string);
var
  T: TControl;
  R: TRegistry;
  I: Integer;
  CC: Boolean;
begin
  CC := True;
  if Assigned(_ONNC) then
    _ONNC(self, C, CC);
  if CC then
  begin
    if C is TControl then
    begin
      T := C as TControl;
      R := TRegistry.Create;
      R.RootKey := RegRootHKEY;
      if R.OpenKey(RegPath, True) then
      begin
        try
          if WTOP then
            R.WriteInteger(preffix + C.GetNamePath + '.TOP' + postfix, T.Top);
        except
        end;
        try
          if WEnabled then
            R.WriteBool(preffix + C.GetNamePath + '.Enabled' + postfix,
              T.Enabled);
        except
        end;
        try
          if WVisible then
            R.WriteBool(preffix + C.GetNamePath + '.TOP' + postfix, T.Visible);
        except
        end;

        try
          if WLEFT then
            R.WriteInteger(preffix + C.GetNamePath + '.LEFT' + postfix, T.Left);
        except
        end;
        try
          if WTAG then
            R.WriteInteger(preffix + C.GetNamePath + '.TAG' + postfix, T.Tag);
        except
        end;
        try
          if WHEIGHT then
            R.WriteInteger(preffix + C.GetNamePath + '.HEIGHT' + postfix,
              T.Height);
        except
        end;
        try
          if WWIDTH then
            R.WriteInteger(preffix + C.GetNamePath + '.WIDTH' + postfix,
              T.Width);
        except
        end;
        if WTEXT then
        begin
          try
            R.WriteString(preffix + C.GetNamePath + '.Text' + postfix,
              TUPC(T).Text);
          except
            try
              if T is TCustomEdit then
                R.WriteString(preffix + C.GetNamePath + '.Text' + postfix,
                  TCustomEdit(T).Text);
            except
            end;
          end;
        end;
        if WCOLOR then
        begin
          try
            R.WriteInteger(preffix + C.GetNamePath + '.Color' + postfix,
              Integer(TUPC(T).color));
          except
          end;
        end;
        if WCAPTION then
        begin
          try
            R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
              TUPC(T).caption);
          except
            try
              if T is TButton then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TButton(T).Caption);
              if T is TCustomLabel then
                R.WriteString(preffix + C.GetNamePath + '.caption' + postfix,
                  TCustomLabel(T).Caption);
              if T is TCheckBox then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TCheckBox(T).Caption);
              if T is TRadioButton then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TRadioButton(T).Caption);
              if T is TGroupBox then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TGroupBox(T).Caption);
              if T is TRadioGroup then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TRadioGroup(T).Caption);
              if T is TPanel then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TPanel(T).Caption);
              if T is TSpeedButton then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TSpeedButton(T).Caption);
              if T is TStaticText then
                R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
                  TStaticText(T).Caption);
            except
            end;
          end;
        end;

      end
      else
      begin
        //ShowMessage('Couldn''t open key "'+RegPath+'".');
        Exit;
      end;
      R.Free;
    end
    else
    begin
      if C is TYesOrNoDialog then
      begin
        R := TRegistry.Create;
        R.RootKey := RegRootHKEY;
        if R.OpenKey(RegPath, True) then
        begin
          if WCaption then
            R.WriteString(preffix + C.GetNamePath + '.Caption' + postfix,
              TYesOrNoDialog(C).caption);
          if WText then
            R.WriteString(preffix + C.GetNamePath + '.Text' + postfix,
              TYesOrNoDialog(C).Text);
        end;
        R.Free;
      end;
      if C is TPopupMenu then
      begin
        R := TRegistry.Create;
        R.RootKey := RegRootHKEY;
        if R.OpenKey(RegPath, True) then
        begin
          for I := 0 to TPopupMenu(C).Items.Count - 1 do
          begin
            if WCaption then
              R.WriteString(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Caption' + postfix, TPopupMenu(C).Items[I].caption);
            if WEnabled then
              R.WriteBool(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Enabled' + postfix, TPopupMenu(C).Items[I].Enabled);
            if WVisible then
              R.WriteBool(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Visible' + postfix, TPopupMenu(C).Items[I].Visible);
            if WChecked then
              R.WriteBool(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Checked' + postfix, TPopupMenu(C).Items[I].Checked);
          end;
        end;
        R.Free;
      end;

    end;

  end;
  for I := 0 to C.ComponentCount - 1 do
    SaveComponentState(C.Components[i], preffix + C.GetNamePath + '.', postfix);
end;

procedure TStateSaver.LoadComponentState(C: TComponent; preffix, postfix:
  string);
var
  T: TControl;
  R: TRegistry;
  I: Integer;
  CC: Boolean;
begin
  CC := True;
  if Assigned(_ONNCL) then
    _ONNCL(self, C, CC);
  if CC then
  begin
    if C is TControl then
    begin
      T := C as TControl;
      R := TRegistry.Create;
      R.RootKey := RegRootHKEY;
      if R.OpenKey(RegPath, False) then
      begin
        try

          if WTOP then
            if R.ValueExists(preffix + C.GetNamePath + '.TOP' + postfix) then
              T.Top := R.ReadInteger(preffix + C.GetNamePath + '.TOP' +
                postfix);
        except
        end;
        try
          if WEnabled then
            if R.ValueExists(preffix + C.GetNamePath + '.Enabled' + postfix)
              then
              T.Enabled := R.ReadBool(preffix + C.GetNamePath + '.Enabled' +
                postfix);
        except
        end;
        try
          if WVisible then
            if R.ValueExists(preffix + C.GetNamePath + '.TOP' + postfix) then
              T.Visible := R.ReadBool(preffix + C.GetNamePath + '.TOP' +
                postfix);
        except
        end;

        try
          if WLEFT then
            if R.ValueExists(preffix + C.GetNamePath + '.LEFT' + postfix) then
              T.Left := R.ReadInteger(preffix + C.GetNamePath + '.LEFT' +
                postfix);
        except
        end;
        try
          if WTAG then
            if R.ValueExists(preffix + C.GetNamePath + '.TAG' + postfix) then
              T.Tag := R.ReadInteger(preffix + C.GetNamePath + '.TAG' +
                postfix);
        except
        end;
        try
          if WHEIGHT then
            if R.ValueExists(preffix + C.GetNamePath + '.HEIGHT' + postfix) then
              T.Height := R.ReadInteger(preffix + C.GetNamePath + '.HEIGHT' +
                postfix);
        except
        end;
        try
          if WWIDTH then
            if R.ValueExists(preffix + C.GetNamePath + '.WIDTH' + postfix) then
              T.Width := R.ReadInteger(preffix + C.GetNamePath + '.WIDTH' +
                postfix);
        except
        end;
        if WTEXT then
          if R.ValueExists(preffix + C.GetNamePath + '.Text' + postfix) then
          begin
            try
              TUPC(T).Text := R.ReadString(preffix + C.GetNamePath + '.Text' +
                postfix);
            except
              try
                if T is TCustomEdit then
                  TCustomEdit(T).Text := R.ReadString(preffix + C.GetNamePath +
                    '.Text' + postfix);
              except
              end;
            end;
          end;
        if WCOLOR then
          if R.ValueExists(preffix + C.GetNamePath + '.Color' + postfix) then
          begin
            try
              TUPC(T).Color := R.ReadInteger(preffix + C.GetNamePath + '.Color'
                + postfix);
            except
            end;
          end;
        if WCaption then
          if R.ValueExists(preffix + C.GetNamePath + '.Caption' + postfix) then
          begin
            try
              TUPC(T).Caption := R.ReadString(preffix + C.GetNamePath +
                '.Caption' + postfix);
            except
              try
                if T is TButton then
                  TButton(T).Caption := R.ReadString(preffix + C.GetNamePath +
                    '.Caption' + postfix);
                if T is TCustomLabel then
                  TCustomLabel(T).Caption := R.ReadString(preffix + C.GetNamePath
                    + '.caption' + postfix);
                if T is TCheckBox then
                  TCheckBox(T).Caption := R.ReadString(preffix + C.GetNamePath +
                    '.Caption' + postfix);
                if T is TRadioButton then
                  TRadioButton(T).Caption := R.ReadString(preffix + C.GetNamePath
                    + '.Caption' + postfix);
                if T is TGroupBox then
                  TGroupBox(T).Caption := R.ReadString(preffix + C.GetNamePath +
                    '.Caption' + postfix);
                if T is TRadioGroup then
                  TRadioGroup(T).Caption := R.ReadString(preffix + C.GetNamePath
                    + '.Caption' + postfix);
                if T is TPanel then
                  TPanel(T).Caption := R.ReadString(preffix + C.GetNamePath +
                    '.Caption' + postfix);
                if T is TSpeedButton then
                  TSpeedButton(T).Caption := R.ReadString(preffix + C.GetNamePath
                    + '.Caption' + postfix);
                if T is TStaticText then
                  TStaticText(T).Caption := R.ReadString(preffix + C.GetNamePath
                    + '.Caption' + postfix);
              except
              end;

            end;

          end;

      end;
      R.Free;
    end
    else
    begin
      if C is TYesOrNoDialog then
      begin
        R := TRegistry.Create;
        R.RootKey := RegRootHKEY;
        if R.OpenKey(RegPath, False) then
        begin
          if WCaption then
            if R.ValueExists(preffix + C.GetNamePath + '.Caption' + postfix)
              then
              TYesOrNoDialog(C).caption := R.ReadString(preffix + C.GetNamePath +
                '.Caption' + postfix);
          if WText then
            if R.ValueExists(preffix + C.GetNamePath + '.Text' + postfix) then
              TYesOrNoDialog(C).text := R.ReadString(preffix + C.GetNamePath +
                '.Text' + postfix);
        end;
        R.Free;
      end;
      if C is TPopupMenu then
      begin
        R := TRegistry.Create;
        R.RootKey := RegRootHKEY;
        if R.OpenKey(RegPath, True) then
        begin
          for I := 0 to TPopupMenu(C).Items.Count - 1 do
          begin
            if WCaption then
              if R.ValueExists(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Caption' + postfix) then
                TPopupMenu(C).Items[I].caption := R.ReadString(preffix +
                  C.GetNamePath + '.Item[' + IntToStr(I) + '].Caption' + postfix);
            if WEnabled then
              if R.ValueExists(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Enabled' + postfix) then
                TPopupMenu(C).Items[I].Enabled := R.ReadBool(preffix +
                  C.GetNamePath + '.Item[' + IntToStr(I) + '].Enabled' + postfix);
            if WVisible then
              if R.ValueExists(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Visible' + postfix) then
                TPopupMenu(C).Items[I].Visible := R.ReadBool(preffix +
                  C.GetNamePath + '.Item[' + IntToStr(I) + '].Visible' + postfix);
            if WChecked then
              if R.ValueExists(preffix + C.GetNamePath + '.Item[' + IntToStr(I) +
                '].Checked' + postfix) then
                TPopupMenu(C).Items[I].Checked := R.ReadBool(preffix +
                  C.GetNamePath + '.Item[' + IntToStr(I) + '].Checked' + postfix);
          end;
        end;
        R.Free;
      end;

    end;
  end;
  for I := 0 to C.ComponentCount - 1 do
    LoadComponentState(C.Components[i], preffix + C.GetNamePath + '.', postfix);

end;

end.

Класс TStateSaver, представленный в этом модуле Delphi, предназначен для сохранения и загрузки состояния компонентов, таких как свойства форм, свойств компонентов и свойств контролов, в реестр Windows.

В классе есть следующие свойства:

  • RegistryPath: Путь в реестре, где будет храниться состояние.
  • RegistryRootHKEY: Корневой ключ в реестре, где будет храниться состояние (например, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER).
  • WriteTop, WriteLeft, WriteWidth, WriteHeight, WriteCaption, WriteText, WriteColor, WriteTag, WriteEnabled и WriteVisible: Булевы свойства, которые определяют, будет ли записано соответствующее свойство формы или компонента в реестр.

Методы класса:

  • SaveComponentState(C: TComponent; preffix, postfix: string): Сохраняет состояние компонента и его детей в реестре.
  • LoadComponentState(C: TComponent; preffix, postfix: string): Загружает состояние компонента и его детей из реестра.

Класс использует компонент TRegistry для взаимодействия с реестром Windows. Метод SaveComponentState перебирает компоненты формы или контрола, сохраняет их свойства в реестре с помощью методов Write класса TRegistry, и рекурсивно вызывает себя на каждом дочернем компоненте. Метод LoadComponentState делает противоположное, перебирая компоненты и загружая их свойства из реестра с помощью методов Read класса TRegistry.

Класс также включает в себя обработчики событий для сохранения и загрузки состояния: OnNewComponentSaving и OnNewComponentLoading. Эти события позволяют вам выполнять custom-акции при сохранении или загрузке компонента.

В целом, класс TStateSaver предоставляет удобный способ сохранять и загружать состояние Delphi-форм и контролов в реестр Windows.

Сохранение состояния всех компонентов на форме в реестр Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:26:28/0.0067849159240723/1