Size: a a a

2020 November 23

VA

Viktor Akselrod in Delphi & Lazarus
Kit Bayun
мне нужно сохранять 1-5 некоторых свойств, а не все
если объекты свои - это легко тюнится
источник

DB

Dmitry Belkevich in Delphi & Lazarus
пофильтровать вроде бы можно. насколько я помню. сам пачку отфильтровывал лишних
источник

DB

Dmitry Belkevich in Delphi & Lazarus
я когда-то давно юзал те, которые вместе с EhLib шли
источник

DB

Dmitry Belkevich in Delphi & Lazarus
но жедаевские лучше. вообще - стоит поискать, их насколько я знаю есть несколько разных
источник

DB

Dmitry Belkevich in Delphi & Lazarus
источник

RS

Renat Suleymanov in Delphi & Lazarus
Kit Bayun
Вопрос по сохранению/восстановлению свойств компонентов.  Не хочется изобретать свой лисапет.
Кто-нибудь знает что-то готовое бесплатное для более менее современных версий Delphi? Планируется хранить все в базе в blob-поле(ях), с помощью TMemoryStream читать/писать.
Очень желательно через json.
Чтобы указал компоненту, список свойств и этого было достаточно.
Раньше я использовал TcxPropertiesStore из DevExpress, но один их проектов не вижу смысла тащить  DevExpress только ради нескольких процедур/функций.
Спасибо.
А че просто не использовать rtti тогда? Нативно это наверняка можно, раз в Лазаре можно, то и в дельфи. У Дельфи rtti развит лучше
источник

RS

Renat Suleymanov in Delphi & Lazarus
Согласен, что ради стриминга из компонентов и обратно смысла нет тащить тяжеловесные либы, раз можно нативно
источник

KB

Kit Bayun in Delphi & Lazarus
Renat Suleymanov
А че просто не использовать rtti тогда? Нативно это наверняка можно, раз в Лазаре можно, то и в дельфи. У Дельфи rtti развит лучше
Не хочу свой лисапет писать. Но, видать, придется 😪
источник

RS

Renat Suleymanov in Delphi & Lazarus
Kit Bayun
Не хочу свой лисапет писать. Но, видать, придется 😪
Я могу кинуть тебе пример на FPC. Наверняка можно и в Дельфи найти аналог. Не сторонние либы
источник

RS

Renat Suleymanov in Delphi & Lazarus
Переслано от Renat Suleymanov
Короче, вот в Лазарусе так можно прочитать JSON настройки из файла в твой объект

procedure LoadFromJSON(AObject: TObject; const AFileName: String);
var
 ADeStreamer: TJSONDeStreamer;
 AJSON: TStringList;
begin
 if not FileExists(AFileName) then
   Exit;
 ADeStreamer:=TJSONDeStreamer.Create(nil);
 try
   AJSON:=TStringList.Create;
   try
     AJSON.LoadFromFile(AFileName);
     ADeStreamer.JSONToObject(AJSON.Text, AObject);
   finally
     AJSON.Free;
   end;
 finally
   ADeStreamer.Free;
 end;
end;
источник

RS

Renat Suleymanov in Delphi & Lazarus
procedure SaveToJSON(AObject: TObject; const AFileName: String);
var
 AStreamer: TJSONStreamer;
 AJSON: TStringList;
 AJSONObject: TJSONObject;
begin
 AStreamer:=TJSONStreamer.Create(nil);
 AJSON:=TStringList.Create;
 try
   AJSONObject:=AStreamer.ObjectToJSON(AObject);
   try
     AJSON.Text:=AJSONObject.FormatJSON();
     AJSON.SaveToFile(AFileName);
   finally
     AJSONObject.Free;
   end;
 finally
   AJSON.Free;
   AStreamer.Free;
 end;
end;
источник

RS

Renat Suleymanov in Delphi & Lazarus
Можно было еще проще как-то. Мне тут советовали. Но найти не смог.
источник

RS

Renat Suleymanov in Delphi & Lazarus
В твоем случае, просто ADeStreamer.JSONToObject(AJSONString, AObject); из первого примера и AJSONString:=AJSONObject.FormatJSON(); из второго
источник

RS

Renat Suleymanov in Delphi & Lazarus
У меня вопрос. Кто-то тут работал с ОРМ dOPF? Как можно установить в null значение определенного поля? Вроде задача простая, но слету не придумал красиво. Придумал только такой хак

function TORM.SetNullTgUserID(aUserID: Int64): Boolean;
var
 aUSR: TTB_USRObject;
 aNulls: Boolean;
begin
 aUSR:=TTB_USRObject.Create;
 try
   aUSR.USER_ID:=aUserID;
   if not opTB_USR.Find(aUSR, 'USER_ID = :USER_ID') then
     Exit(False);
   aUSR.USER_ID:=0;      // dNullInt64 = 0;
   aNulls:=opTB_USR.Nulls;  // So that some values are treated as Null
   try
      { opTB_USR is TopTB_USR =  specialize TdGDBEntityOpf<TTB_USRObject>;  }
     opTB_USR.Table.IgnoredFields.CommaText:='LOGIN_NAME,PASSWD,ENABLED,ID_EMP,USER_ROLE';
     opTB_USR.Nulls:=True;
     opTB_USR.Modify(aUSR);
   finally
     opTB_USR.Nulls:=aNulls;
     opTB_USR.Table.IgnoredFields.CommaText:=EmptyStr;
   end;
   opTB_USR.Apply;
 finally
   aUSR.Free;
 end;
 Result:=True;  
end;
Я присваиваю IgnoredFields список для избежания функции 0=null, чтобы это работало только для нужного поля USER_ID. Есть более красивый способ?
источник

AS

Alexey Shumkin in Delphi & Lazarus
Renat Suleymanov
У меня вопрос. Кто-то тут работал с ОРМ dOPF? Как можно установить в null значение определенного поля? Вроде задача простая, но слету не придумал красиво. Придумал только такой хак

function TORM.SetNullTgUserID(aUserID: Int64): Boolean;
var
 aUSR: TTB_USRObject;
 aNulls: Boolean;
begin
 aUSR:=TTB_USRObject.Create;
 try
   aUSR.USER_ID:=aUserID;
   if not opTB_USR.Find(aUSR, 'USER_ID = :USER_ID') then
     Exit(False);
   aUSR.USER_ID:=0;      // dNullInt64 = 0;
   aNulls:=opTB_USR.Nulls;  // So that some values are treated as Null
   try
      { opTB_USR is TopTB_USR =  specialize TdGDBEntityOpf<TTB_USRObject>;  }
     opTB_USR.Table.IgnoredFields.CommaText:='LOGIN_NAME,PASSWD,ENABLED,ID_EMP,USER_ROLE';
     opTB_USR.Nulls:=True;
     opTB_USR.Modify(aUSR);
   finally
     opTB_USR.Nulls:=aNulls;
     opTB_USR.Table.IgnoredFields.CommaText:=EmptyStr;
   end;
   opTB_USR.Apply;
 finally
   aUSR.Free;
 end;
 Result:=True;  
end;
Я присваиваю IgnoredFields список для избежания функции 0=null, чтобы это работало только для нужного поля USER_ID. Есть более красивый способ?
нету(?) атрибутов в лазарусе...
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexey Shumkin
нету(?) атрибутов в лазарусе...
Да что-то там появилось. А чем это может помочь в данном конкретном случае?
источник

RS

Renat Suleymanov in Delphi & Lazarus
Renat Suleymanov
У меня вопрос. Кто-то тут работал с ОРМ dOPF? Как можно установить в null значение определенного поля? Вроде задача простая, но слету не придумал красиво. Придумал только такой хак

function TORM.SetNullTgUserID(aUserID: Int64): Boolean;
var
 aUSR: TTB_USRObject;
 aNulls: Boolean;
begin
 aUSR:=TTB_USRObject.Create;
 try
   aUSR.USER_ID:=aUserID;
   if not opTB_USR.Find(aUSR, 'USER_ID = :USER_ID') then
     Exit(False);
   aUSR.USER_ID:=0;      // dNullInt64 = 0;
   aNulls:=opTB_USR.Nulls;  // So that some values are treated as Null
   try
      { opTB_USR is TopTB_USR =  specialize TdGDBEntityOpf<TTB_USRObject>;  }
     opTB_USR.Table.IgnoredFields.CommaText:='LOGIN_NAME,PASSWD,ENABLED,ID_EMP,USER_ROLE';
     opTB_USR.Nulls:=True;
     opTB_USR.Modify(aUSR);
   finally
     opTB_USR.Nulls:=aNulls;
     opTB_USR.Table.IgnoredFields.CommaText:=EmptyStr;
   end;
   opTB_USR.Apply;
 finally
   aUSR.Free;
 end;
 Result:=True;  
end;
Я присваиваю IgnoredFields список для избежания функции 0=null, чтобы это работало только для нужного поля USER_ID. Есть более красивый способ?
Ну и понятно, что я могу сделать еще проще сделав тупо SQL запрос... Но просто хотелось это сделать через ОРМ
источник

AS

Alexey Shumkin in Delphi & Lazarus
Renat Suleymanov
Да что-то там появилось. А чем это может помочь в данном конкретном случае?
Я присваиваю IgnoredFields список для избежания функции 0=null
ignoredFields - это что? что-то стандартное в dOPF?
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexey Shumkin
Я присваиваю IgnoredFields список для избежания функции 0=null
ignoredFields - это что? что-то стандартное в dOPF?
Ну вот в dOPF если присвоить свойству Nulls наследников TdGOpf некие значения (для разных типов по разному), то они предполагаются как null.
К примеру,
const
 dNullParam: string = 'null';
 dNullStr: string = '';
 dNullChar: Char = #0;
 dNullInt: Integer = 0;
 dNullInt64: Int64 = 0;  
и т.д.
В таком случае, при использовании процедуры, к примеру, Modify,  скажем для полей Int, если значение 0, то предполагается, что это null и т.д. Это если установлено свойство Nulls. Свойство работает для всего объекта и всех его published свойств. Ну а мне захотелось это применить для одного конкретного поля, чтобы обнулить/очистить его типа. По другим полям, мне не нужно, чтобы вместо нулевых значений записывался бы null
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexey Shumkin
Я присваиваю IgnoredFields список для избежания функции 0=null
ignoredFields - это что? что-то стандартное в dOPF?
Ну а IgnoredFields это стандартное свойство для всех наследников датасетов в dOPF. Если добавить в этот список какое-нибудь published свойство объекта Entity, то оно будет игнорироваться при записи или чтении запросов в БД
источник