powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / библиотека для сохранения/восстановления свойств компонент
119 сообщений из 119, показаны все 5 страниц
библиотека для сохранения/восстановления свойств компонент
    #40021468
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по сохранению/восстановлению свойств компонентов. Не хочу изобретать свой лисапет.
Может быть есть что-то готовое бесплатное для более менее современных версий Delphi? Планируется хранить все в базе в blob-поле(ях), с помощью TMemoryStream читать/писать.
Очень желательно через json.
Чтобы указал компоненту, список свойств и этого было достаточно.

Раньше я использовал TcxPropertiesStore из DevExpress, но в один их проектов не вижу смысла тащить DevExpress только ради нескольких процедур/функций.

Пожалуйста, не советуйте Джедаев, Спрингс или еще какой-нибудь фреймворк, не очень хочется тащить в проект или в среду фреймворк ради относительно тривиальной задачи.

Спасибо.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021477
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021479
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так подозреваю, что работает только с ini
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021481
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
я так подозреваю, что работает только с ini

Код: javascript
1.
{"props": "[Label1]\nCaption=Foo...\n"}


:)
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021495
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F1 TReader/TWriter.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021523
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Component Serialization (The DFM Way)

JSON object serializer for Delphi (GNU Lesser General Public License v3.0)
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021540
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Streem.ReadComponent
Streem.WriteComponent
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021630
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
F1 TReader/TWriter.


вроде нет тут возможности сохранять/восстанавливать только конкретно указанные 1-5 свойств
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021631
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Streem.ReadComponent
Streem.WriteComponent

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


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

оно бесплатно? оно в составе библиотеки компонент или отдельно?

Платно, насколько мне известно.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021647
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, не могли бы Вы перечитать ТЗ?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021651
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
JSON object serializer for Delphi (GNU Lesser General Public License v3.0)


к сожалению, справки в комплекте нет :( пример не совсем понятен на первый взгляд
нашел маленькую справку здесь http://xlench.bget.ru/doku.php/delphi/nonvis/json/ser

Если кто-то уже этим пользуется, подскажите, можно ли что-то вроде такого сделать:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
StoreComponentToJSon(Checkbox1, VarArrayOf(['checked']));
StoreComponentToJSon(Form1, VarArrayOf(['Top', 'Left', 'State']));

 // и, соответственно

RestoreComponentFromJSon(Checkbox1, VarArrayOf(['checked']));
RestoreComponentFromJSon(Form1, VarArrayOf(['Top', 'Left', 'State']));
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021654
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

в составе EhLib есть компонент.
TPropStorageEh
Компоненты реализуют технологию сохранения свойств компонент формы в/из хранилища, такого как, например, ini-файл или реестр.

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

У меня uniGUI-приложение и нет смысла там использовать VCL-компоненты/библиотеки.

Я уж не знаю, как и что мне написать, чтобы все поняли, что меня интересует.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021664
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
Кроик Семён
JSON object serializer for Delphi (GNU Lesser General Public License v3.0)


к сожалению, справки в комплекте нет :( пример не совсем понятен на первый взгляд


Что тебе непонятно в официальной справке ?
https://www.clevercomponents.com/articles/article040/

Плюс, в современных дельфях есть модуль такой REST.Json.pas
Там есть, в частности, методы JsonToObject и ObjectToJsonString
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021666
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator
Что тебе непонятно в официальной справке ?


Не понятно, можно ли сохранить/восстановить конкретно указанные свойства или только ВСЕ?
Например, есть форме, мне нужны только 5 свойств, а не все.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021668
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
defecator
Что тебе непонятно в официальной справке ?


Не понятно, можно ли сохранить/восстановить конкретно указанные свойства или только ВСЕ?
Например, есть форме, мне нужны только 5 свойств, а не все.


ты справку ПО МОЕЙ ссылке хорошо прочитал ?
https://www.clevercomponents.com/articles/article040/
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021669
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю, но вижу по коду, что нет возможности указать конкретный список нужных свойств.
Если я не прав, ткните носом.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021670
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или я не могу понять, как оно работает
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021672
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может показать на примере формы и свойств top, left, width, height и state?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021675
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
alekcvp, не могли бы Вы перечитать ТЗ?

Если ты хочешь в точности как в твоём ТЗ, то тебе в "работа".
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021676
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще подсказали DJSON https://github.com/mauriziodm/DJSON
пытаюсь разобраться
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021677
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гораздо проще написать все самому:

1. Весь код 100% твой и строго под конкретную задачу.
2. Ничего лишнего.
3. Не нужно копаться в чужом коде. И тем более платить.
4. Возможно результат будет быстрее, чем подвязать малопонятный и не очень подходящий чужой код.

Я так и сделал. Отдельный небольшой модуль, создающий контролы из метаданных в XML.
Там много важной специфики, которой никогда не будет в стороннем коде, т.е. ее бы пришлось туда мучительно вписать.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021679
AlexeyM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(подозрительная ссылка!) http://priyatna.org/nicesettings.php

License

This library is released under Mozilla Public License. You can use it in your freeware, shareware or commercial softwares. You can send your modification to me, and if I decide to include it in the main distribution, I will add your name as a contributor. You can read full licensing information here.

property StoreTarget: TStoreTarget;
Specifies where to save settings. Currently you have two options: stIniFile saves to an INI file, stRegistry saves to registry under HKEY_CURRENT_USER.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #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
библиотека для сохранения/восстановления свойств компонент
    #40021867
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator
Michael Longneck
Если уж писать такое "модно", то можно через RTTI читать писать те свойства, которые помечены нужным аттрибутом

уже писали ТС про это, но он ниасилил вообще
https://www.clevercomponents.com/articles/article040/

Кстати, этот мне что-то не очень понравился. У Grijjy TgoBsonSerializer помощнее ИМХО.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40021872
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvp
defecator
пропущено...

Код: 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
библиотека для сохранения/восстановления свойств компонент
    #40021873
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvp
defecator
пропущено...

уже писали ТС про это, но он ниасилил вообще
https://www.clevercomponents.com/articles/article040/

Кстати, этот мне что-то не очень понравился. У Grijjy TgoBsonSerializer помощнее ИМХО.


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


Да, уже начал, пытаюсь.
Использую новую Дельфи-библиотеку JSON, которая поставляется, начиная с Seatle.
Информации весьма мало.
Сохранять получилось.
Пытаюсь теперь научиться читать/парсить. Сейчас затык с массивами в TJSONIterator
Не могу понять, как прочитать массив значений.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022000
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Не могу понять, как прочитать массив значений.

Так кидали же уже ссылку с примерами:
Там ниже и для массива есть пример.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022004
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, конечно, я прочитал, но пока не доходит, почему я получаю только первый элемент массива?

Код: 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.
  TextReader  := TStringReader.Create(sJson);
  Reader      := TJsonTextReader.Create(TextReader);
  Iterator    := TJSONIterator.Create(Reader);

  try
    if Iterator.IsUndefined or Iterator.IsNull then
      exit;

    while Iterator.Next do
    begin
      sName := Iterator.Key;
      col := grid.ColumnByName(sName);

      if not Assigned(col) then
        Continue;// не такой колонки


      if Iterator.&Type = TJsonToken.StartArray then
        if Iterator.Recurse then
        begin
          // "colID":[0,55,true,false]
          // "colName":[1,105,true,false]
          while Iterator.Next do
          begin
            sName := Iterator.Key;

          end;
          end;
          Iterator.Return;


        end;



думаю, что ту анонимную процедуру использовать не обязательно, да я хочу попробовать обойтись без неё
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022006
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из справки
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON.Builders.TJSONIterator.Next Next does not:

Enter an array or object item; use Recurse for this purpose.
Return to the parent array; use Return for this purpose.

Next не входит внуть массива; используйте для этого Recurse.
Next не возвращает к родительскому массиву; используйте Return для этого.


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

А сам JSON под кат?..
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022025
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, не понял...
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022026
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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


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

нужно прочитать значения массива и присвоих их столбцам таблицы

здесь я кусок для одного столбца покажу

Код: plaintext
1.
2.
3.
4.
5.
"ID": [
        0,
        60,
        true,
        false
    ]
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022033
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: plaintext
1.
2.
3.
4.
5.
"ID": [
        0,
        60,
        true,
        false
    ]

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

ну... не буду сильно спорить, просто попытаюсь обосновать: я не вижу смысла писать в джейсон названия свойств по той простой причине, что это излишне. Меньше данных гонять между базой и приложением. Особенно, если столбцов много, а у меня их много. Особенно, если на форме таблиц несколько.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022036
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: 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.
const
  JSON =
   ' {"ID": [0, 60, true, false],' +
   ' "LCD": [1, 88, true, false],' +
   ' "OPER_NAME": [2, 60, false, false],' +
   ' "FULL_TYPE": [3, 117, true, false]}';
begin
  var TextReader: TTextReader := TStringReader.Create(JSON);
  var Reader: TJsonReader := TJsonTextReader.Create(TextReader);
  var Iterator: TJSONIterator := TJSONIterator.Create(Reader);
  try
    while Iterator.Next do
    begin
      WriteLn('Element: ', Iterator.Key);
      if not Iterator.Recurse then
        Continue;
      while Iterator.Next do
        WriteLn('Key: ', Iterator.Key, ', Value: ', Reader.Value.ToString);
      Iterator.Return;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

ЧЯДНТ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Element: ID
Key: 0, Value: 0
Key: 1, Value: 60
Key: 2, Value: True
Key: 3, Value: False
Element: LCD
Key: 0, Value: 1
Key: 1, Value: 88
Key: 2, Value: True
Key: 3, Value: False
Element: OPER_NAME
Key: 0, Value: 2
Key: 1, Value: 60
Key: 2, Value: False
Key: 3, Value: False
Element: FULL_TYPE
Key: 0, Value: 3
Key: 1, Value: 117
Key: 2, Value: True
Key: 3, Value: False
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022039
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Код: pascal
1.
 Reader.Value.ToString



да, так получилось
Код: pascal
1.
2.
3.
while Iterator.Next do
            begin
              sName := Reader.Value.ToString;



В статье ни слова про Reader.Value
и в справке тоже не нашел
Неужели разработчикам сложно было написать 3-7 примеров?


alekcvp, спасибо.

Если не секрет, как догадались использовать Reader.Value?
Вроде нигде такого нет в сети.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022041
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
alekcvp
Код: pascal
1.
 Reader.Value.ToString




да, так получилось
Код: pascal
1.
2.
3.
while Iterator.Next do
            begin
              sName := Reader.Value.ToString;




В статье ни слова про Reader.Value
и в справке тоже не нашел
Неужели разработчикам сложно было написать 3-7 примеров?


а в исходниках покопаться слабо ?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022042
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, если знать, что искать
тем более, там исходники, а не примеры применения
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022043
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Если не секрет, как догадались использовать Reader.Value?
Вроде нигде такого нет в сети.

Iterator.AsString() вызывал исключение несовпадения типов, Iterator.ToString() не перекрыт, поэтому я просто посмотрел откуда Iterator.AsString() берёт значение и всё.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022052
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. это проблема в самой библиотеке?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022062
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Т.е. надо изучать инструмент, которым собираешься пользоваться.
Есть, например, Iterator.AsValue = Reader.Value, но мне просто лень было для примера лезть так глубоко.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022064
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, для меня здесь нет никаких ошибок

Код: pascal
1.
2.
3.
4.
function TJSONIterator.GetAsString: String;
begin
  Result := FReader.Value.AsString;
end;



даже если бы я и полез внутрь, я бы увидел здесь вполне нормальный код
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022069
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Есть, например, Iterator.AsValue



Код: pascal
1.
sName := Iterator.AsValue.AsString;



Project raised exception class EInvalidCast with message 'Invalid class typecast'.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022072
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11,

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

Код: pascal
1.
2.
3.
4.
5.
6.
            while Iterator.Next do
            begin
              if Iterator.AsValue.IsType<Integer> then
                sName := Iterator.AsValue.AsInteger.ToString;  //Reader.Value.ToString;

            end;
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022079
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как вместо цикла

alekcvp
Код: pascal
1.
2.
while Iterator.Next do
        WriteLn('Key: ', Iterator.Key, ', Value: ', Reader.Value.ToString);



обратиться к этим 4ём значениям по индексу?

т.е. что-то типа
Код: pascal
1.
2.
3.
a := Iterator.AsValue[0].asInteger;
b := Iterator.AsValue[1].asInteger;
c := Iterator.AsValue[2].asBoolean;



?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022084
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще непонятно, как узнать количество элементов у объекта и у массива
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022088
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
ага, я понял:
Код: pascal
1.
2.
3.
4.
5.
            while Iterator.Next do
            begin
              if Iterator.AsValue.IsType<Integer> then
                sName := Iterator.AsValue.ToString;  //Reader.Value.ToString;
            end;


AsInteger лишний.

X11
а как вместо цикла
обратиться к этим 4ём значениям по индексу?

т.е. что-то типа
Код: pascal
1.
2.
3.
a := Iterator.AsValue[0].asInteger;
b := Iterator.AsValue[1].asInteger;
c := Iterator.AsValue[2].asBoolean;



Ты значение слова Iterate знаешь?
Сохранить в список или массив и потом делать с ними что угодно.

Собственно с твоими запросами, как мне кажется, тебе XSuperObject больше подойдёт.
Там и количество элементов и обращение по индексам...
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022093
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Ты значение слова Iterate знаешь?
Сохранить в список или массив и потом делать с ними что угодно.


удивлен, что за 5 лет авторы библиотеки не удосужились добавить это сами
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022094
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
alekcvp
Ты значение слова Iterate знаешь?
Сохранить в список или массив и потом делать с ними что угодно.

удивлен, что за 5 лет авторы библиотеки не удосужились добавить это сами

Ты сейчас удивляешься, что за 20 лет эксплуатации снегоуборщиков к ним не додумались кузов-самосвал приделать, приходится вторую машину гонять...
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022326
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp

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

Ну тут всё логично, безостановочная уборка, самосвал заполнился, поехал разгружаться, вместо него тут же встал другой.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022328
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Дегтярев Евгений,

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

я понимаю почему, но когда нужно будет добавить/убрать парамтер из массива, с обратной совместимостью будет беда... может она и не нужна, тут хозяин барин.
а по поводу размера:
- json это ниразу не про компактность
- уже есть замеры, показывающие влияние размера json на скорость его получения?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022370
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений
- json это ниразу не про компактность

Ну по сравнению с другими форматами, может и да, но нужно учитывать и удобство, чтобы можно было отладить и подсмотреть, что и где не так, мало того, можно отключить форматирование, ну т.е. что-то среднее можно получить.
Можно, конечно, выдумать что-то свое, или что-то похожее на CSV, минимальное, типа: 0,105,1,0.


Дегтярев Евгений
- уже есть замеры, показывающие влияние размера json на скорость его получения?

замеры я не делал, ни с чем не сравнивал, есть замеры только здесь, в той самой статье
но там замеры на мегабайтных файлах и там 0,3-2 сек, а у меня json одной таблицы - до 2кб.

даже если я послушаюсь твоего совета и массивы заменю на объекты (имя:параметр), то особо ничего и не поменяется ПМСМ.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022691
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, что Iterator.Index у массива начинается с -1 (минус 1) , а не с нуля
Т.е. в джейсон-массиве [0,55,true,false] значение 55 лежит на нулевом индексе

или у меня опять что-то не так с кодом?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        if Iterator.&Type = TJsonToken.StartArray then
          if Iterator.Recurse then// входим внутрь массива
          begin
            s := Iterator.Path;// "ID"

            while Iterator.Next do// цикл по массиву "ID":[0,55,true,false]
            begin
              case Iterator.Index of
                0: begin

                    if Iterator.AsValue.IsType<Integer> then
                      idx := Iterator.AsValue.AsInteger
                    else
                      continue;

                    if grid.Columns.Count-1 >= idx then
                      col.Index  := idx;
                end;// 0



UPD:
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON.Builders.TJSONIterator.Index Index of the current token if it is a value within an array, or -1 if the token is not a value within an array.
Индекс текущего токена, если это значение в массиве, или -1, если токен не является значением в массиве.

ппцц... зачем -1, "если значение в массиве"? что сподвигнуло авторов библиотеки так сделать?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022713
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Индекс текущего токена, если это значение в массиве, или -1, если токен не является значением в массиве.

ппцц... зачем -1, "если значение в массиве"? что сподвигнуло авторов библиотеки так сделать?


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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
// вошли внутрь массива
//цикл по массиву
while Iterator.Next do
            begin
              JsonToken := Iterator.&Type;// здесь тип integer

              case Iterator.Index of// здесь значение индекса = минус 1



почему так?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022742
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
        if Iterator.&Type = TJsonToken.StartArray then
        begin
          idx := Iterator.AsValue.AsInteger;// здесь 0
          idx := Iterator.Index;// здесь минус 1



Из справки:
Index of the current token if it is a value within an array, or -1 if the token is not a value within an array.

Индекс текущего токена, если это значение в массиве, или -1, если токен не является значением в массиве.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022747
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю 2 снимка на одной бряке, где видно, что тип токена - массив, и индекс равен -1.

Индекс текущего токена, если это значение в массиве, или -1, если токен не является значением в массиве.

я не понимаю справки или там действительно баг?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022754
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прастити, делфи не знаю, но имхуется мне что StartArray это скобочка
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022756
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получается, да
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON.Types.TJsonToken StartArray The start of an array [.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022759
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
получается, да
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON.Types.TJsonToken StartArray The start of an array [.

получается, после StartArray нужно вызвать Recurse?

Всё равно после Recurse Iterator.Index равен -1
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022771
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два разных результата одной и той же процедуры, вот код
Код: 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.
procedure TForm1.btnReadArrayClick(Sender: TObject);
const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false]}';

var
 Iterator: TJSONIterator;
 Reader: TJsonTextReader;
 TextReader: TStringReader;
begin

  TextReader  := TStringReader.Create(sJSon);
  Reader      := TJsonTextReader.Create(TextReader);
  Iterator    := TJSONIterator.Create(Reader);

  try
    while Iterator.Next do
    begin
      if Iterator.&Type = TJsonToken.StartArray then
        if Iterator.Recurse then
          while Iterator.Next do
          begin
            Memo1.Lines.Add('Key: ' + Iterator.Key);
            Memo1.Lines.Add('Index:' + Iterator.Index.ToString);
          end;

    end;//while

  finally
    FreeAndNil(TextReader);
    FreeAndNil(Iterator);
    FreeAndNil(Reader);
  end;
end;


Delphi 10.3.3 и Delphi 10.4.1
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022772
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Ну значит в 10.4 как обычно косяк :)
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022782
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvp
X11,

Ну значит в 10.4 как обычно косяк :)


Пользоваться надо проверенными библиотеками, которые не меняют код в зависимости от версии дельфей
А надеяться на то, что в ДНК дельфей что-то не поменяется от версии к версии, в том числе, и в худшую сторону, как-то глупо
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022784
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, вообще, и Дельфи использовать глупо?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022791
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видать придется на XSuperObject переходить.

defecator
А надеяться на то, что в ДНК дельфей что-то не поменяется от версии к версии, в том числе, и в худшую сторону, как-то глупо

Ну тут палка о двух концах.

Дело в том, что было несколько раз так, что я использовал что-то третесторонне, а автор потом переставал поддерживать.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022802
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Собственно с твоими запросами, как мне кажется, тебе XSuperObject больше подойдёт.


всё, сдаюсь

Код: plaintext
{"column1":[0,55,true,false], "column2":[1,60,false,false]}, "column3":[2,177,false,false]}


не могу понять, как правильно сделать двойной цикл по объектам-колонкам и массиву
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022815
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что сегодня за день?
Вот опять.
Почему 2, если в джейсоне 3 объекта?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022830
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
Что сегодня за день?
Вот опять.
Почему 2, если в джейсоне 3 объекта?



Потому что у тебя JSON неправильный.
Куда ты скобки расставил ?

Вот он тебе два объекта и показывает
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022833
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!!!!!

А как сделать итерации?
Примеры посмотрел, но все они привязываются к имени объекта:
Код: pascal
1.
2.
for AMember in X.A['adresses'] do
  begin




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

А как сделать итерации?
Примеры посмотрел, но все они привязываются к имени объекта:
Код: pascal
1.
2.
for AMember in X.A['adresses'] do
  begin



Я ведь не знаю, какие там имена. Наоборот - мне имена нужно получить.

А если сделать просто:
Код: pascal
1.
2.
3.
for AMember in X do
begin
  ...


?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022841
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
procedure TForm1.Button1Click(Sender: TObject);
const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false], "ID3":[2,177,false,false]}';
var
  Arr: ISuperArray;
  myJSON: ISuperObject;
  Enum:  TSuperEnumerator<IJSONPair>;
  JSONPair: IJSONPair;

  OMember: IMember;
  i, n: integer;
begin
  myJSON := SO(sJSon);

  if myJSON.Count > 0 then
  begin
    for I := 0 to pred(myJSON.Count) do
    begin

      for OMember in myJSON do
        if OMember.DataType = dtArray then
          Memo1.Lines.Add(OMember.AsString); // а здесь как

    end;
  end;
end;



ошибок нет, но и в Memo1 строку пустые добавляются, т.е. OMember.AsString возвращает пустоту
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022842
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде начинает доходить

Код: 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.
procedure TForm1.Button1Click(Sender: TObject);
const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false], "ID3":[2,177,false,false]}';
var
  Arr: ISuperArray;
  myJSON: ISuperObject;
  OMember: IMember;
  i: integer;
begin
  myJSON := SO(sJSon);

  if myJSON.Count > 0 then
  begin

      for OMember in myJSON do
        if OMember.DataType = dtArray then
        begin
          arr := OMember.AsArray;
          Memo1.Lines.Add(IntToStr(arr.i[0]));
          Memo1.Lines.Add(IntToStr(arr.i[1]));
          Memo1.Lines.Add(BoolToStr(arr.B[2]));
          Memo1.Lines.Add(BoolToStr(arr.B[3]));
          Memo1.Lines.Add('---');
        end;


  end;

end;
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40022867
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
3.
if myJSON.Count > 0 then
  begin
      for OMember in myJSON do


По-моему if тут лишний.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023022
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, да
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023023
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, x-superobject не развивается :(
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023025
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
кстати, x-superobject не развивается :(

Ну в дельфи вон JSON развивается. Сильно тебе это помогло?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023026
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое впечатление, что в Idera для разработки понанимали каких криворуких типа меня
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023059
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как у XSO проверить наличие того или иного элемента?

Есть какой-то непонятный метод check(), на вход нужно подавать какую-то строку Expr?
это оно?
как им пользоваться?
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023077
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

ну ты совсем уже забронзовел, в исходники не заглянуть? Там всего-то две строчки.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023121
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно заглянул, но не понял
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023132
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

валидация json - строки.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40023136
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит это не то
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40029308
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, не помню советовали тут или нет: ковырял сейчас Turbopack Orpheus - в нём есть такая хрень.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40029309
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но там устанавливается около 120 компонент....
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40029314
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
Но там устанавливается около 120 компонент....

нет проблемы выкусить только то, что нужно
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40029336
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
А как у XSO проверить наличие того или иного элемента?
Тупо проверяй значение на <>null.
...
Рейтинг: 0 / 0
библиотека для сохранения/восстановления свойств компонент
    #40029530
Dm_Ufa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если всю форму хранить? там все намного проще
...
Рейтинг: 0 / 0
119 сообщений из 119, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / библиотека для сохранения/восстановления свойств компонент
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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