Что лучший способ состоит в том, чтобы сериализировать конфигурацию приложения Delphi?

Z-индекс только работает на элементы, которые имеют position: relative;, или position: absolute; относился к ним. Если это не будет проблемой, то мы должны будем видеть страницу в качестве примера, чтобы быть более полезными.

РЕДАКТИРОВАНИЕ: хороший доктор уже поместил самое полное объяснение, но быстрая версия - то, что минимум 0, потому что это не может быть отрицательное число и максимум - хорошо, Вы никогда не должны будете действительно выходить за предел 10 для большинства проектов.

10
задан Argalatyr 20 August 2009 в 00:16
поделиться

7 ответов

Это предлагаемое мной решение.

У меня есть базовый класс

TConfiguration = class
protected
  type
    TCustomSaveMethod = function  (Self : TObject; P : Pointer) : String;
    TCustomLoadMethod = procedure (Self : TObject; const Str : String);
public
  procedure Save (const FileName : String);
  procedure Load (const FileName : String);
end;

Методы загрузки выглядят следующим образом (соответственно метод сохранения):

procedure TConfiguration.Load (const FileName : String);
const
  PropNotFound = '_PROP_NOT_FOUND_';
var
  IniFile : TIniFile;
  Count : Integer;
  List : PPropList;
  TypeName, PropName, InputString, MethodName : String;
  LoadMethod : TCustomLoadMethod;
begin
  IniFile := TIniFile.Create (FileName);
  try
    Count := GetPropList (Self.ClassInfo, tkProperties, nil) ;
    GetMem (List, Count * SizeOf (PPropInfo)) ;
    try
      GetPropList (Self.ClassInfo, tkProperties, List);
      for I := 0 to Count-1 do
        begin
        TypeName  := String (List [I]^.PropType^.Name);
        PropName  := String (List [I]^.Name);
        InputString := IniFile.ReadString ('Options', PropName, PropNotFound);
        if (InputString = PropNotFound) then
          Continue;
        MethodName := 'Load' + TypeName;
        LoadMethod := Self.MethodAddress (MethodName);
        if not Assigned (LoadMethod) then
          raise EConfigLoadError.Create ('No load method for custom type ' + TypeName);
        LoadMethod (Self, InputString);
        end;
    finally
      FreeMem (List, Count * SizeOf (PPropInfo));
    end;
  finally
    FreeAndNil (IniFile);
  end;

Базовый класс может обеспечивать загрузку и сохранение методы для типов по умолчанию delphi. Затем я могу создать такую ​​конфигурацию для своего приложения:

TMyConfiguration = class (TConfiguration)
...
published
  function  SaveTObject (P : Pointer) : String;
  procedure LoadTObject (const Str : String);
published
  property BoolOption : Boolean read FBoolOption write FBoolOption;
  property ObjOption : TObject read FObjOption write FObjOption;
end;

Пример настраиваемого метода сохранения:

function TMyConfiguration.SaveTObject (P : Pointer) : String;
var
  Obj : TObject;
begin
  Obj := TObject (P);
  Result := Obj.ClassName;  // does not make sense; only example;
end;       
7
ответ дан 3 December 2019 в 20:43
поделиться

Я использую XML для всех своих приложений как средство конфигурации. Это:

  • гибкость
  • проверка возможностей будущего
  • легкость чтения с помощью любого средства чтения текста
  • очень простое расширение в приложении. Никаких модификаций классов не требуется

У меня есть библиотека XML, которая позволяет очень легко читать или изменять конфигурацию, даже не обращая внимания на пропущенные значения. Теперь вы также можете сопоставить XML с классом внутри приложения для более быстрого доступа, если проблема заключается в скорости или определенные значения читаются постоянно.

Я считаю, что другие методы настройки гораздо менее необязательны:

  • Ini-файл: нет глубокой структуры , гораздо менее гибкий
  • реестр: просто держитесь от него подальше.
6
ответ дан 3 December 2019 в 20:43
поделиться

Мой предпочтительный метод - создать интерфейс в моем модуле глобальных интерфейсов:

type
  IConfiguration = interface
    ['{95F70366-19D4-4B45-AEB9-8E1B74697AEA}']
    procedure SetConfigValue(const Section, Name,Value:String);
    function GetConfigValue(const Section, Name:string):string;
  end;

Затем этот интерфейс «отображается» в моей основной форме:

type
  tMainForm = class(TForm,IConfiguration)
  ...
  end;

В большинстве случаев фактическая реализация не в основной форме, это просто заполнитель, и я использую ключевое слово реализации, чтобы перенаправить интерфейс на другой объект, принадлежащий основной форме. Дело в том, что ответственность за настройку делегирована. Каждому модулю все равно, хранится ли конфигурация в таблице, ini-файле, xml-файле или даже в реестре. Что это ДЕЙСТВИТЕЛЬНО позволяет мне делать в ЛЮБОМ модуле, который использует модуль глобальных интерфейсов, так это делать вызов, подобный следующему:

var
  Config : IConfiguration;
  Value : string;
begin
  if Supports(Application.MainForm,IConfiguration,Config) then
    value := Config.GetConfiguration('section','name');
  ...      
end;

Все, что необходимо, - это добавить FORMS и мой модуль глобальных интерфейсов к модулю, над которым я работаю. И поскольку он не ИСПОЛЬЗУЕТ основную форму, если я позже решу повторно использовать это для другого проекта, мне не нужно будет вносить никаких дополнительных изменений .... он просто работает, даже если схема хранения конфигурации полностью отличается.

Я обычно предпочитаю создать таблицу (если я имею дело с приложением базы данных) или XML-файлом. Если это многопользовательская база данных, я создам две таблицы. Один для глобальной конфигурации, а другой для пользовательской.

3
ответ дан 3 December 2019 в 20:43
поделиться

По сути, вы запрашиваете решение для сериализации заданного объекта (в вашем случае это конфигурация файлов ini). Для этого есть готовые компоненты, и вы можете поискать здесь и здесь .

1
ответ дан 3 December 2019 в 20:43
поделиться

Некоторое время назад я написал небольшой модуль для той же задачи - для сохранения / загрузки конфигурации приложения в xml-файле.

Проверьте модуль Obj2XML.pas в нашей бесплатной библиотеке SMComponent: http://www.scalabium.com/download/smcmpnt.zip

1
ответ дан 3 December 2019 в 20:43
поделиться

Это будет для Java.

Мне нравится использовать класс java.util.Properties для чтения в файлах конфигурации или файлах свойств. Что мне нравится, так это то, что вы помещаете свой файл со строками так же, как показано выше (ключ = значение). Кроме того, он использует # (знак фунта) для строки, которая является комментарием, как и во многих языках сценариев.

Таким образом, вы можете использовать:

ShowFlags=true
# this line is a comment    
NumFlags=42

и т. Д.

Тогда у вас будет просто код вроде:

Properties props = new Properties();
props.load(new FileInputStream(PROPERTIES_FILENAME));
String value = props.getProperty("ShowFlags");
boolean showFlags = Boolean.parseBoolean(value);

Вот так просто.

0
ответ дан 3 December 2019 в 20:43
поделиться

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

В Delphi простая конфигурация на основе TStrings - простой способ реализовать конфигурацию. Пример:

mail.smtp.host=192.168.10.8    
mail.smtp.user=joe    
mail.smtp.pass=*******
0
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: