- •4.1. Объектное представление программы 6
- •4.3. Потоки 7
- •5.Поэтапная разработка программной системы 7
- •1. Задание
- •2.Уточнение задания
- •3. Описание разрабатываемой программы с точки зрения пользователя
- •4.2. События
- •4.3. Потоки
- •5.Поэтапная разработка программной системы
- •5.3.1. Этап 1. Разработка класса Avto
- •5.3.2. Этап 2. Разработка события ev и уведомления
- •5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.
- •5.3.4. Этап 4. Добавление элемента списка, добавление кнопок остановки и удаления.
- •5.3.5. Этап 5. Добавления события ev.
- •11. Приложение 4. Текст программы на языке Java
5.3.4. Этап 4. Добавление элемента списка, добавление кнопок остановки и удаления.
Этот этап предпоследний. Добавим в дочернее окно управляющий элемент-список для выбора нужного номера автомобиля. Добавим кнопку остановки/возобновления перерисовки окна, а также кнопку удаления выбранного в списке автомобиля. Реализация этого этапа представлены в примерах 5.3.4.1, 5.3.4.2 и 5.3.4.3.
Пример 5.3.4.1. Реализация четвертого этапа разработки Avtos–приложения на языке С#.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections;
public delegate void delEv();
public class Avto
{
…
}
class Avtos : Form
{
…
ListBox listBoxNum;//список номеров машин
private Button del, ok;// ссылки на кнопки
public Avtos()//конструктор
{
…
ok = new Button();//создать кнопку приостановки
ok.Text = "Stop";//именовать кнопку
ok.Size = new Size(45, 30);//размеры кнопки
ok.Location = new Point(5, 10);//поместить кнопку в окне
ok.Click += new EventHandler(OK);//подписать обработчик
f.Controls.Add(ok);//поместить объект ок в контейнер окна
listBoxNum = new ListBox();//создать элемент списка номеров
listBoxNum.Location = new Point(140, 10);//разместить в окне
listBoxNum.Size = new Size(60, 70);//установить размер
f.Controls.Add(listBoxNum);//поместить в контейнер окна
del = new Button();//создать кнопку удаления машин
del.Text = "Del";//именовать кнопку
del.Size = new Size(40, 30);//установить размер
del.Location = new Point(90, 10);//поместить кнопку в окне
del.Click += new EventHandler(DEL);//подписать обработчик
f.Controls.Add(del);//поместить объект del в контейнер окна
}
//приостановить или возобновить поток перерисовки
private void OK(Object obj, EventArgs arg)
{
IEnumerator inum = al.GetEnumerator();
while (inum.MoveNext())
{
//перебрать список объектов машин
Avto a = (Avto)inum.Current;
if (run) { a.Suspend(); ok.Text = "Start"; }
else { a.Resume(); ok.Text = "Stop"; }
}
run = !run;
}
//создать автомобиль и включить его в список
public void ADD(Object obj, EventArgs arg)
{
…
listBoxNum.Items.Add(num);
al.Add(b);
IEnumerator inum = al.GetEnumerator();
while (inum.MoveNext())
{
Avto q = (Avto)inum.Current;
q.evSpecial += new delEv(this.HandlerEvSpecial);
}
}
//обработать нажатие кнопки удаления машины
private void DEL(Object o, EventArgs e)
{
if (listBoxNum.SelectedIndex == -1)
{
MessageBox.Show("Выделите номер"
+ "\n удаляемого объекта");
}
else
{
int numSel = (int)listBoxNum.SelectedItem;
listBoxNum.Items.Remove(numSel);//Удалить из списка
IEnumerator inum = al.GetEnumerator();
while (inum.MoveNext())
{
Avto a = (Avto)inum.Current;
if (a.N == numSel)
{//объект с указанным номером найден
a.Finish();//завершить поток
al.Remove(a);//удалить из списка
return;
}
}
}
}
…
}
static void Main()
{
Application.Run(new Avtos());
}
}
Результат:
Пример 5.3.4.2. Реализация четвертого этапа разработки Avtos–приложения на языке C++/CLI.
// kurs.cc.cpp : main project file.
#include "stdafx.h"
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Threading;
using namespace System::Collections;
using namespace System::Drawing;
using namespace System::Windows::Forms;
delegate void delEv();
delegate void Del();
ref class Avto
{
…
};
ref class Avtos : public Form
{
private:
ArrayList ^al; //ссылка на список машин
ListBox ^listBoxNum;//список номеров машин
…
public:
Avtos()
{
…
ok = gcnew Button();
ok->Text = "Stop";
ok->Size = Drawing::Size(45, 30);
ok->Location = Point(5, 10);
ok->Click += gcnew EventHandler(this, &Avtos::OK);
f->Controls->Add(ok);
listBoxNum = gcnew ListBox();
listBoxNum->Location = Point(140, 10);
listBoxNum->Size = Drawing::Size(60, 70);
f->Controls->Add(listBoxNum);
del = gcnew Button();
del->Text = "Del";
del->Size = Drawing::Size(40, 30);
del->Location = Point(90, 10);
del->Click += gcnew EventHandler(this, &Avtos::DEL);
f->Controls->Add(del);
}
private:
void OK(Object ^obj, EventArgs ^arg)
{
IEnumerator ^inum = al->GetEnumerator();
while (inum->MoveNext())
{
Avto ^a = (Avto^)inum->Current;
if (run) { a->Suspend(); ok->Text = "Start"; }
else { a->Resume(); ok->Text = "Stop"; }
}
run = !run;
}
public:
void ADD(Object ^obj, EventArgs ^arg)
{
…
listBoxNum->Items->Add(num);
b->numA = num;
al->Add(b);
IEnumerator ^inum = al->GetEnumerator();
while (inum->MoveNext())
{
Avto ^q = (Avto^)inum->Current;
q->evSpecial += gcnew delEv(this, &Avtos::HandlerEvSpecial);
}
}
private:
void DEL(Object ^o, EventArgs ^e)
{
if (listBoxNum->SelectedIndex == -1)
{
MessageBox::Show("Выделите номер удаляемого объекта");
}
else
{
int numSel = (int)listBoxNum->SelectedItem;
listBoxNum->Items->Remove(numSel);//Удалить из списка
IEnumerator ^inum = al->GetEnumerator();
while (inum->MoveNext())
{
Avto ^a = (Avto^)inum->Current;
if (a->N == numSel)
{//объект с указанным номером найден
a->Finish();//завершить поток
al->Remove(a);//удалить из списка
return;
}
}
}
}
public:
void HandlerEvSpecial()
{
Invalidate();
}
protected:
virtual void OnPaint(PaintEventArgs ^arg) override
{
…
}
}
};
static void main()
{
Application::Run(gcnew Avtos());
}
Результат:
Пример 5.3.4.3. Реализация четвертого этапа разработки Avtos–приложения на языке Java.
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Avto extends Observable implements Runnable
{
…
}
public class Autos extends Frame implements Observer, ActionListener, ItemListener
{
…
private Button ok;
private Choice n;
private Button del;
public Autos()
{
…
ok = new Button("Стоп");
ok.setActionCommand("stop");
ok.addActionListener(this);
f.add(ok);
del = new Button("Del");
del.setActionCommand("DEL");
del.addActionListener(this);
f.add(del);
n = new Choice();
n.addItemListener(this);
f.add(n);
f.setVisible(true);
}
…
//выполнить команды для нажатия кнопок
public void actionPerformed(ActionEvent aE)
{
String str = aE.getActionCommand();
if (str.equals("stop"))
{
if (run)
{
run = false;
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
b.Suspend();
}
ok.setLabel("Старт");
}
else
if (!run)
{
run = true;
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
b.Resume();
}
ok.setLabel("Стоп");
}
}
if (str.equals("ADD"))
{
…
n.addItem(Integer.toString(num));
al.add(b);
}
if (str.equals("DEL") && !al.isEmpty())
{
String st = n.getSelectedItem();
n.remove(st);
int sel = Integer.parseInt(st);
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
if (b.num == sel)
{
b.Finish();
al.remove(n);
}
}
}
repaint();
}
…
public static void main(String[] args)
{
…
}
}
Результат:
