This.LayoutMdi(MdiLayout.Cascade); //располагать каскадом
}
private void мозаикаГоризонтальбноToolStripMenuItem_Click(object sender, EventArgs e)
{ // горизонтальная мозаика
this.LayoutMdi(MdiLayout.TileHorizontal);
}
private void мозаикаВертикальноToolStripMenuItem_Click(object sender, EventArgs e)
{ // вертикальная мозаика
this.LayoutMdi(MdiLayout.TileVertical);
}
private void закрытьТекущееToolStripMenuItem_Click(object sender, EventArgs e)
{ // закрытие текущего (активного) окна с проверкой, существует ли такое
if (this.ActiveMdiChild != null) ActiveMdiChild.Close();
}
private void закрытьВсеToolStripMenuItem_Click(object sender, EventArgs e)
{ // два варианта закрытия всех подчиненных окон
/* for (int i = MdiChildren.Length - 1; i >= 0; i--)
MdiChildren[i].Close();*/
while (this.ActiveMdiChild != null) ActiveMdiChild.Close();
}
ActiveMdiChild – системная переменная, указатель на активное в данный момент окно.
MdiChildren – массив указателей на подчиненные окна.
Может возникнуть необходимость создания подчиненного окна в единственном экземпляре. Для этого необходимо после его создания заблокировать пункт меню его открытия и разблокировать его при закрытии окна. Для этого используем пункт меню Окна – Единственная форма. Этому пункту меню дадим имя FormA и он должен иметь атрибут доступа public. Создаем таким образом почти пустую форму Form4. в число ее переменных включим сссылку на главное окно: public Form1 f1;
Создание и открытие этого окна:
private void FormA_Click(object sender, EventArgs e)
{
Form4 f4;
f4 = new Form4();
f4.MdiParent = this;
FormA.Enabled = false; //закроем пункт меню
|
|
f4.f1 = this; // передаем адрес главного окна в Form4
f4.Show();
}
При закрытии пункт меню Единственная форма ( его имя FormA) должен быть снова освобожден. Тонкость в следующем: форму можно закрыть несколькими способами: нажатием на командную кнопку, нажатием на кнопку ´, через системное меню и т.д. В любом случае пункт меню должен быть разблокирован. Для этого используем событие, связанное с закрываемым окном:
FormClosed (происходит после закрытия) или FormClosing (происходит до закрытия). В нашем случае можно использовать любое из них. Найдем нужное событие в списке, делаем на его имени двойной щелчок и пишем реализацию:
private void Form4_FormClosed(object sender, FormClosedEventArgs e)
{
f1.FormA.Enabled = true;
}
В MDI-приложениях возможно изменение меню в главном окне при открытии того или иного подчиненного окна. Для этого создаем меню в подчиненном окне. При открытии этого окна оно соединяется с меню главного окна.
Контрольные вопросы
1. Какие диалоговые средства для управления работой программой Вы знаете?
2. Какие способы представления массивов на формах Вы знаете? Какие их преимущества и недостатки?
3. Проанализируйте отличия MDI- и SDI-приложений.
Объектно-ориентированное программирование в Microsoft Visual Studio 2005
|
|
В предыдущих главах мы рассмотрели, как писать программы на C# (по процедурной и по объектно-ориентированной методике), а также создание интерфейса средствами Microsoft Visual Studio 2005. Рассмотрим в этой главе, как объединить в одно целое все изложенное выше: как построить программы для решения прикладных задач и как построить интерфейс для них. Имеются следующие возможности, которые мы по очереди рассмотрим:
1. Дополнить классы форм собственными данными и функциями для решения прикладных задач. Другими словами, объединить в классах интерфейс и логику прикладной задачи.
2. Создать отдельные классы для решения прикладных задач, предусмотрев в их методах (в том числе и в конструкторах) формальные параметры и возвращаемые значения для взаимодействия с интерфейсом. Чтение (запись) данных из интерфейса (в интерфейс) и их передача в методы обеспечивается средствами Visual Studio.
3. Передать в классы прикладных задач указатели на формы (или на компоненты на форме); чтение (запись) данных из форм осуществляется методами классов.
4. В методах классов прикладной задачи предусмотреть открытие форм для ввода/вывода.
Дополнение класса формы средствами решения прикладной задачи
|
|
Пусть задана задача: сколько элементов одномерного массива меньше его среднего арифметического. В классе Form1 имеются объявление данных, а также функции для ее решения. Вызов функций выполняется при нажатии на командные кнопки. Форма для этой задачи представлена на рис. 5.1.
Рис. 5.1
Класс Form1:
namespace Exampl_51
{
public partial class Form1 : Form
{
double[] x; // данные для задачи
int kol;
double SrAr;
public Form1()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
Close();
}
Private void Input()
{ // ввод исходных данных
string[] temp;
string dan;
dan = textBox1.Text;
temp = dan.Split(';');
x = new double[temp.Length];
for (int i = 0; i < x.Length; i++)
x[i] = Convert.ToDouble(temp[i]);
}
Private void Comp_aver()
{ // нахождение среднего арифметического
SrAr = 0;
for (int i = 0; i < x.Length; i++)
SrAr += x[i];
SrAr = SrAr / x.Length;
}
Private void Comp_Count()
{// определение требуемого количества элементов
kol = 0;
for (int i = 0; i < x.Length; i++)
if (x[i] < SrAr) kol++;
}
private void button1_Click(object sender, EventArgs e)
{ // реализация кнопки ввода исходных данных
Input();
|
|
Sred.Enabled = true;
}
private void Sred_Click(object sender, EventArgs e)
{ // реализация кнопки нахождения среднего арифметического
Comp_aver();
KolVo.Enabled = true;
}
private void KolVo_Click(object sender, EventArgs e)
{ //нахождение и вывод количества
Comp_Count();
label3.Text = "" + kol;
}
private void textBox1_Click(object sender, EventArgs e)
{// перевод задачи в исходное состояние
textBox1.Text = "";
Sred.Enabled = false;
KolVo.Enabled = false;
label3.Text = "";
} } }
Первоначально кнопки «Среднее арифметическое» и «Количество» заблокированы, потому что до ввода исходных данных на них нажать нельзя. Щелчок мышью на строке ввода исходных данных переводит программу в исходное состояние.
Создание отдельных классов
Поступим следующим образом. Объявим несколько классов и используем их методы при нажатии командных кнопок на форме. В принципе, можно использовать сколь угодно сложные структуры данных в классах, но мы не будем тратить на это время, потому что вопросы передачи структурированных данных в качестве формальных/фактических параметров функций были подробно рассмотрены выше.
Создавать классы можно двумя способами:
- написать классы самому «с нуля»; не забудьте, что класс формы должен быть впереди собственных классов;
- ставить курсор мыши на имя проекта, нажать на правую клавишу, выбрать из выпадающего меню пункт «Add», далее «Class».
namespace Klassid
{
public class Cl1
{
protected int a1 = 0;
protected double a2 = 3.5;
private Cl3 _Cl3;
public Cl1(int i, double x)
{
a1 = i;
a2 = x;
}
public string opp()
{
_Cl3 = new Cl3("Greeting from Moscow");
return _Cl3.get_c1();
}
public double op2()
{
return (a1*a2);
}
}
public class Cl2 : Cl1
{
public string st1;
public Cl2(int i, double x, string s)
: base(i, x)
{
st1 = s;
}
public string op21()
{
return st1;
}
}
public class Cl3
{
public string c1;
public Cl3(string t)
{
c1 = t;
}
public string get_c1()
{
return c1;
}
}
public class Cl4
{
public int i1;
public Cl4(int k)
{
i1 = k;
}
public int fun2()
{
return i1;
}
}
class Cl5 // обработка массива
{
int[] k;
public Cl5(int[] temp)
{
k = new int[temp.Length];
for (int i = 0; i < temp.Length; i++)
k[i] = temp[i];
}
public int sum_pol()
{
int u=0;
for (int i = 0; i < k.Length; i++)
if (k[i] > 0) u += k[i];
return u;
}
} }
Работа с классами из формы:
namespace Klassid
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Close();
}
private void button2_Click(object sender, EventArgs e)
{// создание объекта класса Cl3
Cl3 pp = new Cl3(textBox1.Text);
textBox2.Text = pp.get_c1();
}
private void button3_Click(object sender, EventArgs e)
{ // работа с классом Cl2
Cl2 q;
string s1;
s1 = textBox1.Text;
q = new Cl2(6, 2.5, s1);
textBox2.Text = q.st1;
}
private void button4_Click(object sender, EventArgs e)
{ // работа с классом Cl2
Cl2 q;
string s1;
int i;
s1 = textBox1.Text;
i=Convert.ToInt32(textBox2.Text);
q=new Cl2(i,2.5,s1);
textBox2.Text=Convert.ToString(q.op21());
}
private void button5_Click(object sender, EventArgs e)
{// работа с классом Cl1, а через него с Cl3
Cl1 f1 = new Cl1(5, 3.7);
textBox1.Text = f1.opp();
}
private void button6_Click(object sender, EventArgs e)
{// обработка массива
string[] z;
string s1;
int[] t;
s1 = textBox1.Text;
z = s1.Split(';');
t=new int[z.Length];
for (int i = 0; i < z.Length; i++)
t[i] = Convert.ToInt32(z[i]);
Cl5 My_Cl = new Cl5(t);
textBox2.Text = "Summa " + My_Cl.sum_pol();
}
} }
Дата добавления: 2018-04-05; просмотров: 384; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!