บูลีนตั้งค่าเป็นจริงเมื่อโปรแกรมเริ่มทำงานโดยที่ฉันไม่ต้องบอก

ใช่แล้ว ฉันต้องการเพิ่มคุณสมบัติการตั้งค่าการบันทึกให้กับโปรแกรมของฉัน ฉันจะทำตามขั้นตอนทั้งหมดของกระบวนการบันทึก/การโหลดทั้งหมดที่ฉันได้ตั้งค่าไว้ตอนนี้ ตามตรรกะแล้ว ให้บันทึกการตั้งค่าทั้งหมดตาม 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 อาจกลายเป็นจริงได้หรือไม่เพราะฉันอยู่ในการกำหนดค่า Debug เมื่อรันโปรแกรม เป็นไปได้ไหมที่จะมีปุ่มสลับเพื่อเปิดใช้งานการบันทึก?

ปุ่มที่สลับ saveStateToggle จริงหรือเท็จ:

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
@Adam ควรเป็นทุกอย่างตั้งแต่ครั้งสุดท้ายที่โปรแกรมบันทึกลงในไฟล์การตั้งค่ายกเว้น 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 แสดงสถานะของบูลีนทุกครั้งที่มีการเปลี่ยนแปลง ฉันไม่รู้ว่าอะไรที่ทำให้มันเป็นเรื่องจริง กล่องข้อความสุดท้ายก่อน 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 เป็นคุณสมบัติและวางเบรกพอยต์บนตัวตั้งค่าเพื่อดู call stack และตำแหน่งที่มันถูกเรียก

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