Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 8
Всего онлайн: 8
Зарегистрировано юзеров: 6362
Комментариев на сайте: 645
Новый юзер: Pseulairrerve



Последние комментарии
c
Aqel прокомментировал "Урок 71 - Работа с сжатыми файлами":
GZip псевдоархив, на мой вопрос тоже не отвечают, как распаковать отдельные файлы/папки...
Pingitrus прокомментировал "Урок 71 - Работа с сжатыми файлами":
Есть еще кто нибудь живой на этом сайте, кто сможет помочь? Так то все работает, zip и rar распаковывает, но у меня есть файл dat который сжат GZip, почему то его не удается распаковать или так не получится так как этот файл не является архивом или является?)) пишет ошибку что неверная функция



Мы в соцсетях
c
Delphi
Автоматическое сохранение и восстановление свойств формы

Очередная маленькая хитрость будет посвящена автоматическому сохранению и восстановлению свойств формы, таких как размер, позиция, состояние. Конечно, существует целый ряд пакетов компонент, у которых есть аналогичные функции, но мне, к примеру, не интересно ставить целый пакет только из-за нескольких функций. К тому же, часто за эти пакеты надо платить деньги. В общем, напишем свой компонент.

Создание пустого компонента и пакета
Для начала сделаем "пустышку" для нашего компонента. Для этого вызываем File -> New -> Other:, в диалоге которого выбираем пиктограмму "Component". В появившемся окне заполняем свойства так, как показано на первом рисунке (пути указывайте удобные вам) и нажимаем кнопку "OK".

Теперь, сохраняйте файл компонента и закрывайте его.

Во-вторых, нам потребуется создать пустой пакет, где мы отныне будем размещать компоненты из "Маленьких хитростей". Делается это с помощью пункта меню, в диалоге которого теперь надо выбрать пиктограмму "Package". В окне редактора пакетов (ниже на рисунке) нажмите кнопку "Add" и добавьте недавно созданный файл компонента.

Для проверки нажмите кнопку "Compile", сохраните пакет и возвращайтесь к редактированию компонента, заново открыв его.

Немного проектирования
Следующим номером нашей обширнейшей программы будет вот что: мы определимся с тем, что, как и когда надо сохранять и восстанавливать.

Зная логику работы Delphi-программ, можно уверенно сказать, что сохранять значения следует в обработчике OnDestroy, а восстанавливать в обработчике OnCreate. При этом следует помнить, что во время редактирования формы в IDE ни сохранять, ни восстанавливать ничего не надо.

Оперировать мы будем следующими параметрами: физический размер формы, позиция формы и ее состояние. В этом нам помогут свойства компонента TForm, носящие имена Left, Top, Width, Height и WindowState.

Все параметры мы будем сохранять в ветке HKEY_CURRENT_USER системного реестра. Следовательно, потребуется настроечное свойство, отвечающее за имя ветви, куда сохраняются данные.

Реализация
Напомню, что хитрости маленькие, поэтому не ожидайте чего-то выдающегося. Все очень просто. В процедуре сохранения следует проверить корректность имени ключа реестра, куда будут записаны данные (я сделал минимальную) и, если все хорошо, записать данные. Реализовать это можно вот так:

procedure TgrFormPropSaver.SaveSettings;
var reg: TRegistry;
    frm: TForm;
begin
  if (RegPath = '') then exit;
  try
    reg := TRegistry.Create;
    with reg do
    begin
      RootKey := HKEY_CURRENT_USER;
      OpenKey(RegPath,true);
      frm := TForm(Owner);
      if (frm.WindowState = wsNormal) then
      begin
        WriteInteger('Left',frm.Left);
        WriteInteger('Width',frm.Width);
        WriteInteger('Top',frm.Top);
        WriteInteger('Height',frm.Height);
      end;
      case frm.WindowState of
        wsNormal: WriteInteger('State',1);
        wsMinimized: WriteInteger('State',2);
        wsMaximized: WriteInteger('State',3);
      end;
   end;
  finally
    FreeAndNil(reg);
  end;
end;
Здесь следует пояснить, что, во время состояний формы "максимизирована" и "минимизирована" значения свойств размера и позиции формы могут быть искажены, поэтому я отключил их запись в этих состояниях.

Процедура восстановления также проста, как и сохранения, поэтому я не буду про нее рассказывать.

Вызывать эти процедуры стоит из методов OnCreate и OnDestroy формы, на которой лежит компонент.

Полный текст модуля grFormPropSaver.pas
unit grFormPropSaver;

//**! ----------------------------------------------------------
//**! This unit is a part of Gregor.RU pack project (Gregor.RU
//**! Delphi Components Package).
//**! ----------------------------------------------------------
//**! You may use or redistribute this unit for your purposes
//**! while unit's code and this copyright notice is unchanged
//**! and exists.
//**! ----------------------------------------------------------
//**! URL:  http://www.gregor.ru/
//**! Mail: gregor@gregor.ru
//**! ----------------------------------------------------------
//**! (c) Gregor.RU, 2002. All rights reserved.
//**! ----------------------------------------------------------

{***} interface {***}

uses
  Classes;

type
  TgrFormPropSaver = class(TComponent)
  private
    { Private declarations }
    FRegPath: string;
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure SaveSettings;
    procedure LoadSettings;
  published
    { Published declarations }
    property RegPath: string read FRegPath write FRegPath;
  end;

procedure Register;

{***} implementation {***}

uses Windows, Forms, SysUtils, Registry;

procedure Register;
begin
  RegisterComponents('Gregor.RU', [TgrFormPropSaver]);
end;

{ TgrFormPropSaver }
procedure TgrFormPropSaver.LoadSettings;
var reg: TRegistry;
    frm: TForm;
begin
  if (csDesigning in ComponentState) or
     (RegPath = '') then exit;
  try
    reg := TRegistry.Create;
    with reg do
    begin
      RootKey := HKEY_CURRENT_USER;
      OpenKey(RegPath,true);
      frm := TForm(Owner);
      frm.Position := poDesigned;
      case ReadInteger('State') of
        1: frm.WindowState := wsNormal;
        2: frm.WindowState := wsMinimized;
        3: frm.WindowState := wsMaximized;
      end;
      frm.Width  := ReadInteger('Width');
      frm.Height := ReadInteger('Height');
      frm.Top    := ReadInteger('Top');
      frm.Left   := ReadInteger('Left');
   end;
  finally
    FreeAndNil(reg);
  end;
end;

procedure TgrFormPropSaver.SaveSettings;
var reg: TRegistry;
    frm: TForm;
begin
  if (csDesigning in ComponentState) or
     (RegPath = '') then exit;
  try
    reg := TRegistry.Create;
    with reg do
    begin
      RootKey := HKEY_CURRENT_USER;
      OpenKey(RegPath,true);
      frm := TForm(Owner);
      if (frm.WindowState = wsNormal) then
      begin
        WriteInteger('Left',frm.Left);
        WriteInteger('Width',frm.Width);
        WriteInteger('Top',frm.Top);
        WriteInteger('Height',frm.Height);
      end;
      case frm.WindowState of
        wsNormal: WriteInteger('State',1);
        wsMinimized: WriteInteger('State',2);
        wsMaximized: WriteInteger('State',3);
      end;
   end;
  finally
    FreeAndNil(reg);
  end;
end;

end.

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

Вот и всё, Удачи!

Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 26 Апреля 2015
Просмотров:


Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.