Настройки собственных приложений под nanoCAD в условиях Linux
Понадобилось мне тут в собственных аддонах под наник собственные же настройки хранить (ну там - какая галочка должна быть нажата, какая опция выбрана и теде. Казалось бы - в параметрах приложения выставить название параметра, его тип и храни что душе угодно. AddonName.Properties.Settings.Default.ParameterName в зубы и вперед.
Угу, ага, губозакатывательную машинку не забудьте завернуть.
Не, под виндой все работает штатно, а вот под Astra - уже фигушки. Ну не работает там такая конструкция, хоть тресни. Пришлось делать собственный вариант хранения настроек. Поскольку наник (по крайней мере 23 и 23.1 все равно работают с реестром, даже в винде), для хранения данных использовал именно его.
Все настройки скидывать в одну ветку мне показалось ну так себе затеей, так что в первом приближении получается примерно следующее:
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 | using Microsoft.Win32; using System.IO; namespace AddonName { internal static class AppSettings { private static void SetValue(string Key, string SubKey, string Value) { string path = Path.Combine(_regHive, Key); RegistryKey hive = Registry.CurrentUser.OpenSubKey(path, true); if (hive == null) { hive = Registry.CurrentUser.CreateSubKey(path, true); } hive.SetValue(SubKey, Value); hive.Close(); } private static string GetValue(string Key, string SubKey, string DefaultValue = null) { string path = Path.Combine(_regHive, Key); RegistryKey hive = Registry.CurrentUser.OpenSubKey(path); if (hive == null) { hive = Registry.CurrentUser.CreateSubKey(path); } string res = hive.GetValue(SubKey)?.ToString() ?? string.Empty; hive.Close(); return res; } private static readonly string _regHive = @"SOFTWARE\kpblc\nanoCAD"; private static readonly string _startupDialogSubKey = "StartupDialog"; } } |
Можно, конечно, обойтись без статического класса. Или использовать хранение в файле. Но мне и так "зашло". Теперь представим себе, что в стартовом диалоге есть пара настроек: "Проверять обновления" (CheckForUpdates) и "Показывать при старте" (ShowOnStartup). Как оно будет обрабатываться в основном приложении - фиолетово в данный момент, но хранение я сделаю
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 | using Microsoft.Win32; using System.IO; namespace AddonName { internal static class AppSettings { /// <summary> Проверять обновления при старте </summary> public static bool CheckForUpdates { get { string value = GetValue(_startupDialogSubKey, nameof(CheckForUpdates)); if (bool.TryParse(value, out bool result)) { return result; } return true; } set { SetValue(_startupDialogSubKey, nameof(CheckForUpdates), value.ToString()); } } /// <summary> Показ стартового диалога при начале работы </summary> public static bool ShowOnStartup { get { string value = GetValue(_startupDialogSubKey, nameof(ShowOnStartup)); if (bool.TryParse(value, out bool result)) { return result; } return true; } set { SetValue(_startupDialogSubKey, nameof(ShowOnStartup), value.ToString()); } } private static void SetValue(string Key, string SubKey, string Value) { string path = Path.Combine(_regHive, Key); RegistryKey hive = Registry.CurrentUser.OpenSubKey(path, true); if (hive == null) { hive = Registry.CurrentUser.CreateSubKey(path, true); } hive.SetValue(SubKey, Value); hive.Close(); } private static string GetValue(string Key, string SubKey, string DefaultValue = null) { string path = Path.Combine(_regHive, Key); RegistryKey hive = Registry.CurrentUser.OpenSubKey(path); if (hive == null) { hive = Registry.CurrentUser.CreateSubKey(path); } string res = hive.GetValue(SubKey)?.ToString() ?? string.Empty; hive.Close(); return res; } private static readonly string _regHive = @"SOFTWARE\kpblc\nanoCAD"; private static readonly string _startupDialogSubKey = "StartupDialog"; private static readonly string _deepPurgeSubKey = "Purge"; } } |
Ну и использование уже мало чем будет отличаться от стандартного механизма:
1 2 3 4 5 6 7 8 9 | public class SomeClass { public SomeClass() { // Предварительные танцы с бубнами bool show = AppSettings.ShowOnStartup; // Дальнейшая логика } } |
На всякий случай напоминаю - сайт в 99.(9)% тупо шпаргалка для себя. Возможно, через сколько-то времени я буду на все это смотреть и думать: "Че ж я курил, что такое нарисовал?!"