![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение геометрических параметров формы
NieL © (2008-12-03 11:51:00)Хочу написать класс-наследник от TForm с возможностью восстановления/сохранения геометрических параметров. Как вариант рассматриваю сохранение либо в Ini-файл, либо в опциональый поток, самого Exe, либо в реестр. Какой из вариантов вы посоветуете, и есть ли минусы при сохранении в опциональный поток Exe, помимо того что файловая система должна быть NTFS.
NieL (2008-12-03 15:36:00) [1]Вот накатал класс-наследник TForm с сохраннием Left, Top, Width, Height в опциональный поток Exe. Тестил несколько часов и ничего ошибочного пока не нашел. И чем не вариант?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
const_Path_OptionalStream = '%s : %s _ %s';
const_name_LeftParam = 'Left';
const_name_TopParam = 'Top';
const_name_WidthParam = 'Width';
const_name_HeightParam = 'Height';
type
TPosRestoreForm = class(TForm)
public
constructor Create(
AOwner: Tcomponent); override;
destructor Destroy; override;
end;
{ TEST FORM }
// -------------------------------------------------
Tform_Main = class(TPosRestoreForm)
private
{ Private declarations }
public
{ Public declarations }
end;
// -------------------------------------------------
var
form_Main: Tform_Main;
implementation
{$R *.dfm}
{ TPosRestorerForm }
constructor TPosRestoreForm.Create(AOwner: TComponent);
procedure GetInteger(var Val: Integer; _Name: string; Default: Integer);
var
F: TFileStream;
P: PByte;
begin
try
P := @Val;
F := TFileStream.Create(_Name, fmOpenRead or fmShareDenyNone);
try
F.ReadBuffer(P^, SizeOf(Integer));
finally
F.Free;
end;
except
Val := Default;
end;
end;
var
L, T, W, H, Def: Integer;
begin
inherited;
Def := Low(Integer);
GetInteger(L, Format(const_Path_OptionalStream, [ParamStr(0),
Name, const_name_LeftParam]), Low(Integer ));
if L <> Def then
Left := L;
GetInteger(T, Format(const_Path_OptionalStream, [ParamStr(0),
Name, const_name_TopParam]), Low(Integer ));
if T <> Def then
Top := T;
GetInteger(W , Format(const_Path_OptionalStream, [ParamStr(0),
Name, const_name_WidthParam]), Low(Integer ));
if W <> Def then
Width := W;
GetInteger(H, Format(const_Path_OptionalStream, [ParamStr(0),
Name, const_name_HeightParam]), Low(Integer));
if H <> Def then
Height := H;
end;
destructor TPosRestoreForm.Destroy;
procedure SetInteger(Val: Integer; _Name: string);
var
F: TFileStream;
P: PByte;
begin
DeleteFile(_Name);
F := TFileStream.Create(_Name, fmCreate);
try
P := @Val;
F.WriteBuffer(P^, SizeOf(Integer));
finally
F.Free;
end;
end;
begin
SetInteger(Self.Left , Format(const_Path_OptionalStream,
[ParamStr(0), Self.Name, const_name_LeftParam ]));
SetInteger(Self.Top, Format(const_Path_OptionalStream,
[ParamStr(0), Self.Name, const_name_TopParam ]));
SetInteger(Self.Width , Format(const_Path_OptionalStream,
[ParamStr(0), Self.Name, const_name_WidthParam ]));
SetInteger(Self.Height, Format(const_Path_OptionalStream,
[ParamStr(0), Self.Name, const_name_HeightParam ]));
inherited;
end;
end.
Jeer (2008-12-03 15:18:00) [2]Интересно, что такого военного случится ? :)
Поросенок Винни-Пух (2008-12-03 14:38:00) [3]Хочу написать класс-наследник от TForm с возможностью восстановления/сохранения геометрических параметров.
Теперь представь:
создал потомка TForm, который умеет что-то там записывать о себе на носитель.
Идем дальше и наследуемся от этой формы.
И что получается? Догадался?
Jeer (2008-12-03 14:32:00) [4]
> Как вариант рассматриваю сохранение либо в Ini-файл,
Многие, многие лета именно так и создаются у меня проекты.
Удобно, практично, ненавязчиво :)
Туда же пишутся многие другие настройки от контролов ( RX не пользуюсь )
Варианты местоположения ini зависят от особенностей проекта - каталог программы, каталог пользователя..
sniknik (2008-12-03 12:54:00) [5]а что такое "геометрические параметры"? их много? и зачем их сохранять если достаточно всего 4х параметров - лево, сверху, ширина, высота. все что внутри и так по ним подстраивается (если с якорями сделано), то что не подстраивается (сплитеры, поля в гридах), ну их приходится дополнительно, и уже лучше в них (особенно для грида), а не в форме, обрабатывать.
как то делал подобное, сохранял в реестр, в текущего юзера, чем кстати автоматически делится на разные настройки для разных юзеров.
> в опциональный поток Exe
не усложняй... наоборот пытайся упростить.
clickmaker (2008-12-03 12:01:00) [6]> и есть ли минусы при сохранении в опциональный поток Exe
а есть ли плюсы?
Сергей М. (2008-12-03 11:56:00) [7]
> Какой из вариантов вы посоветуете
Любой кроме "самосохранения", ибо блажь.