Смекни!
smekni.com

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

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(292, 273);

this.Controls.Add(this.button1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.Button button1;

}

}

УПРАЖНЕНИЯ

1. Добавьте в форму главное меню и обработайте события от активации его пунктов.

2.3. Приложение Windows Forms в Microsoft Visual Studio 2008 для среды CLR на языке C++

2.4. Приложение Windows Forms в Microsoft Visual Studio 2008 для среды Win32

// CppWin0101.cpp: определяет точку входа для приложения.

//

#include "stdafx.h"

#include "CppWin0101.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:

HINSTANCE hInst; // текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

// Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_CPPWIN0101, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CPPWIN0101));

// Цикл основного сообщения:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int) msg.wParam;

}

//

// ФУНКЦИЯ: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: регистрирует класс окна.

//

// КОММЕНТАРИИ:

//

// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

// был совместим с системами Win32, не имеющими функции RegisterClassEx'

// которая была добавлена в Windows 95. Вызов этой функции важен для того,

// чтобы приложение получило "качественные" мелкие значки и установило связь

// с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CPPWIN0101));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CPPWIN0101);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

// КОММЕНТАРИИ:

//

// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

// создается и выводится на экран главное окно программы.

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

//

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.

//

// WM_COMMAND - обработка меню приложения

// WM_PAINT -Закрасить главное окно

// WM_DESTROY - ввести сообщение о выходе и вернуться.

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: добавьте любой код отрисовки...

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

// Обработчик сообщений для окна "О программе".

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

УПРАЖНЕНИЯ

1. Добавьте в форму главное меню и обработайте события от активации его пунктов.


3. СПИСКИ И ТАБЛИЦЫ

3.1. Прото-СУБД на основе класса TStringList и TStringGrid (библиотека VCL Delphi)

unit Toy;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, Menus;

type

TFToy = class(TForm)

Grid: TStringGrid;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

procedure FormCreate(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure ListToGrid(l, g: integer);

procedure GridToList(g, l: integer);

procedure ShiftUp;

procedure ShiftDown;

procedure LoadGrid;

procedure N4Click(Sender: TObject);

procedure GridKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FToy: TFToy; sList1, sList2: TStringList; curl, curg: integer; vr:TGridRect;

implementation

{$R *.dfm}

uses math;

procedure TFToy.ShiftUp;

var i: integer;

begin

if Grid.RowCount>1then

for i:=2to Grid.RowCount-1 do

begin

Grid.cells[1,i-1]:=Grid.cells[1,i];

Grid.cells[2,i-1]:=Grid.cells[2,i]

end;

if sList1.Count-1=curl

then begin

Grid.cells[1,Grid.RowCount-1]:='';

Grid.cells[2,Grid.RowCount-1]:=''

end

else begin

Grid.cells[1,Grid.RowCount-1]:=sList1[curl+1];

Grid.cells[2,Grid.RowCount-1]:=sList2[curl+1]

end

end;

procedure TFToy.ShiftDown;

var i: integer;

begin

if Grid.RowCount>1

then begin

for i:=Grid.RowCount-2 downto 1 do

begin

Grid.cells[1,i+1]:=Grid.cells[1,i];

Grid.cells[2,i+1]:=Grid.cells[2,i]

end;

Grid.cells[1,i+1]:=sList1[curl-1];

Grid.cells[2,i+1]:=sList2[curl-1]

end

else begin

Grid.cells[1,1]:='';

Grid.cells[2,1]:=''

end

end;

procedure TFToy.GridToList(g, l: integer);

begin

if l>=sList1.Count

then begin

sList1.Add(Grid.cells[1,g]);

sList2.Add(Grid.cells[2,g])

end

else begin

sList1[l]:=Grid.cells[1,g];

sList2[l]:=Grid.cells[2,g]

end

end;

procedure TFToy.ListToGrid(l, g: integer);

begin

Grid.cells[1,g]:=sList1[l];

Grid.cells[2,g]:=sList2[l]

end;

procedure TFToy.LoadGrid;

var i: integer;

begin

if sList1.Count>0

then begin

for i:=1 to min(Grid.RowCount-1, sList1.Count)do

ListToGrid(sList1.Count-min(Grid.RowCount-1, sList1.Count)+i-1,i);

curl:=sList1.Count-1;

curg:=i-1

end

else begin

curl:=0;

curg:=1

end;

Grid.Cells[0,curg]:=' * ';

vr.left:=1;vr.right:=1; vr.Top:=curg; vr.bottom:=curg;

Grid.Selection:=vr

end;

procedure TFToy.FormCreate(Sender: TObject);

begin

sList1:=TStringList.Create;

sList2:=TStringList.Create;

OpenDialog1.Execute;

if not(OpenDialog1.FileName='')

then begin

sList1.LoadFromFile(OpenDialog1.FileName);

sList2.LoadFromFile(copy(OpenDialog1.FileName,1,length(OpenDialog1.FileName)-4)+'1.txt');;

LoadGrid

end

else begin

Grid.Cells[0,1]:=' * ';

curl:=0;

curg:=1

end

end;

procedure TFToy.N3Click(Sender: TObject);

begin

SaveDialog1.Execute;

if SaveDialog1.FileName=''

then showmessage('Имя файла не определено!')

else begin

sList1.SaveToFile(SaveDialog1.FileName);

sList2.SaveToFile(copy(SaveDialog1.FileName,1,length(SaveDialog1.FileName)-4)+'1.txt')

end

end;

procedure TFToy.N4Click(Sender: TObject);

begin

close

end;

procedure TFToy.GridKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if key=vk_Down

then begin

GridToList(curg, curl);

if curg=Grid.RowCount-1

then begin

ShiftUp;

curl:=curl+1

end

else begin

Grid.Cells[0,curg]:='';

curg:=curg+1;

Grid.Cells[0,curg]:=' * ';

curl:=curl+1

end;

vr.left:=1;vr.right:=1; vr.Top:=curg-1; vr.bottom:=curg-1;

Grid.Selection:=vr

end;

if key=vk_Up

then begin

GridToList(curg, curl);

if curg=1

then if curl>0

then begin

ShiftDown;

curl:=curl-1

end

else

else begin

Grid.Cells[0,curg]:='';

curg:=curg-1;

Grid.Cells[0,curg]:=' * ';

curl:=curl-1

end;

vr.left:=1;vr.right:=1; vr.Top:=curg+1; vr.bottom:=curg+1;

Grid.Selection:=vr

end

end;

end.

УПРАЖНЕНИЯ

1. Обеспечьте в прото-СУБД поиск путём явного перебора элементов базы данных.

2. Обеспечьте в прото-СУБД поиск путём использования метода IndexOf.

3. Экспериментально сравните быстродействие вариантов из упражнений 1 и 2.

4. РАЗРАБОТКИ И ВЕРИФИКАЦИЯ РАСЧЁТНЫХ ПРИЛОЖЕНИЙ

4.1. Спецификация программы uWert

Программа uWert является экранным приложением, обеспечивающим вычисле-ние заданного пользователем регулярного арифметического выражения.

Регулярное арифметическое выражение (РАВ) определяется в алфавите L десятичных цифр, знаков операций сложения +, вычитания - и умножения *, а также левой и правой круглой скобок по индукции:

1. Нумерал (здесь последовательность цифр без знака и без пробелов) является РАВ.

2. a) если строка X является РАВ, то строка (X) является РАВ;

b) если строки X и Y являются РАВ, то строки X+Y, X-Y, X*Y являются РАВ.

Нумералы представляют десятичные целые дчисла, результат вычисляется в соответствии с указанными знаками операций в соответствии с правилами обычной десятичной арифметики.

Это приложение имеет простой графический пользовательский интерфейс: окно ввода регулярного арифметического выражения, окно результата и кнопка, нажатие на которую вызывает вычисление.

4.2. Текст программы uWert

Программа отлажена на языке Object Pascal (Borland Delphi). В приведённом ниже тексте тела нескольких процедур перенумерованы для удобства дальнейших ссылок.

Unit uWert;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

eExpression: TEdit;

eValue: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

R = record

va: integer;

sgn: char;

end;

Stack = class(TComponent)

private

ar: array[1..100]of R;

top: integer;

protected

procedure push(vr: R);

function pop: R;

public

constructor create(AOwner: TComponent);

destructor Destroy;

function show(n:integer):R;

property Depth: integer read top;

end;

LetterBefore=(lbNone, lbDig, lbSign, lbLBr, lbRBr);

OperationMode=(omBOS, omNorm, omEOS);

OperandNumber=(onFirst,onSecond);

var

Form1: TForm1;

buf: Stack;

lb: LetterBefore;

implementation

{$R *.dfm}

constructor Stack.create(AOwner: TComponent);

begin

inherited create(AOwner);

top:=0

end;

destructor Stack.Destroy;

begin

inherited destroy

end;

procedure Stack.push(vr: R);

begin

if top<100

then begin

top:=top+1;

ar[top]:=vr

end

else

end;

function Stack.pop: R;

begin

if top>0 then begin

result:=ar[top];

top:=top-1

end

else raise Exception.Create('Stack is empty!')