50499

Создание типизованных файлов с использование элементов управления Edit, Button, GroupBox, RadioButton, CheckBox, ListBox

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы Приобретение навыков работы с типизованными файлами использование в работе элементов управления Edit Button GroupBox RdioButton CheckBox ListBox и других для создания форм. Методические указания по самостоятельной работе студентов Типизованный файл это последовательность данных одинакового типа которая предназначена для долгосрочного хранения на внешних носителях. В C создание типизованных файлов осуществляется путём записи в файл блоков информации одинаковой длины.

Русский

2014-01-24

72 KB

5 чел.

2 СОЗДАНИЕ И АНАЛИЗ ТИПИЗОВАННЫХ ФАЙЛОВ С

ИСПОЛЬЗОВАНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

Edit, Button, GroupBox, RadioButton, CheckBox, ListBox

2.1 Цель работы

Приобретение навыков работы с типизованными файлами, использование в работе элементов управления Edit, Button, GroupBox, RadioButton, CheckBox, ListBox и других для создания форм.

2.2 Методические указания по самостоятельной работе студентов

Типизованный файл – это последовательность данных одинакового типа, которая предназначена для долгосрочного хранения на внешних носителях. В C++ создание типизованных файлов осуществляется путём записи в файл блоков информации одинаковой длины. Каждый блок представляет собой переменную или массив данного типа. При работе с файлами нужно пользоваться такими функциями:

fopen (name, flags) – открывает или создаёт (в зависимости от flags) файл по имени name и возвращает указатель на этот файл;

fclose (f) – закрывает файл;

fread (buf, leng, type_size, f) – читает в buf из файла f последовательность данных одинакового типа, длина которой равна leng, а размер типа в байтах равен type_size; buf – это адрес переменной данного типа или массив этого типа; размер типа можно получить так: type_size = sizeof(MY_TYPE);

fwrite (buf, count, type_size, f) – записывает в файл f из buf последовательность данных одинакового типа;

fseek (f, offset, from) – перемещает указатель файла;

ftell (f) – возвращает текущую позицию указателя файла;

ВНИМАНИЕ! Для использования этих функций нужно включить в ваш проект файл заголовка stdio.h (#include <stdio.h>).

Во время выполнения лабораторной работы могут понадобиться следующие элементы управления:

Edit – текстовый редактор; может быть настроен для однострокового или многострокового режимов;

Static Text для изображения статического текста;

Button – кнопки для управления программой;

List Box – изображает список строк;

Group Box, Radio Button, Check Box – для изменения переменных булевого типа.

Для начала работы выберите меню File->New. На вкладке Projects выберите MFC AppWizard (exe), введите название проекта и нажмите OK. Выберите Dialog based и нажмите кнопку Finish. В появившемся диалоговом окне нажмите OK. После этого будут автоматически созданы файлы, необходимые вашему проекту. Появится форма, на которой вы можете разместить элементы управления.

Пример 1.

Сформировать файл из данных про товары экспорта. Он включает: название товара, страну, которая импортирует товар, и количество товара. Найти для заданной страны все товары, которые она импортирует.

// Project1Dlg.h

#if !defined(AFX_PROJECT1DLG_H__D4301FB0_E267_4899_995D_90DE074112D1__INCLUDED_)

#define AFX_PROJECT1DLG_H__D4301FB0_E267_4899_995D_90DE074112D1__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif

struct RECORD

{

char Name[30];

char Country[30];

long Count;

};

/////////////////////////////////////////////////////////////////////////////

class CProject1Dlg : public CDialog

{

public:

CProject1Dlg(CWnd* pParent = NULL);

//{{AFX_DATA(CProject1Dlg)

enum { IDD = IDD_PROJECT1_DIALOG };

//}}AFX_DATA

//{{AFX_VIRTUAL(CProject1Dlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

 //}}AFX_VIRTUAL

protected:

HICON m_hIcon;

//{{AFX_MSG(CProject1Dlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnAdd();

afx_msg void OnGet();

afx_msg void OnExit();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

#endif

// Project1Dlg.cpp

#include "stdafx.h"

#include "Project1.h"

#include "Project1Dlg.h"

#include <stdio.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

CProject1Dlg::CProject1Dlg(CWnd* pParent)

: CDialog(CProject1Dlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CProject1Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CProject1Dlg, CDialog)

//{{AFX_MSG_MAP(CProject1Dlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDB_ADD, OnAdd)

ON_BN_CLICKED(IDB_GET, OnGet)

ON_BN_CLICKED(IDB_EXIT, OnExit)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

BOOL CProject1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

 CString strAboutMenu;

 strAboutMenu.LoadString(IDS_ABOUTBOX);

 if (!strAboutMenu.IsEmpty())

 {

  pSysMenu->AppendMenu(MF_SEPARATOR);

  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

 }

}

SetIcon(m_hIcon, TRUE);

SetIcon(m_hIcon, FALSE);

return TRUE;

}

void CProject1Dlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

 CAboutDlg dlgAbout;

 dlgAbout.DoModal();

}

else

{

 CDialog::OnSysCommand(nID, lParam);

}

}

void CProject1Dlg::OnPaint()

{

if (IsIconic())

{

 CPaintDC dc(this);

 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

 int cxIcon = GetSystemMetrics(SM_CXICON);

 int cyIcon = GetSystemMetrics(SM_CYICON);

 CRect rect;

 GetClientRect(&rect);

 int x = (rect.Width() - cxIcon + 1) / 2;

 int y = (rect.Height() - cyIcon + 1) / 2;

 dc.DrawIcon(x, y, m_hIcon);

}

else

{

 CDialog::OnPaint();

}

}

HCURSOR CProject1Dlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CProject1Dlg::OnAdd()

{

RECORD rec = {0};

FILE* f = 0;

GetDlgItemText(IDE_NAME, rec.Name, 30);

GetDlgItemText(IDE_COUNTRY, rec.Country, 30);

rec.Count = GetDlgItemInt(IDE_COUNT);

f = fopen("data.dat", "a");

fwrite(&rec, sizeof(RECORD), 1, f);

fclose(f);

}

void CProject1Dlg::OnGet()

{

FILE* f = 0;

long size = 0;

RECORD* rec = 0;

CEdit* edit = 0;

CListBox* listbox = 0;

CString S;

edit = (CEdit*) GetDlgItem(IDE_SEARCH);

listbox = (CListBox*) GetDlgItem(IDC_LIST);

edit->GetWindowText(S);

f = fopen("data.dat", "r");

if (f == 0)

{

 MessageBox("Файл не найден");

 return;

}

fseek(f, 0, SEEK_END);

size = ftell(f)/sizeof(RECORD);

rec = new RECORD[size];

fseek(f, 0, SEEK_SET);

fread(rec, sizeof(RECORD), size, f);

fclose(f);

listbox->ResetContent();

for (int i = 0; i < size; i++)

{

 if (S == rec[i].Country)

  listbox->AddString(rec[i].Name);

}

delete [] rec;

}

void CProject1Dlg::OnExit()

{

DestroyWindow();

}

Здесь приведены только файлы проекта, которые были изменены, остальные содержат стандартный код, добавленный VC++.

Главная форма программы изображена на рисунке 2.1.

Рис. 2.1 Форма проекта

В файле заголовка определена структура RECORD. Поле name – это название продукта, country – страна, которая его импортирует, count – количество. Текст на форме («Название товара», «Страна», «Количество», «Список товаров») был сделан с помощью Static Text. Для ввода страны, количества, товара и запроса использованы элементы управления Edit. Список, где выводится результат запроса, сделан с помощью List Box. Все кнопки сделаны с помощью Button. Чтобы получить доступ к форме,  нужно перейти на вкладку редактора ресурсов (ResourceView), развернуть узлы Resources и Dialog, и сделать двойной щелчок на названии нужной формы. Элементы управления находятся на панели Controls.

Для того, чтобы изменить свойства элемента управления или формы, нужно щелкнуть на нём правой кнопкой мыши и выбрать в появившемся меню пункт Properties, или выбрать элемент и выбрать подменю View->Properties. Появится диалог с несколькими вкладками. На вкладке General можно изменить ID объекта (например, для Button оно по умолчанию IDC_BUTTON). Идентификаторы редакторов для названия товара, страны, количества и запроса изменены системой на IDE_NAME, IDE_COUNTRY, IDE_COUNT и IDE_SEARCH соответственно; ID списка – IDC_LIST; ID для кнопок «Добавить текст», «Запрос» и «Выход» - IDB_ADD, IDB_GET, IDB_EXIT.

В свойствах редактора для ввода количества товара, на вкладке Styles, было выбрано свойство Number. Это сделано для того, чтобы пользователь мог вводить только цифры. Для нормального отображения кириллицы в редакторе ресурсов щёлкните правой кнопкой на названии вашего диалога и выберите Properties. В появившемся диалоге из списка Language выберите Russian. Свойство Caption отвечает за текст, изображаемый на объекте.

Теперь перейдём к обработке событий. Нам понадобится обработать нажатия кнопок. Для этого нажмите Ctrl+W или выберите View->Class Wizard. Перейдите на вкладку Message Map. В списке Object IDs расположены идентификаторы объектов, а в списке Messages возможные события. Если уже есть обработчик события, то оно выделено жирным шрифтом. Чтобы добавить обработчик, выберите ID нужного объекта и название нужного события, затем нажмите кнопку Add Function. Появится окно, где можно ввести название функции. Нажмите OK. Нажатие кнопки Edit Code переведёт вас в редактор кода на место новой функции, где можно ввести нужный программный код.

В программе-примере функция CProject1Dlg::OnAdd() обрабатывает нажатие кнопки «Добавить запись», CProject1Dlg::OnGet() обрабатывает нажатие кнопки «Сделать запрос», CProject1Dlg::OnExit() обрабатывает нажатие кнопки «Выход».

Чтобы закрыть программу, по нажатию кнопки «Выход» вызывается функция DestroyWindow(). При нажатии кнопки «Добавить запись», в файл добавляется новая запись, состоящая из значений полей ввода. В функцию fopen передаётся флаг “a”. Это означает, что мы хотим добавить запись в конец файла. Если файл не существует, он будет создан. После нажатия кнопки «Сделать запрос» программа открывает файл и ищет все записи, в которых поле Country соответствует значению поля ввода где пользователь ввёл интересующую его страну. Все найденные товары добавляются в список. Для этого файл открывается с флагом “r”, что означает открытие файла только для чтения. Если файл не найден, функция fopen возвращает ноль, и в этом случае выводится сообщение, что файл не найден (функция ShowMessage()). Для того, чтобы узнать размер файла, можно перевести указатель файла в конец файла и использовать функцию ftell.

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

CWnd* GetDlgItem(int ID) – возвращает объект с указанным идентификатором.

Пример:

CEdit* edit = (CEdit*) GetDlgItem(IDC_EDIT1);

void GetDlgItemText(int ID, char* Text, int MaxLength)записывает в массив Text текст объекта с указанным ID. MaxLength – длинна массива.

Пример:

char text[20];

GetDlgItemText(IDC_EDIT1, text, 20);

int GetDlgItemInt(int ID) – возвращает числовое значение текста.

Пример:

int x = GetDlgItemInt(IDC_EDIT1);

void SetDlgItemText(int ID, char* Text)устанавливает текст объекта.

Пример:

char text[] = “my button”;

SetDlgItemText(IDC_BUTTON1, text);

void SetDlgItemInt(int ID, int Value) – устанавливает текст объекта в значение, переданное через аргумент Value.

Пример:

SetDlgItemInt(IDC_EDIT1, 100);

UINT IsDlgButtonChecked(int ID) – если Radio Button или Check Box помечен галочкой, то возвращает BST_CHECKED, в противоположном случае возвращает BST_UNCHECKED.

Пример:

int x = IsDlgButtonChecked(IDC_CHECKBOX1);

if (x == BST_CHECKED){/*делаем что-то*/}

void CheckDlgButton(int ID, UINT Checked) – помечает галочкой Radio Button или Check Box, в соответствии с значением Checked.

Пример: (убирает флажок с Radio Button)

CheckDlgButton(IDC_RADIOBUTTON1, BST_UNCHECKED);

Аналогичные функции есть у классов CEdit, CButton, CStatic и вообще у всех классов, унаследованных от класса CWnd.

Метод ResetContent() класса CListBox очищает содержимое списка, а метод AddString(char* S) добавляет строку в список.

2.3 Контрольные вопросы и задания

  1.  Каким образом можно изменить свойства указанного элемента управления?
  2.  Назовите особенности Radio Button и Check Box.
  3.  Назовите особенности использования типизованных файлов.
  4.  Для чего нужен элемент управления List Box.

2.4 Варианты индивидуальных заданий

1. Задан файл, элементами которого являются записи. Состав записи: название ЕОМ, языки программирования, цена. Переписать в другой файл данные про те ЕОМ, которые имеют транслятор с C++ и цена которых находится в заданных границах.

2. Создать файл, элементы которого являются результаты экзаменационной сессии в виде: имя, оценки по разным предметам. Написать данные про студентов, которые получили "2" или "3" во время сессии.

3. Создать файл, в котором находятся данные про книги в виде: фамилия автора, название, год издания. Напечатать а) название книг, выданных после   1960 г.; б) данные про книги, название которых включает слово "программирование".

4. Создать файл, в котором находится информация о малом бизнесе: название, уставный фонд, год возникновения, товары, которые выпускаются (возможно, двух типов: продовольственные, непродовольственные). Напечатать данные про фирмы, с уставным фондом больше 10 тис. грв., которые выпускают продовольственные товары.

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

6. Создать файл с информацией о работниках отдела (фамилия, посада (профессор, доцент, ассистент), телефон). Напечатать информацию на запрос по фамилии.

7. Создать файл, в котором находится расписание международных электропоездов Харьков-Белгород. Вывести данные о поездах, которые отбывают в заданный промежуток времени.

8. Напечатать список групп студентов по признаку уменьшения средней оценки за сессию. Данные сохраняются в файле.

9. Кто из преподавателей кафедры читает курсы "Программирование" и "Вычислительная техника". Использовать файл для сохранения данных.

10. В файлі сохраняются результаты сессии. Напечатать список студентов по группам "отличники", "неуспевающие", остальные.

11. Создать файл товаров с характеристиками (название, цена, качество, количество). Вывести по запросу список товаров в порядке уменьшения цени или количество.

12. Напечатать формулу вычисления площади геометрической фигуры, название которой вводиться в запросе. Данные сохраняются в файле.

13. Напечатать в порядке уменьшения числового показателя ведомости про факультет по запросу абитуриента. Создать файл.

14. Ведомости про студентов сохраняются в файле. Кто из студентов, которые отслужили в армии, играет на скрипке и сдаёт все экзамены на отлично?

15. По какому предмету у данного студента лучшая оценка во время сессии? Данные сохраняются в файле.


Товары на экспорт

азвание товара

Страна

Количество

Список товаров

Запрос

      Добавить запись

       Сделать запрос

      Выход


 

А также другие работы, которые могут Вас заинтересовать

68387. Предмет экологии, ее структура, задачи экологии 90 KB
  Из всех живых организмов человек наиболее старается изменить природу, используя и приспосабливая её для своих нужд. Сегодня, благодаря развитию науки и техники, человек способен вторгаться во все микро- и макромиры, во все процессы, протекающие в биосфере.
68388. Принципы построения систем отображения информации в авиационных геоинформационных комплексах 1.69 MB
  Классификация систем отображения информации. Как следует из представленной схемы канал вывода видеоинформации состоит из четырех представлений объектов: ПМ СДФ ЛДФ и экрана дисплея с тремя логическими процессорами последовательно преобразующих одно представление изображения в другое: КДФ ДП и ДК.
68389. Перевозка угля от станции Бугач до коммунального бытового сектора 414 KB
  Характеристика груза. Выбор средств погрузкиразгрузки. Основные принципы выбора автотранспортных средств. Грузовместимость кузова. Партионность перевозок груза. Допустимая осевая нагрузка. Натуральные и экономические критерии. Разработка рациональной транспортно технологической схемы доставки грузов.
68390. Основные понятия, определения и элементы географической карты 7.08 MB
  В литературе чаще всего карты определяют как образно-знаковые модели действительности. Основными элементами географической карты являются картографическое изображение и его математическая основа. Картографическое изображение – это все условные обозначения, которые отражают на карте все явления...
68391. Применение топографических карт при изучении местности 501 KB
  Изображение рельефа способом горизонталей предоставляет широкие возможности для всестороннего изучения рельефа – особенностей его морфологического строения, количественных характеристик, условий хозяйственного использования местности.
68392. Общая характеристика баз картографических данных в АГК и картографических срезов 2.2 MB
  Одной из функций АГК является ввод обработка хранение и вывод по запросам оператора разнообразных картографических данных и специальных сведений о местности. Такая информация должна быть заложена в базах данных АГК что возможно лишь тогда когда они построены с учетом методов технологии цифровой картографии.
68393. Теплопроводность. Общее положение теории теплопроводности 137 KB
  Аналитическое и численное исследование процессов теплопроводности сводится обычно к изучению пространственно-временного распределения температуры в теле т. Температурным полем тела или системы тел называется совокупность значения температуры взятое по его объему...
68395. Теплопередача через однослойную плоскую стенку (граничные условия третьего рода) 151 KB
  Целью решения задачи является определение теплового потока через данную стенку и определение температурного поля пластинки. Условия однозначности дают право нам считать, что температура в системе изменяется лишь в направлении оси то есть задача одномерная.