Смекни!
smekni.com

Спецификация программы uWert > Текст программы uWert Доказательство корректности программы uWert Организация многооконного интерфейса и диалога в приложениях (стр. 8 из 10)

#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