Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
67 / 40 / 14
Регистрация: 24.02.2013
Сообщений: 250
1

Не удаляется объект из памяти

18.10.2015, 14:55. Показов 1019. Ответов 4
Метки нет (Все метки)

Здравствуйте!
У меня возникла следующая проблема: Мне нужно сделать форму, на которой бы отображались настройки программы. И каждый раз, когда мне надо сменить настройки у меня остаются те же самые настройки, которые я оставил ранее до нажатия кнопки "отмена"(т.е. был выбран CheckBox1, нажал "отмена", запускаю настройки заново, а он опять true, хотя должен был быть false).

В чём может быть дело и как "решить" данный вопрос?

Вот код самой формы:
C#
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
    public partial class SetSettingsForm : Form
    {
        private DialogResult _DialogResult;
 
        private Form1.Settings _NewSettings;
        private Form1.Settings _OldSettings;
 
        private Button _Btn_OK = new Button();
        private Button _Btn_Cancel = new Button();
 
        private CheckBox _ChkBox_ShowProgramm = new CheckBox();
        private CheckBox _ChkBox_UseDefaultWay = new CheckBox();
        private Button _Btn_SetPath = new Button();
        private Label _Lbl_Path = new Label();
        private HScrollBar _SrlBar_FormOpacity = new HScrollBar();
        private Label _Lbl_Apacity = new Label();
        private ComboBox _CmbBox_SetImageFormat = new ComboBox();
        private Label _Lbl_SetImgageFormat = new Label();
 
        public Form1.Settings Get_NewSettings
        {
            get { return this._NewSettings; }
        }
 
        public Form1.Settings Get_OldSettings
        {
            get { return this._OldSettings; }
        }
 
        public SetSettingsForm(Form1.Settings _OldSettings)
        {
            InitializeComponent();
            {
                this._OldSettings = _OldSettings;
                this._NewSettings = _OldSettings;
                this.Text = "Настройка";
                this.BackColor = Color.Black;
                this.Size = new Size(350, 250);
                this.MinimumSize = this.Size;
                this.MaximumSize = this.Size;
                this.StartPosition = FormStartPosition.CenterScreen;
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                this.ControlBox = false;
                {
                    this._ChkBox_ShowProgramm = new CheckBox();
                    {
                        this._ChkBox_ShowProgramm.Text = "Отображать программу на скриншоте";
                        this._ChkBox_ShowProgramm.Checked = this._NewSettings.Get_ShowProgramm;
                        this._ChkBox_ShowProgramm.ForeColor = Color.White;
                        this._ChkBox_ShowProgramm.AutoSize = true;
                        this._ChkBox_ShowProgramm.Left = 5;
                        this._ChkBox_ShowProgramm.Top = 15;
                        this._ChkBox_ShowProgramm.CheckedChanged += this.OnCheckBoxChecked_ShowProgramm;
                        this._ChkBox_ShowProgramm.Checked = this._OldSettings.Get_ShowProgramm;
                    }
                    this.Controls.Add(this._ChkBox_ShowProgramm);
                    this._ChkBox_UseDefaultWay = new CheckBox();
                    {
                        this._ChkBox_UseDefaultWay.Text = "Использовать указанный путь";
                        this._ChkBox_UseDefaultWay.Checked = this._NewSettings.Get_ShowProgramm;
                        this._ChkBox_UseDefaultWay.ForeColor = Color.White;
                        this._ChkBox_UseDefaultWay.AutoSize = true;
                        this._ChkBox_UseDefaultWay.Left = 5;
                        this._ChkBox_UseDefaultWay.Top = this._ChkBox_ShowProgramm.Top + this._ChkBox_ShowProgramm.Size.Height + 5;
                        this._ChkBox_UseDefaultWay.CheckedChanged += this.OnCheckBoxChecked_UseDefaultWay;
                        this._ChkBox_UseDefaultWay.Checked = this._OldSettings.Get_UseDefaultWay;
                    }
                    this.Controls.Add(this._ChkBox_UseDefaultWay);
                    this._Btn_SetPath = new Button();
                    {
                        this._Btn_SetPath.Size = new Size(15, 15);
                        this._Btn_SetPath.BackColor = Color.White;
                        this._Btn_SetPath.Left = 5;
                        this._Btn_SetPath.Top = this._ChkBox_UseDefaultWay.Top + this._ChkBox_UseDefaultWay.Size.Height + 5;
                        this._Btn_SetPath.Click += this.OnButtonClick_SetPath;
                        if (this._ChkBox_UseDefaultWay.Checked)
                        {
                            this._Btn_SetPath.Enabled = true;
                            this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName.ToString());
                            this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay.ToString());
                        }
                        else
                        {
                            this._Btn_SetPath.Enabled = false;
                            this._NewSettings.Set_DefaultWay = "Путь не выбран";
                            this._Lbl_Path.Text = String.Empty;
                        }
                    }
                    this.Controls.Add(this._Btn_SetPath);
                    this._Lbl_Path = new Label();
                    {
                        if (String.Compare(this._NewSettings.Get_DefaultWay.ToString(), String.Empty.ToString()) != 0) this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay.ToString());
                        else this._Lbl_Path.Text = "Путь не задан";
                        this._Lbl_Path.ForeColor = Color.White;
                        this._Lbl_Path.AutoSize = true;
                        this._Lbl_Path.Left = this._Btn_SetPath.Left + this._Btn_SetPath.Size.Width + 5;
                        this._Lbl_Path.Top = this._Btn_SetPath.Top + 2;
                    }
                    this.Controls.Add(this._Lbl_Path);
                    this._Lbl_Apacity = new Label();
                    {
                        this._Lbl_Apacity.Text = String.Format("Прозрачность формы: {0,2}%", (this._NewSettings.Get_OpacityLevel * 100).ToString());
                        this._Lbl_Apacity.AutoSize = true;
                        this._Lbl_Apacity.ForeColor = Color.White;
                        this._Lbl_Apacity.Left = 5;
                        this._Lbl_Apacity.Top = this._Btn_SetPath.Top + this._Btn_SetPath.Size.Height + 5;
                    }
                    this.Controls.Add(this._Lbl_Apacity);
                    this._SrlBar_FormOpacity = new HScrollBar();
                    {
                        this._SrlBar_FormOpacity.Maximum = 109;
                        this._SrlBar_FormOpacity.Minimum = 15;
                        this._SrlBar_FormOpacity.Value = Convert.ToInt32(this._OldSettings.Get_OpacityLevel * 100);
                        this._SrlBar_FormOpacity.Size = new Size(this.ClientSize.Width - 10, 25);
                        this._SrlBar_FormOpacity.Left = 5;
                        this._SrlBar_FormOpacity.Top = this._Lbl_Apacity.Top + this._Lbl_Apacity.Size.Height + 5;
                        this._SrlBar_FormOpacity.ValueChanged += this.OnScrillingBar_SetOpacityLevel;
                    }
                    this.Controls.Add(this._SrlBar_FormOpacity);
                    this._Lbl_SetImgageFormat = new Label();
                    {
                        this._Lbl_SetImgageFormat.Text = "Сохранять скриншоты в формате:";
                        this._Lbl_SetImgageFormat.AutoSize = true;
                        this._Lbl_SetImgageFormat.ForeColor = Color.White;
                        this._Lbl_SetImgageFormat.Left = 5;
                        this._Lbl_SetImgageFormat.Top = this._SrlBar_FormOpacity.Top + this._SrlBar_FormOpacity.Size.Height + 5;
                    }
                    this.Controls.Add(this._Lbl_SetImgageFormat);
 
                    this._CmbBox_SetImageFormat = new ComboBox();
                    {
                        this._CmbBox_SetImageFormat.Size = new Size(this.ClientSize.Width - 10, 25);
                        this._CmbBox_SetImageFormat.Left = 5;
                        this._CmbBox_SetImageFormat.Top = this._Lbl_SetImgageFormat.Top + this._Lbl_SetImgageFormat.Size.Height + 5;
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.jpeg");
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.bmp");
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.png");
                        this._CmbBox_SetImageFormat.Items.Add("Анимация в формате *.gif");
                        this._CmbBox_SetImageFormat.Items.Add("Иконки в формате *.ico");
                        this._CmbBox_SetImageFormat.SelectedIndex = this._OldSettings.Get_ID_ImageFormat;
                        this._CmbBox_SetImageFormat.Text = this._CmbBox_SetImageFormat.Items[this._OldSettings.Get_ID_ImageFormat - 1].ToString();
                        this._CmbBox_SetImageFormat.SelectedIndexChanged += this.OnComboBoxSelectedItemChange_ImageFormat;
                    }
                    this.Controls.Add(this._CmbBox_SetImageFormat);
 
                    this._Btn_OK = new Button();
                    {
                        this._Btn_OK.BackColor = Color.White;
                        this._Btn_OK.Text = "ОК";
                        this._Btn_OK.Size = new Size(50, 25);
                        this._Btn_OK.Left = this.ClientSize.Width - 75 - 5 - this._Btn_OK.Size.Width - 5;
                        this._Btn_OK.Top = this.ClientSize.Height - this._Btn_OK.Size.Height - 5;
                        this._Btn_OK.Click += this.OnButtonClick_OK;
                    }
                    this.Controls.Add(this._Btn_OK);
                    this._Btn_Cancel = new Button();
                    {
                        this._Btn_Cancel.BackColor = Color.White;
                        this._Btn_Cancel.Text = "Отмена";
                        this._Btn_Cancel.Size = new Size(75, 25);
                        this._Btn_Cancel.Left = this.ClientSize.Width - this._Btn_Cancel.Size.Width - 5;
                        this._Btn_Cancel.Top = this.ClientSize.Height - this._Btn_Cancel.Size.Height - 5;
                        this._Btn_Cancel.Click += this.OnButtonClick_Cancel;
                    }
                    this.Controls.Add(this._Btn_Cancel);
                }
            }
            System.GC.Collect();
        }
 
        private void OnCheckBoxChecked_ShowProgramm(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_ShowProgramm = this._ChkBox_ShowProgramm.Checked;
        }
 
        private void OnCheckBoxChecked_UseDefaultWay(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_UseDefaultWay = this._ChkBox_UseDefaultWay.Checked;
            if (this._ChkBox_UseDefaultWay.Checked)
            {                
                this._Btn_SetPath.Enabled = true;
                this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
                this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay);
            }
            else
            {
                this._Btn_SetPath.Enabled = false;
                this._NewSettings.Set_DefaultWay = String.Empty;
            }
        }
 
        private void OnButtonClick_SetPath(Object Sender, EventArgs E)
        {
            FolderBrowserDialog _FolderDialog = new FolderBrowserDialog();
            {
                _FolderDialog.SelectedPath = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
                _FolderDialog.ShowNewFolderButton = true;
            }
            if (_FolderDialog.ShowDialog() != DialogResult.Cancel)
            {
                this._NewSettings.Set_DefaultWay = _FolderDialog.SelectedPath;
                this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay);
            }
        }
 
        private void OnScrillingBar_SetOpacityLevel(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_OpacityLevel = Convert.ToDouble(this._SrlBar_FormOpacity.Value) / 100;
            this._Lbl_Apacity.Text = String.Format("Прозрачность формы: {0,2}%", (this._NewSettings.Get_OpacityLevel * 100));
        }
 
        private void OnComboBoxSelectedItemChange_ImageFormat(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_ID_ImageFormat = this._CmbBox_SetImageFormat.SelectedIndex + 1;
        }
 
        private void OnButtonClick_OK(Object Sender, EventArgs E)
        {
            this._DialogResult = DialogResult.OK;
            this.Close();
        }
 
        private void OnButtonClick_Cancel(Object Sender, EventArgs E)
        {
            this._DialogResult = DialogResult.Cancel;
            this.Close();
        }
 
        public DialogResult _ShowDialog()
        {
            this.ShowDialog();
            return this._DialogResult;
        }
    }
}
Вот код вызова данной формы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            this._Img_Settings.BackgroundImage = new Bitmap(Properties.Resources._5_2);
            this.Refresh();
            System.Threading.Thread.Sleep(125);
            this._Img_Settings.BackgroundImage = new Bitmap(Properties.Resources._5_1);
            this.Refresh();
            System.Threading.Thread.Sleep(125);
            //Вот здесь и начинаются основные действия
            this.Visible = false;
            {
                SetSettingsForm _SetSettingsForm = new SetSettingsForm(this._Settings);//Вот тут я, якобы, создаю "новый объект"
                if (_SetSettingsForm._ShowDialog() != DialogResult.Cancel)
                {
                    this._Settings = _SetSettingsForm.Get_NewSettings;//Ну, это мы уже получаем новые настройки из формы
                    //_SetSettingsForm.Dispose();//Этот метод мне не помог, к стати...
                    System.IO.File.Delete(String.Format("C:\\Users\\{0}\\Documents\\Settins\\Settings.dat", Environment.UserName));
                    this.SaveSettings(this._Settings);
                    this.Opacity = this._Settings.Get_OpacityLevel;
                }
            }
            this.Visible = true;
            System.GC.Collect();//Даже Dispose пробовал-не помогает...
        }
P.S. Я бы мог запустить отладку, но у меня "ругается" на отсутствие файла, мол, "нет загружаемых символов для этого документа"...
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2015, 14:55
Ответы с готовыми решениями:

удаляется ли объект или происходит утечка памяти?
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? ...

Говорит что объект есть, но в коде точно видно что объект удаляется
Добрый день. Вот небольшой пример кода. IF NOT OBJECT_ID('tempdb..#TMP_1') IS NULL DROP TABLE...

Не удаляется объект
Доброго времени суток, в коде я удаляю объект, и сразу же добавляю вместо него другой, но проблема...

Почему удаляется объект?
Помогите, пожалуйста, понять почему удаляется объект и как это исправить? Идея следующая: В...

4
Администратор
Эксперт .NET
13772 / 11160 / 4556
Регистрация: 17.03.2014
Сообщений: 22,503
Записей в блоге: 1
18.10.2015, 15:42 2
Лучший ответ Сообщение было отмечено Jack Wade как решение

Решение

Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
2
3
4
5
public SetSettingsForm(Form1.Settings _OldSettings)
{
    InitializeComponent();
    this._OldSettings = _OldSettings;
    this._NewSettings = _OldSettings;
После этого _OldSettings и _NewSettings указывают на один и тот же объект. Поэтому когда изменение поля внутри _NewSettings приводит к изменению поля внутри _OldSettings. Если тебе нужен новый объект, то создай его копию. Также изучи что такое ссылочные типы.

Цитата Сообщение от Jack Wade Посмотреть сообщение
private Form1.Settings _NewSettings;
Данная строка говорит что тип Settings объявлен внутри класса Form1. При этом он используется в других местах. Вынеси его из Form1 чтобы он был сам по себе.

Цитата Сообщение от Jack Wade Посмотреть сообщение
this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
String.Format("C:\\Users\\{0}\\Documents\\Settins\\Settings. dat", Environment.UserName));
Путь к папке "Рабочий стол" и "Мои документы" надо получать с помощью метода Environment.GetFolderPath и далее строить путь с помощью Path.Combine
C#
1
2
this._NewSettings.Set_DefaultWay = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Path.Combibe(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"Settins\Settings.dat");
Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void OnButtonClick_OK(Object Sender, EventArgs E)
{
this._DialogResult = DialogResult.OK;
this.Close();
}
private void OnButtonClick_Cancel(Object Sender, EventArgs E)
{
this._DialogResult = DialogResult.Cancel;
this.Close();
}
public DialogResult _ShowDialog()
{
this.ShowDialog();
return this._DialogResult;
}
Это плохой код. Удали его и никогда больше так не делай. Вместо этого нужно указать DialogResult у кнопок и назначить AcceptButton и CancelButton у формы. Далее ты будешь вызывать стандартный ShowDialog() и он тебе вернет DialogResult.

Цитата Сообщение от Jack Wade Посмотреть сообщение
//
C#
1
_SetSettingsForm.Dispose();
//Этот метод мне не помог, к стати...
Перед применением метода неплохо понимать для чего он нужен. Dispose() нужен для освобождения неуправляемых ресурсов и он здесь никак не поможет т.к. настоящая проблема в том что ты не понимаешь что такое ссылочный тип.

Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
System.GC.Collect();
//Даже Dispose пробовал-не помогает...
Вызовы GC.Collect() не нужны. Убери их.

P.S. Еще пара моментов так сказать вдогонку.

1. Почему ты не пользуешься дизайнером, а пишешь код создания контролов вручную?

2. У тебя в коде постоянно встречаются пары свойств(?) класса Settings: Get_ShowProgramm/Set_ShowProgramm, Get_UseDefaultWay/Set_UseDefaultWay и т.п. ЗАЧЕМ ЭТО??? Свойства изначально содержат get/set под одной крышей. Соответственно ты можешь писать просто ShowProgramm, UseDefaultWay, OpacityLevel и т.д.

P.P.S Просто удивительно сколько можно напортачить в коротком коде.
1
Эксперт .NET
15343 / 11630 / 3052
Регистрация: 17.09.2011
Сообщений: 19,469
18.10.2015, 16:15 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вместо этого нужно указать DialogResult у кнопок и назначить AcceptButton и CancelButton у формы.
Большой минус такого подхода — автоматически биндятся клавиши Enter и Escape на соответствующий функционал, что очень сильно бесит, если в форме настроек есть текстовое поле с возможностью ввода нескольких строк или какой-нибудь выпадающий список, выбор которого удобно отменять esc'ом.
1
67 / 40 / 14
Регистрация: 24.02.2013
Сообщений: 250
18.10.2015, 17:31  [ТС] 4
OwenGlendower, большое спасибо за ответ!

Написал метод для "клонирования" объекта. Теперь всё работает, как надо.

Собственно, сам метод:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
            public Settings GetCopy()
            {
                return this.MemberwiseClone() as Settings;
            }
0
Эксперт .NET
4959 / 3392 / 1423
Регистрация: 09.05.2015
Сообщений: 8,297
18.10.2015, 17:39 5
А почему вы не используете встроенные в .NET средства для сохранения настроек?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2015, 17:39

Не удаляется объект из списка
у меня есть список: private List<T> List = new List<T>(); где класс Т: public class T :...

Объект удаляется до возвращения его из функции
Есть следующий код перегрузки операции "+" для сложения матриц: Matrix operator+(const Matrix...

Не удаляется объект после уничтожения shared_ptr
Добрый день Не могу понт почему так происходит? class Widget { public: void...

Confirm - при нажатии на cancel объект всё равно удаляется
Всем добрый вечер, Помогите пожалуйста найти решение по такому вопросу: При нажатии на...

Удаляется объект когда не требуется и всё равно продолжает существовать
Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем...

Созданный объект Array<char> удаляется, как только метод convert завершается
Есть простенькая оболочка над массивом Array&lt;T&gt;: template&lt;typename T&gt; class Array { private:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.