Логическое значение установлено в true, когда программа запускается без моего ведома.

Итак, я хотел добавить в свою программу функцию сохранения настроек. Я собираюсь пройти все этапы всего процесса сохранения/загрузки, который я настроил прямо сейчас. Так что логично сохранить все настройки в зависимости от bool saveStateToggle при выходе из программы:

private void exitBtn_Click(object sender, EventArgs e)
        {
            if(saveStateToggle == false)
            {
                Application.Exit();
            }
            else
            {
                saveSettings();
                Application.Exit();
                
            }
        }

saveSettings просто так:

private void saveSettings()
        {
            Properties.Settings.Default.onTopToggle = onTopToggle;
            Properties.Settings.Default.saveStateToggle = saveStateToggle;
            Properties.Settings.Default.debugToggle = debugToggle;
            Properties.Settings.Default.min = minTrackbar.Value;
            Properties.Settings.Default.max = maxTrackbar.Value;
            Properties.Settings.Default.Save();
        }

Затем при запуске программы в private void Form1_Load в зависимости от сохраненной ранее настройки:

private void Form1_Load(object sender, EventArgs e)
        {
            if(Properties.Settings.Default.saveStateToggle == true)
            {
                loadSettings();
            }
            else
            {
                loadDefaultSettings();
            }
        }

loadSettings(); – это то же самое, что и saveSettings();, но в зеркальном отображении. Таким образом, если saveSettings(); равно Properties.Settings.Default.saveStateToggle = saveStateToggle;, loadSettings() будет выглядеть так: saveStateToggle = Properties.Settings.Default.saveStateToggle;

При дальнейшей отладке я обнаружил, что saveStateToggle действительно false перед Application.Exit();, но оно таинственным образом превращается в true еще до того, как я вызываю loadSettings(); в private void Form1_Load, когда снова запускаю программу.

Я в полной растерянности. Я все проверил и мне все кажется логичным. Может ли saveStateToggle стать истинным, потому что я нахожусь в конфигурации отладки при запуске программы? Возможно ли вообще иметь переключаемую кнопку для включения сохранения?

Кнопка, которая переключает saveStateToggle true или false:

private void SaveStateToggleBtn_Click(object sender, EventArgs e)
        {
            if (saveStateToggle == false)
            {
                saveStateToggle = true;
                SaveStateToggleBtn.Text = "SAVESTATE: ON";
            }
            else
            {
                saveStateToggle = false;
                SaveStateToggleBtn.Text = "SAVESTATE: OFF";
            }
        }

Логическое значение определено здесь:

        bool saveStateToggle = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)

person Frappy    schedule 20.11.2020    source источник
comment
Что в файле настроек перед перезапуском?   -  person Adam    schedule 20.11.2020
comment
Пожалуйста, ознакомьтесь с минимально воспроизводимым примером при размещении кода. т.е. bool saveStateToggle = true; определение свойства не показано, что затрудняет ответ.   -  person Alexei Levenkov    schedule 20.11.2020
comment
@ Адам, это должно быть все, начиная с последнего сохранения программы в файл настроек, ЗА ИСКЛЮЧЕНИЕМ saveToggleState, что должно быть ложным.   -  person Frappy    schedule 20.11.2020
comment
@AlexeiLevenkov Извините, наверное, я должен был это включить. В любом случае, логическое значение определено выше public Form1(){InitializeComponent();}, которое выше Form1_Load.   -  person Frappy    schedule 20.11.2020
comment
Вы пытались установить точки останова на всех строках, которые изменяют saveToggleState (их не должно быть очень много)? Возможно, существует серия событий, которые непреднамеренно вызывают событие нажатия кнопки для кнопки SaveState, скажем, во время Form_Load? saveToggleState не может таинственным образом стать правдой; что-то будет настроить его на это.   -  person Sean Skelly    schedule 20.11.2020
comment
@SeanSkelly Я заставил MessageBox показывать мне состояние логического значения каждый раз после его изменения. Я понятия не имею, что превращает это в правду. Последний MessageBox прямо перед Application.Exit(); показывает мне, что это действительно false. Но иногда полезно думать с точки зрения пользователя и не переусердствовать. Я понял, что почти никто не будет использовать его.   -  person Frappy    schedule 20.11.2020
comment
Почему бы не использовать отладчик для пошагового выполнения кода? Затем вы можете увидеть состояние членов класса во время выполнения программы.   -  person Rufus L    schedule 20.11.2020
comment
Наиболее очевидная ошибка в этом коде заключается в том, что логическое значение сохраняется и загружается из настройки, но при его загрузке текст кнопки не обновляется. Так что можно подумать, что это не было установлено, но на самом деле это было так.   -  person Hans Passant    schedule 20.11.2020
comment
@HansPassant Я упростил код для этого поста. Также есть setValues();, который обновляет все кнопки, а что нет в соответствии с логическими значениями.   -  person Frappy    schedule 22.11.2020


Ответы (1)


Я думаю, что loadsettings меняет значение. измените saveStateToggle на свойство и установите точку останова в установщике, чтобы увидеть стек вызовов и откуда он вызывается.

private bool _saveStateToggle = false;
public bool SaveStateToggle
{
    get  { return _saveStateToggle;}
    set{ _saveStateToggle = value }
}
person Roussul    schedule 21.11.2020