powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подскажите идею, как сохранять настроки в базе.
21 сообщений из 21, страница 1 из 1
Подскажите идею, как сохранять настроки в базе.
    #38173759
Vitaliy Os
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте, как лучше всего сохранять настройки в базе.
Имеется ввиду, сохранения кучи разных параметров разных типов.
Не хотелось бы сильно наворачивать.
Данные могут быть разных типов: integer, real, stream, string. Все в потоках хранить не хочется - много кода.
Пока по вижу создание таблицы в базе:
id, UserId, ParamName, ValueInt, ValueFloat, ValueString, ValueStream.
Да, буду пустые поля. Но зато удобно.
Уверен, что не самый оптимальный вариант.
Спасибо!
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173788
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для BLOB колонок (stream) я бы отдельную таблицу сделал.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173813
Vitaliy Os
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я так сказал, к примеру, что первое в голову пришло. Хотя, пользователей не так уже и много, да и параметров тоже (относительно). Поэтому, думаю, можно в одной таблице все держать.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173837
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку искать по настройкам никто не будет, пакуй их всех в XML, полученный XML
сохраняй в BLOB.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173884
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vitaliy OsПосоветуйте, как лучше всего сохранять настройки в базе.
Имеется ввиду, сохранения кучи разных параметров разных типов.
Не хотелось бы сильно наворачивать.
Данные могут быть разных типов: integer, real, stream, string. Все в потоках хранить не хочется - много кода.
Пока по вижу создание таблицы в базе:
id, UserId, ParamName, ValueInt, ValueFloat, ValueString, ValueStream.
Да, буду пустые поля. Но зато удобно.
Уверен, что не самый оптимальный вариант.
Спасибо!
А зачем в базе? Общие настройки для всех подключенных пользователей?
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173891
Vitaliy Os
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про XML интересная идея... Правда, еще не работал с ним. Недостаток - иногда нужно подчищать настройки не все сразу. Но, наверное, можно их подчищать пока они загружены в програму... Надо еще подумать.

Настройки у каждого пользоватлея свои. Несколько пользователей могут работать за одним компьютером. Могут ходить от одного, к другому. Нужно переносить настройки.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173914
Фотография 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.
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.
...

type TRecOptions = record// для массива параметров
  nam: string;
  val: string;
  Def: variant;
end;

Type TArrOptions = array of TRecOptions;// массив параметров

....

Var
 ArrOptions: TArrOptions;

....

implementation
.....

procedure MyStringToStream(const AString: string; out AStream: TStream);
begin
  AStream := TStringStream.Create(AString);
end;

function MyStreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;


procedure SaveParamsAllUsers();
var
 JSONObject: TJSONObject;
 Stream: TStream;
 i: smallint;
begin
  if Length(ArrOptions) <= 0 then exit;//если массив пуст, то сохранять нечего
  JSONObject := TJSONObject.Create;
  Stream := TMemoryStream.Create;
  try
    //добавляем пару ("имя":"значение")

    for I := 0 to High(ArrOptions) do
      JSONObject.AddPair(ArrOptions[i].nam, ArrOptions[i].val);
    with dm.qOptions do
    begin
      Close;
      DeleteWhere;
      AddWhere('ParamName = ' + QuotedStr('SettingsAllUsers'));//добавляем условие, что нам нужен массив параметров SettingsAllUsers из таблицы
      Open;

      if RecordCount > 0 then
        Edit
      else
        Append;//если первый раз настройки сохраняем, то добавляем запись

      MyStringToStream(JSONObject.ToString, Stream);
      Stream.Position := 0;
      FieldByName('ParamName').AsString := 'SettingsAllUsers';
      TBLOBField(FieldByName('ParamVal')).LoadFromStream(Stream);
      post;
    end;// with

  finally
    FreeAndNil(JSONObject);
    FreeAndNil(Stream);
  end;
end;

procedure LoadParamsAllUsers();
var
 JSONObject: TJSONObject;
 Stream: TStream;
 s: string;
 i: smallint;
begin
  if not DM.connPremier.Connected then exit;

  JSONObject := TJSONObject.Create;
  Stream := TMemoryStream.Create;
  with dm.qOptions do
  try
    //добавляем пару ("имя":"значение")

    Close;
    DeleteWhere;
    AddWhere('ParamName = ' + QuotedStr('SettingsAllUsers'));// нам нужен какой-то определенный масив настроек, например, для окна fmEdit и т.п.
    Open;

    if RecordCount <= 0 then exit;

    Stream.CopyFrom(CreateBlobStream(dm.qOptionsParamVal, bmRead), 0);
    Stream.Position := 0;
    s := MyStreamToString(Stream);

    JSONObject :=  TJSONObject(TJSONObject.ParseJSONValue(s));//парсим
    if JSONObject.Size <= 0 then exit;

    SetLength(ArrOptions, JSONObject.Size);
    for I := 0 to High(ArrOptions) do
      begin // записываем параметры в массив параметров
        ArrOptions[i].nam := JSONObject.Get(i).JsonString.Value;;
        ArrOptions[i].val := JSONObject.Get(i).JsonValue.Value;
      end;

  finally
    FreeAndNil(JSONObject);
    FreeAndNil(Stream);
    dm.qOptions.close;
  end;
end;




потом, в процессе работы, если нужно узнать значение какого-либо параметра или сохранить значение какого-либо параметра
Код: 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.
Function GetAllUsersParamS(const ParamName: string): string;
Var
 i: smallint;
begin
//передаем имя параметра, а получаем значение параметра
  for I := 0 to High(ArrOptions) do
    if AnsiUpperCase(ArrOptions[i].nam) = AnsiUpperCase(ParamName) then
    begin
      result:= ArrOptions[i].val;
      Break;
    end;
end;

procedure SetAllUsersParamS(const ParamName, ParamVal: string);
Var
 i: smallint;
begin
//передаем имя параметра и значение параметра, которое нужно запись будет в базу
  for I := 0 to High(ArrOptions) do
    if AnsiUpperCase(ArrOptions[i].nam) = AnsiUpperCase(ParamName) then
    begin
      ArrOptions[i].val := ParamVal;
      exit;
    end;

//если нужного параметра нет, то добавляем в массив новый (потом он автоматически будет сохранён)
  SetLength(ArrOptions, length(ArrOptions) + 1);
  ArrOptions[length(ArrOptions) - 1].val := ParamVal;
  ArrOptions[length(ArrOptions) - 1].nam := ParamName;
end;




В таблице Options есть одна запись, в которой хранятся все эти настройки (в остальных записях могут храниться другие насройки)


структура таблицы простая
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173930
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vitaliy Os...
Данные могут быть разных типов: integer, real, stream, string. Все в потоках хранить не хочется - много кода.
Пока по вижу создание таблицы в базе:
...ValueInt, ValueFloat, ValueString, ValueStream.
...
Я тоже так делал.
Потом пришел к выводу, что вполне достаточно Value "как строка". Хранили же мы данные в .ini файлах, и ничего - выжили.
Понадобится какой-нибудь "поток" - поле blob добавить можно. Потом. Не раньше, чем понадобиться.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173934
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и благодаря девовским компонентам TcxPropertiesStore можно вот так сохранять/загружать настройки форм, компонентов
Код: 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.
procedure PropertiesStore(DoStore: boolean; form: TForm; AComponent: TComponent; const AProps: TStrArray);
Var
 i:integer;
 cxPropertiesStore1: TcxPropertiesStore;
 myBlob: TBlobStream;
begin
  if UserData.id = '' then exit;//

  cxPropertiesStore1 := TcxPropertiesStore.Create(Application);
  try
   cxPropertiesStore1.StorageType := stStream;

    with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
      begin
        Component := AComponent;
        for I := 0 to Length(AProps) - 1 do Properties.Add(AProps[i]);
      end;//with

    with dm do
    begin
      if uOptionsUsers.Active then uOptionsUsers.Close;
      uOptionsUsers.DeleteWhere;
      uOptionsUsers.AddWhere('id_user = :id_user');
      uOptionsUsers.AddWhere('ParamName = :ParamName');
      uOptionsUsers.AddWhere('FormName = :FormName');

      uOptionsUsers.ParamByName('id_user').Value   := UserData.id;
      uOptionsUsers.ParamByName('ParamName').Value := AComponent.Name;
      uOptionsUsers.ParamByName('FormName').Value  := Form.Name;
      uOptionsUsers.Open;

       if DoStore then
        begin
          //сохраняем настройки в поток
          if uOptionsUsers.RecordCount <= 0 then
            uOptionsUsers.Append//если ещё ни разу не сохраняли настроки, то создаем новую запись
          else
            uOptionsUsers.edit;//редактируем

            uOptionsUsers.FieldByName('id_user').Value   := UserData.id;
            uOptionsUsers.FieldByName('ParamName').Value := AComponent.Name;
            uOptionsUsers.FieldByName('FormName').Value  := Form.Name;

            myBlob := TBlobStream.Create(uOptionsUsersParamVal, bmReadWrite);
            cxPropertiesStore1.StorageStream := myBlob;
            cxPropertiesStore1.StorageStream.Position := 0;
            TBlobField(uOptionsUsers.FieldByName('ParamVal')).LoadFromStream(cxPropertiesStore1.StorageStream);
            cxPropertiesStore1.StoreTo;
            uOptionsUsers.Post;
        end
      else
        begin
          //читаем настройки из потока
          if uOptionsUsers.RecordCount > 0 then
          begin
            cxPropertiesStore1.StorageStream := uOptionsUsers.CreateBlobStream(uOptionsUsersParamVal, bmRead);
            cxPropertiesStore1.StorageStream.Position := 0;
            cxPropertiesStore1.RestoreFrom;
          end;
        end;//else

    end;//with
  finally
    if Assigned(myBlob) then
      myBlob.Free;

    DM.uOptionsUsers.close;
    FreeAndNil(cxPropertiesStore1);
  end;
end;


procedure PropertiesStoreCxGrid(DoStore: boolean; form: TForm; dbg: TcxCustomGridTableView);
Var
 myBlob: TBlobStream;
begin
  if UserData.id = '' then exit;

  if not dm.connPremier.Connected then exit;
  try

    with dm do
    begin
      if uOptionsUsers.Active then uOptionsUsers.Close;
      uOptionsUsers.DeleteWhere;
      uOptionsUsers.AddWhere('id_user = :id_user');
      uOptionsUsers.AddWhere('ParamName = :ParamName');
      uOptionsUsers.AddWhere('FormName = :FormName');

      uOptionsUsers.ParamByName('id_user').Value   := UserData.id;
      uOptionsUsers.ParamByName('ParamName').Value := dbg.Name;
      uOptionsUsers.ParamByName('FormName').Value  := Form.Name;
      uOptionsUsers.Open;

      if DoStore then
        begin
          //сохраняем настройки в поток
          if uOptionsUsers.RecordCount <= 0 then
            uOptionsUsers.Append//если ещё ни разу не сохраняли настроки, то создаем новую запись
          else
            uOptionsUsers.edit;//редактируем

            uOptionsUsers.FieldByName('id_user').Value   := UserData.id;
            uOptionsUsers.FieldByName('ParamName').Value := dbg.Name;
            uOptionsUsers.FieldByName('FormName').Value  := Form.Name;

            myBlob := TBlobStream.Create(uOptionsUsersParamVal, bmReadWrite);
            myBlob.Position := 0;
            TBlobField(uOptionsUsers.FieldByName('ParamVal')).LoadFromStream(myBlob);
            dbg.StoreToStream(myBlob);
            uOptionsUsers.Post;
        end
      else
        begin
          //читаем настройки из потока
          if uOptionsUsers.RecordCount > 0 then
            dbg.RestoreFromStream(uOptionsUsers.CreateBlobStream(uOptionsUsersParamVal, bmRead));

        end;

    end;//with
  finally
    if Assigned(myBlob) then
      FreeAndNil(myBlob);

    DM.uOptionsUsers.close;
  end;
end;



использование
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// сохранение или чтение настроек - первый параметр (True/False)
  Screen.Cursor := crHourGlass;
  PropertiesStore(True, self, self, VarArrayOf(['Top', 'left', 'height', 'WindowState', 'width']));
  PropertiesStore(True, self, cxTabControl1, VarArrayOf(['Properties.TabIndex']));
  PropertiesStore(True, self, cxGroupBox1, VarArrayOf(['height']));
  PropertiesStore(True, self, cxGrid3, VarArrayOf(['width']));
  PropertiesStoreCxGrid(True, self, dbgAds);
  PropertiesStoreCxGrid(True, self, dbgStat);
  PropertiesStoreCxGrid(True, self, dbgDatas);
  Screen.Cursor := crDefault;
end;
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38173963
Vitaliy Os
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, большое спасибо! Очень много интересного готового кода. Буду изучать. Кстати, я как-то забыл про возможность сохранять поток в строку.

По поводу ини файла - тоже класная идея. Выходит, по сути, можно, действительно все в строках держать!

Ща буду кодить... )

Всем спасибо!
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38174477
Марат Сафин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой класс IniFiles.TCustomIniFile там достаточно перекрыть несколько абстрактных методов и пожалуйста работайте с настройками как будто это ini файл, хотя сохраняться всё будет в базе. IniFiles вообще полезный модуль, там есть классы которые можно использовать для работы, в не зависимости где сохраняются настройки.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38174496
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше вместо ini использовать MemIni :)
Особенно, если много настроек.

и ещё в тему:
http://www.transl-gunsmoker.ru/2010/05/ini.html
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #38174609
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Ну и благодаря девовским компонентам TcxPropertiesStore можно вот так сохранять/загружать настройки форм, компонентов

Подобная штука, но бесплатно, была в RxLib
Её развитие с поддержкой DB (но не знаю в каком виде. TDataSet наверное) http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvAppDBStorage
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Подскажите идею, как сохранять настроки в базе.
    #40090502
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не могу понять, в чем проблема с TcxPropertiesStore + cxPageControl.
Не восстанавливается активная вкладка при показе окна.

свойство указываю так:
'Properties.ActivePage'

Код: pascal
1.
2.
3.
4.
5.
//сохранить в базу onClose
PropertiesStore(bDoStore, self, cxPageControl1, VarArrayOf(['Properties.ActivePage']));

//восстановить из базы onShow
PropertiesStore(bDoRestore, self, cxPageControl1, VarArrayOf(['Properties.ActivePage']));




sources
Код: 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.
procedure TStorageKvx.StorePropertiesToDB(const Form: TForm; const AComponent: TComponent; const AProps: TStrArray);
Var
 cxPropertiesStore1: TcxPropertiesStore;
 q: TpFibQuery;
 stream: TMemoryStream;
begin
  if not DM.fibDB.TestConnected then exit;
  if not Assigned(AComponent) then exit;

  q := dm.CreateFibQuery;
  cxPropertiesStore1 := TcxPropertiesStore.Create(Application);
  stream := TMemoryStream.Create;
  try
    SetStoreQueryParams(q);
    q.SQL.Text := constStoreSQL;
    cxPropertiesStore1.StorageName := Form.ClassName;
    cxPropertiesStore1.StorageType := stStream;

    with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
    begin
      Component := AComponent;
      for var I := low(AProps) to High(AProps) do
        Properties.Add(AProps[i]);
    end;//with

    cxPropertiesStore1.StorageStream := Stream;
    cxPropertiesStore1.StoreTo;

    //параметры сравнения: окно + компонента
    q.ParamByName('FORM').AsString    := cxPropertiesStore1.StorageName;
    q.ParamByName('CNAME').AsString   := AComponent.Name;
    q.ParamByName('CAPTION').AsString := GetFrmCaption(Form);

    if AComponent is TControl then
      SetControlDescr(TControl(AComponent), q);// описание и индекс икноки

    if AComponent is TContainedAction then
      SetActionDescr(TContainedAction(AComponent), q);// описание и индекс икноки

     Stream.Position := 0;
     q.ParamByName('STREAM').LoadFromStream(Stream);
     try
       if not q.Transaction.Active then q.Transaction.StartTransaction;
       q.ExecQuery;
       if q.Transaction.InTransaction then q.Transaction.Commit;
     except
       on e:exception do
       begin
         if q.Transaction.InTransaction then q.Transaction.Rollback;
         KvxMessageBox(constMsgFormErrStoresToDB + sLineBreak + e.Message, constError, MB_OK+MB_ICONERROR);
         SendException(constMsgFormDesignerErrStoresToDB + ', ' + AComponent.Name + sLineBreak + q.ReadySQLText, e, constModuleName);
       end;
     end;

  finally
    FreeAndNil(stream);
    FreeAndNil(cxPropertiesStore1);
    FreeAndNil(q);
  end;
end;


procedure TStorageKvx.RestorePropertiesFromDB(const Form: TForm; const AComponent: TComponent; const AProps: TStrArray);
Var
 cxPropertiesStore1: TcxPropertiesStore;
 q: TpFibQuery;
 stream: TMemoryStream;
begin
  if not DM.fibDB.TestConnected then exit;
  q := dm.CreateFibQuery;
  q.Transaction := dm.fibDB.DefaultTransaction;
  cxPropertiesStore1 := TcxPropertiesStore.Create(Application);
  stream := TMemoryStream.Create;
  try
    q.SQL.Text := constRestoreSQL;

    cxPropertiesStore1.StorageName := Form.ClassName;
    cxPropertiesStore1.StorageType := stStream;

    with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
    begin
      Component := AComponent;
      for var I := low(AProps) to High(AProps) do
        Properties.Add(AProps[i]);
    end;//with

    try
      if not q.Transaction.Active then q.Transaction.StartTransaction;
      q.ParamByName('FORM').AsString  := cxPropertiesStore1.StorageName;
      q.ParamByName('CNAME').AsString := AComponent.Name;
      q.ExecQuery;
      q.FieldByName('STREAM').SaveToStream(stream);

      if stream.Size > 0 then
      begin
        stream.Position := 0;
        cxPropertiesStore1.StorageStream := Stream;
        cxPropertiesStore1.RestoreFrom;
      end;

    except
      on e:exception do
      begin
        if q.Transaction.InTransaction then q.Transaction.Rollback;
        KvxMessageBox('Restore error: ' + sLineBreak + e.Message, constError, MB_OK+MB_ICONERROR);
        SendException('Restore error ' + ', ' + AComponent.Name + sLineBreak + q.ReadySQLText, e, constModuleName);
      end;
    end;

  finally
    FreeAndNil(stream);
    FreeAndNil(cxPropertiesStore1);
    FreeAndNil(q);
  end;
end;




в базу данные записываются и потом читаются, и stream не пустой (проверил отладчиком).
или просто TcxPropertiesStore не понимает вложенные свойства? но ведь в blob записывает их, и читает, и ошибок не выдает.
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #40090566
Hammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
А почитать справку или source не судьба?
Чтение и сохранение вложенных свойств требует сначала добавить "parent" свойство, а затем к нему подчиненное
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #40091799
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hammer,

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

Вроде все русским языком написал
Почитай наконец souorce: cxStorage, cxPropertiesStore ну и cxPropertiesStoreEditor наконец

Properties у TcxPageControl у нас что? Правильно - класс. А уж ActivePage свойство этого класса.
Ну а дальше думаю сам разберёшься
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #40096277
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hammer,

так для сохранения нужен не класс, а TComponent - cxPropertiesStore1.Components.Add


Код: pascal
1.
2.
3.
4.
5.
6.
with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
    begin
      Component := AComponent;
      for var I := low(AProps) to High(AProps) do
        Properties.Add(AProps[i]);
    end;//with
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #40096365
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Поскольку искать по настройкам никто не будет, пакуй их всех в XML, полученный XML
сохраняй в BLOB.

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

За героическим созданием трудностей - к пионерам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите идею, как сохранять настроки в базе.
    #40096377
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

softwarerпросто потому, что её переименовали

За героическим созданием трудностей - к пионерам.

Да-да. Как только метод садится в лужу - сразу же "это никогда не понадобится". Стадия отрицания. Следующей стадией будет торг - "Да и если понадобится, не так сложно сделать".
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подскажите идею, как сохранять настроки в базе.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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