#pragma once
#include "Fond.h"
namespace CppLab02 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Collections::Generic;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Сводка для Fasade
///
/// Внимание! При изменении имени этого класса необходимо также изменить
/// свойство имени файла ресурсов ("Resource File Name") для средства компиляции управляемого ресурса,
/// связанного со всеми файлами с расширением .resx, от которых зависит данный класс. В противном случае,
/// конструкторы не смогут правильно работать с локализованными
/// ресурсами, сопоставленными данной форме.
/// </summary>
public ref class Fasade : public System::Windows::Forms::Form
{
private: CppLab02::_Fond^ vFond;
public: Fasade(void)
{
InitializeComponent();
//
//TODO: добавьте код конструктора
//
vFond = gcnew _Fond();
}
protected:
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
~Fasade()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::MenuStrip^ menuStrip1;
protected:
private: System::Windows::Forms::ToolStripMenuItem^ включитьToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ показатьToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ ввестиToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ исключитьToolStripMenuItem;
private: System::Windows::Forms::TextBox^ id;
private: System::Windows::Forms::TextBox^ State;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label2;
private:
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
void InitializeComponent(void)
{
this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
this->включитьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->показатьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->ввестиToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->исключитьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->id = (gcnew System::Windows::Forms::TextBox());
this->State = (gcnew System::Windows::Forms::TextBox());
this->label1 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->menuStrip1->SuspendLayout();
this->SuspendLayout();
//
// menuStrip1
//
this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(4) {this->включитьToolStripMenuItem,
this->показатьToolStripMenuItem, this->ввестиToolStripMenuItem, this->исключитьToolStripMenuItem});
this->menuStrip1->Location = System::Drawing::Point(0, 0);
this->menuStrip1->Name = L"menuStrip1";
this->menuStrip1->Size = System::Drawing::Size(292, 24);
this->menuStrip1->TabIndex = 0;
this->menuStrip1->Text = L"menuStrip1";
//
// включитьToolStripMenuItem
//
this->включитьToolStripMenuItem->Name = L"включитьToolStripMenuItem";
this->включитьToolStripMenuItem->Size = System::Drawing::Size(70, 20);
this->включитьToolStripMenuItem->Text = L"Включить";
this->включитьToolStripMenuItem->Click += gcnew System::EventHandler(this, &Fasade::включитьToolStripMenuItem_Click);
//
// показатьToolStripMenuItem
//
this->показатьToolStripMenuItem->Name = L"показатьToolStripMenuItem";
this->показатьToolStripMenuItem->Size = System::Drawing::Size(67, 20);
this->показатьToolStripMenuItem->Text = L"Показать";
this->показатьToolStripMenuItem->Click += gcnew System::EventHandler(this, &Fasade::показатьToolStripMenuItem_Click);
//
// ввестиToolStripMenuItem
//
this->ввестиToolStripMenuItem->Name = L"ввестиToolStripMenuItem";
this->ввестиToolStripMenuItem->Size = System::Drawing::Size(54, 20);
this->ввестиToolStripMenuItem->Text = L"Ввести";
this->ввестиToolStripMenuItem->Click += gcnew System::EventHandler(this, &Fasade::ввестиToolStripMenuItem_Click);
//
// исключитьToolStripMenuItem
//
this->исключитьToolStripMenuItem->Name = L"исключитьToolStripMenuItem";
this->исключитьToolStripMenuItem->Size = System::Drawing::Size(76, 20);
this->исключитьToolStripMenuItem->Text = L"Исключить";
this->исключитьToolStripMenuItem->Click += gcnew System::EventHandler(this, &Fasade::исключитьToolStripMenuItem_Click);
//
// id
//
this->id->Location = System::Drawing::Point(38, 82);
this->id->Name = L"id";
this->id->Size = System::Drawing::Size(100, 20);
this->id->TabIndex = 1;
//
// State
//
this->State->Location = System::Drawing::Point(40, 135);
this->State->Name = L"State";
this->State->Size = System::Drawing::Size(100, 20);
this->State->TabIndex = 2;
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(35, 66);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(87, 13);
this->label1->TabIndex = 3;
this->label1->Text = L"Идентификатор";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(37, 119);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(61, 13);
this->label2->TabIndex = 4;
this->label2->Text = L"Состояние";
//
// Fasade
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 266);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->Controls->Add(this->State);
this->Controls->Add(this->id);
this->Controls->Add(this->menuStrip1);
this->MainMenuStrip = this->menuStrip1;
this->Name = L"Fasade";
this->Text = L"Работа с фондом";
this->menuStrip1->ResumeLayout(false);
this->menuStrip1->PerformLayout();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void включитьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
vFond->Include(this->State, this->id->Text);
};
private: System::Void показатьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
vFond->Show(this->State, this->id->Text);
};
private: System::Void ввестиToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
vFond->Write(this->State, this->id->Text);
};
private: System::Void исключитьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
vFond->Remove(this->State, this->id->Text);
};
};
}
В этих обработчиках вызываются соответствующие методы класса _Fond в соответствии с диаграммой на рис.8 и 9.
Класс _Fond определён в модуле (файле) Fond.h, листинг которого приведён далее.
#pragma once
#include "Fasade.h"
namespace CppLab02 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections::Generic;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
ref class _Element
{
public: String^ id;
int State;
public: _Element(String^ _id, int _State)
{
id = _id;
State = _State;
};
public: ~_Element(void) {};
};
ref class _Fond //: public System::Windows::Forms::Form
{
static int lid;
_Element ^el;
public: List<_Element^>^ _List;
public: _Fond(void)
{
_List = gcnew List<_Element^>();
};
public: ~_Fond() {};
static bool comp(_Element^ ident)
{
if(ident->State == lid)
{
return true;
}
else
{
return false;
};
};
public: _Element^ Find(int vid)
{
lid = vid;
return _List->Find(gcnew Predicate<_Element^>(comp));
};
public: void Include(TextBox^ sender, String^ _id)
{
_List->Add(gcnew _Element(sender->Text,Convert::ToInt32(_id)));
};
public: void Show(TextBox^ sender, String^ _id)
{
el = Find(Convert::ToInt32(_id));
if (el !=nullptr){sender->Text = el->id;}
else{sender->Text = "-3";};
};
public: void Remove(TextBox^ sender, String^ _id)
{
el = Find(Convert::ToInt32(_id));
if(el !=nullptr){if(!_List->Remove(el))
{sender- >Text = "-3";};}
else{sender->Text = "-3";};
};
public: void Write(TextBox^ sender, String^ _id)
{
el = Find(Convert::ToInt32(_id));
if (el != nullptr){el->id = sender->Text;}
else{sender->Text = "-3";};
};
};
}
В этом же модуле определён класс _Element, для хранения экземпляров которого предназначены экземпляры класса _Fond.
Заслуживает внимания организация поиска в фонде.
В классе _Fond хранимые элементы (экземпляры класса _Element) представлены полем _List. Тип этого поля – параметризованый класс List(T), определённый в среде проектирования. Экземпляры этого класса – списки элементов типа T, в нашем случае – типа _Element.
Метод Find класса _Fond, предназначенный для поиска в списке элементов, использует метод Find класса List(T).Этот метод применяет к каждому элементу списка предикат, полученный им в качестве входного параметра. Этот предикат порождается на основе метода comp класса _Fond.Выполнение предиката фактически состоит в выполнении этого метода comp применительно к элементу, поданному ему на вход, в среде метода Find. Поэтому он использует для сравнения локальную переменную lid, содержащую поисковый признак. Если comp возвращает true, то элемент возращается методом Find, как результат поиска. В противном случае возвращается «нулевой» указатель.
УПРАЖНЕНИЯ
1. Реализовать ключевые элементы реализации, приведённые в п.6.2.4, на языке C# Microsoft Visual Studio 2008 для среды CLR.
2. Реализовать ключевые элементы реализации, приведённые в п.6.2.4, на языке C++ в Microsoft Visual Studio 2008 для среды Win32.
ПРИЛОЖЕНИЕ 1
Синтаксис и семантика класса в языках Object Pascal, C#, C++, Java
Определение типа class.
Type <имя класса> = class [(<имя класса-предка>)]
<компонент класса>
…
<компонент класса>
end;
Класс – тип данных, экземпляр которых называется объектом. Объект – порция данных, имеющая определенную классом структуру и типы значений. Переменная, типом которой является некоторый класс, содержит указатель на эту область.
Иерархия классов.
Компоненты класса
<компонент класса> = :: <поле> | <метод>| <свойство>
<поле> =:: [<атрибут видимости >] <имя поля> : <тип>;
.
Связь между типами class и record.
Поля должны идти до всех остальных компонентов. Доступ к полю
<метод> = :: [<атрибут видимости >]<метод-функция>; [<директивы>] |
[<атрибут видимости >]<метод-процедура>;[<директивы>] |
[<атрибут видимости >]<конструктор> ;[<директивы>] |
[<атрибут видимости >]<деструктор>; [<директивы>]
<директивы> =:: <директива >;<директива>; … <директива>;
<директива> =:: reintroduce | overload | virtual | dynamic | override | register | pascal | cdecl | stdcall | safecall | abstract | message | platform | deprecated | library
<cвойство> = :: [<>]property <имя>:<тип>{[read <имя функции>]
[write<имя процедуры>]}
[stored <Булево значение>]
[default <значение>] | nodefault];
stored и default управляют сохранением публикуемого свойства в модуль .dfm. По умолчанию store true. Default имеет силу только для порядковых значений и значений типа set в диапазоне от 0 до 31. Для строки, вещественного типа и указателей умолчание неявное.
<cвойство> = :: [<>]property <имя>[<индекс>:<тип>]:<тип>{[read <имя функции>]
[write<имя процедуры>]}
[stored <Булево значение>]
[default | nodefault];
<атрибут видимости > =:: private | protected | public | published | automated