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!')