powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / библиотека для сохранения/восстановления свойств компонент
25 сообщений из 119, страница 2 из 5
библиотека для сохранения/восстановления свойств компонент
    #40021680
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyM123,

что это?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021681
AlexeyM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiceSettings Component

Version: 1.00
Release Date: June 8th, 2003

Introduction

NiceSettings is an easy and sophisticated way to add saving and restoring state capabilities to your Delphi applications. It can automatically save and restore form properties and components taking advantage from RTTI. All you have to do is specifying which properties are to be saved and restored.

Limitation: This component uses RTTI. So it only work with published properties of the form and it's components.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021684
AlexeyM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ссылка вставилась неправильно

http://priyatna.org/nicesettings.php
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021696
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я то видел, там какое-то стерье
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021697
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
я то видел, там какое-то стерье

от этого оно перестаёт быть рабочим ?
или тебе обязательно нужно, чтобы с генериками и прочими блэк-джеками ?

Или взять готовое, и допилить под себя - это уже непосильная задача ?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021704
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в своё время был офигенный компонент, жаль только что он на D5 остановился.
Там прямо в дизайнере можно было выбрать всё что ты хочешь сохранить.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021708
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у EhLib и DevExpress есть компоненты, но сохраняют только published свойства.
если хочется что-то другое, то проще ручками
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021709
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да ничего другого и не надо
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021725
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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

AlexeyM123
ссылка вставилась неправильно
http://priyatna.org/nicesettings.php


посмотрел код компонента и выделил жёлтеньким место, где вам нужно вставить свою проверку на "конкретные имена свойств". Розовым выделил собственно считывание или изменение значений свойств компонентов. Учитывая, что это Delphi 7 - юнит, понадобится слегка подправить USESы. Но это вы быстро нагуглите. Даже сам автор пишет "I use Delphi 7. If you use another Delphi version, you may have to make some minor changes"

unit NiceSettings
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
{-------------------------------------------------------------------------------

The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/

Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.


     The Original Code is NiceSettings.pas released at June 8th, 2003.
     The Initial Developer of the Original Code is Priyatna.
     (Website: http://www.priyatna.org Email: me@priyatna.org)
     All Rights Reserved.


Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.

-------------------------------------------------------------------------------}


unit NiceSettings;

interface

uses
  Classes;

type
  TStoreTarget = (stIniFile, stRegistry);

  TNiceSettings = class(TComponent)
  private
    FStoredProps: TStrings;
    FRegKey: string;
    FIniFile: string;
    FStoreTarget: TStoreTarget;
    procedure SetStoredProps(const Value: TStrings);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure LoadSettings;
    procedure SaveSettings;
  published
    property StoredProps: TStrings read FStoredProps write SetStoredProps;
    property RegKey: string read FRegKey write FRegKey;
    property IniFile: string read FIniFile write FIniFile;
    property StoreTarget: TStoreTarget read FStoreTarget write FStoreTarget;
  end;

  procedure Register;


implementation

uses
  Dialogs, Forms, SysUtils, TypInfo, Registry, IniFiles;


procedure Register;
begin
  RegisterComponents('priyatna.org', [TNiceSettings]);
end;


{ TNiceSettings }

constructor TNiceSettings.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FStoreTarget := stIniFile;
  FIniFile := 'Settings.ini';
  FRegKey := 'Software\My Company\My Program';
  FStoredProps := TStringList.Create;
end;

destructor TNiceSettings.Destroy;
begin
  FStoredProps.Free;
  inherited Destroy;
end;

procedure TNiceSettings.SetStoredProps(const Value: TStrings);
begin
  FStoredProps.Assign(Value);
end;

procedure TNiceSettings.LoadSettings;
var
  x, i: Integer;
  s: string;
  Comp: TComponent;
  CompName, PropName, PropValue: string;
  Reg: TRegistry;
  Ini: TIniFile;
  t: TStringList;

begin

  if (FStoredProps.Count = 0)
    then Exit;

  t := TStringList.Create;

  if (FStoreTarget = stRegistry) then
  begin
    Reg := TRegistry.Create;
    Reg.OpenKey(FRegKey + '\' + Owner.Name, True);
    Reg.GetValueNames(t);
  end else
  begin
    Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + FIniFile);
    Ini.ReadSection(Owner.Name, t);
  end;

  for x := 0 to t.Count-1 do
  begin
    s := t[x];
    if (s <> '') then
    begin
      i := Pos('.', s);
      CompName := Copy(s, 1, i - 1);
      if (CompName = '')
        then Comp := Owner
        else Comp := Owner.FindComponent(CompName);
      if Assigned(Comp) then
      begin
        try
          PropName := Copy(s, i + 1, Length(s));
          if (FStoreTarget = stRegistry)
            then PropValue := Reg.ReadString(s)
            else PropValue := Ini.ReadString(Owner.Name, s, '');
          if (PropValue <> '')
            then SetPropValue(Comp, PropName, PropValue);
        except
          // Hide Exception
        end;
      end;
    end;
  end;

  if (FStoreTarget = stRegistry) then
  begin
    Reg.CloseKey;
    Reg.Free
  end else
    Ini.Free;

  t.Free;

end;

procedure TNiceSettings.SaveSettings;
var
  x, i: Integer;
  s: string;
  Comp: TComponent;
  CompName, PropName, PropValue: string;
  Reg: TRegistry;
  Ini: TIniFile;
  t: TStringList;

begin

  if (FStoredProps.Count = 0)
    then Exit;

  if (FStoreTarget = stRegistry) then
  begin
    Reg := TRegistry.Create;
    Reg.OpenKey(FRegKey + '\' + Owner.Name, True);
    t := TStringList.Create;
    Reg.GetValueNames(t);
    for x := 0 to t.Count-1
      do Reg.DeleteValue(t[x]);
    t.Free;  
  end else
  begin
    Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + FIniFile);
    Ini.EraseSection(Owner.Name);
  end;
  
  for x := 0 to FStoredProps.Count-1 do
  begin
    s := Trim(FStoredProps[x]);
    if (s <> '') then
    begin
      i := Pos('.', s);
      CompName := Copy(s, 1, i - 1);
      if (CompName = '')
        then Comp := Owner
        else Comp := Owner.FindComponent(CompName);
      if Assigned(Comp) then
      begin
        try
          if (CompName <> '')
            then CompName := CompName + '.';
          PropName := Copy(s, i + 1, Length(s));
          PropValue := GetPropValue(Comp, PropName);
          if (FStoreTarget = stRegistry)
            then Reg.WriteString(CompName + PropName, PropValue)
            else Ini.WriteString(Owner.Name, CompName + PropName, PropValue);
        except
          // Hide Exception
        end;
      end;
    end;
  end;

  if (FStoreTarget = stRegistry) then
  begin
    Reg.CloseKey;
    Reg.Free
  end else
    Ini.Free;

end;

end.


...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021726
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В RxLib был мощный компонент для сохранения/восстановления разнообразных компонентов.
Если X11 не поленится, всё можно в один unit собрать, чтобы не тащить весь RxLib
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021735
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/Мы в слух/
я удивлен, что у TJSONObject отсутствует метод SaveToStream
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021736
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11вроде нет тут возможности сохранять/восстанавливать только конкретно указанные 1-5 свойств

Есть. Публикуешь только конкретно указанные свойства - сохраняются только конкретно
указанные свойства.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021737
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
/Мы в слух/
я удивлен, что у TJSONObject отсутствует метод SaveToStream


Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  S : TStringList ;
begin
  S := TStringList.Create ;
  S.Add(JSONObject.ToString);
  S.SaveToFile('json.txt');
end ;
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021739
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11я удивлен, что у TJSONObject отсутствует метод SaveToStream

А я не удивлён. На такие модные технологии обычно летят криворукие чайники.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021744
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021763
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
    "ClassName": "TfmdSelTree",
    "Name": "fmdSelTree",
    "props": {
        "Top": 277,
        "Left": 763,
        "Height": 464,
        "WindowState": "wsNormal",
        "Width": 319
    }
}

вот так получается сохранять

StoreFrmToDB
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
procedure TStoreRestore.StoreFrmToDB(form: TUniForm);
Var
 APropsForm: TStrArray;
 i: integer;
 q: TUniSql;
 sOldName: string;
 Builder: TJSONObjectBuilder;
 Writer: TJsonTextWriter;
 StringWriter: TStringWriter;
 StringBuilder: TStringBuilder;
 Pairs, props: TJSONCollectionBuilder.TPairs;
 stream: TStringStream;
begin
  APropsForm := VarArrayOf(['Top', 'Left', 'Height', 'WindowState', 'Width']);// какие свойства сохранять для формы

  q := UniMainModule.CreateUniSql;
  q.Transaction := UniMainModule.CreateWrireTransaction(q);

  sOldName  := form.Name;

  stream    := TStringStream.Create;

  StringBuilder := TStringBuilder.Create;
  StringWriter  := TStringWriter.Create(StringBuilder);
  Writer        := TJsonTextWriter.Create(StringWriter);
  Writer.Formatting := TJsonFormatting.Indented; //делать отступы при форматировании
  Builder       := TJSONObjectBuilder.Create(Writer);

  Pairs := Builder.BeginObject;

  try
    SetStoreQueryParams(q);
    Pairs.Add('ClassName', Form.ClassName);
    Pairs.Add('Name', Form.Name);

    props := Pairs.BeginObject('props');
    for I := 0 to Length(APropsForm) - 1 do
      props.Add(APropsForm[i], GetPropValue(form, APropsForm[i]));


    props.EndObject;
    Pairs.EndObject;

    {$IFDEF DEBUG}
    UniSession.Log(StringBuilder.ToString);
    {$ENDIF}

    SetComponentDescription(Form, q, '');
    stream.WriteString(StringBuilder.ToString);

    Stream.Position := 0;
    q.ParamByName('STREAM').LoadFromStream(Stream, ftBlob);

     try
       q.Execute;
       if q.Transaction.Active then
         q.Transaction.Commit;
     except
       on e:exception do
       begin
         if q.Transaction.Active then q.Transaction.Rollback;
         KvxMessageBox.MessageBox(constError, constMsgFormErrStoresToDB + sLineBreak + e.Message, mtError);
         UniSession.Log(constMsgFormErrStoresToDB + ', ' + Form.Name + sLineBreak + q.FinalSQL +  sLineBreak + e.Message + sLineBreak + constModuleName);
       end;
     end;

  finally
    form.Name := sOldName;
    FreeAndNil(stream);
    FreeAndNil(q);
    FreeAndNil(Builder);
    FreeAndNil(Writer);
    FreeAndNil(StringWriter);
    FreeAndNil(StringBuilder);
  end;
end;

...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021772
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняюсь за возможно глупый вопрос, но

а DFM не подходит разве? (со всеми вытекающими)
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021777
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021778
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
столбцы сетки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
{
    "ID": [
        0,
        60,
        true,
        false
    ],
    "LCD": [
        1,
        88,
        true,
        false
    ],
    "OPER_NAME": [
        2,
        60,
        false,
        false
    ],
    "FULL_TYPE": [
        3,
        117,
        true,
        false
    ],
...
...

GetGridAsJSON
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
function TStoreRestore.GetGridAsJSON(grid: TUniDBGrid): string;
Var
 Builder: TJSONObjectBuilder;
 Writer: TJsonTextWriter;
 StringWriter: TStringWriter;
 StringBuilder: TStringBuilder;
 Pairs, props: TJSONCollectionBuilder.TPairs;
 arr: TJSONCollectionBuilder.TElements;
 i: integer;
begin
  if not Assigned(grid) then
    exit;

  StringBuilder := TStringBuilder.Create;
  StringWriter  := TStringWriter.Create(StringBuilder);
  Writer        := TJsonTextWriter.Create(StringWriter);
  {$IFDEF DEBUG}
  Writer.Formatting := TJsonFormatting.Indented; //делать отступы при форматировании
  {$ENDIF}

  Builder       := TJSONObjectBuilder.Create(Writer);

  Pairs := Builder.BeginObject;

  try
    for I := 0 to pred(grid.Columns.Count) do
    begin
      arr := Pairs.BeginArray(grid.Columns[i].FieldName);
      arr.Add(grid.Columns[i].Index);
      arr.Add(grid.Columns[i].Width);
      arr.Add(grid.Columns[i].Visible);
      arr.Add(grid.Columns[i].Expanded);
      arr.EndArray;
    end;// for


    Pairs.EndObject;

    {$IFDEF DEBUG}
    UniSession.Log(StringBuilder.ToString);
    {$ENDIF}

    result := StringBuilder.ToString;
  finally
    FreeAndNil(Builder);
    FreeAndNil(Writer);
    FreeAndNil(StringWriter);
    FreeAndNil(StringBuilder);
  end;
end;

...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021808
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Yoda
извиняюсь за возможно глупый вопрос, но

а DFM не подходит разве? (со всеми вытекающими)


ТС хочет молодёжно
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021844
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача не сильно сложная, давно бы уж сам наваял
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021848
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Задача не сильно сложная, давно бы уж сам наваял

Задача не сложная для простых свойств.
Когда дело дойдёт до сохранения свойств, которые пишутся в ресурс через DefineProperty, вот тогда придёт осознание, что это тупик.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021858
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж писать такое "модно", то можно через RTTI читать писать те свойства, которые помечены нужным аттрибутом
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021860
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Michael Longneck
Если уж писать такое "модно", то можно через RTTI читать писать те свойства, которые помечены нужным аттрибутом


уже писали ТС про это, но он ниасилил вообще
https://www.clevercomponents.com/articles/article040/
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021866
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator
X11
/Мы в слух/
я удивлен, что у TJSONObject отсутствует метод SaveToStream

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  S : TStringList ;
begin
  S := TStringList.Create ;
  S.Add(JSONObject.ToString);
  S.SaveToFile('json.txt');
end ;


А что так длинно?..
Код: pascal
1.
TFile.WriteAllText('json.txt', JSONObject.ToString);
...
Рейтинг: 0 / 0
25 сообщений из 119, страница 2 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / библиотека для сохранения/восстановления свойств компонент
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]