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. По какому предмету у данного студента лучшая оценка во время сессии? Данные сохраняются в файле.


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

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

Страна

Количество

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

Запрос

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

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

      Выход


 

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

19453. ПРЕДСТАВИТЕЛЬСТВО: ПОНЯТИЕ И ВИДЫ. ДОВЕРЕННОСТЬ 27.5 KB
  ПРЕДСТАВИТЕЛЬСТВО: ПОНЯТИЕ И ВИДЫ. ДОВЕРЕННОСТЬ Представительство – совершение сделок представителем от имени представляемого лица и в его интересах в силу имеющихся полномочий основанных на доверенности указании закона либо акте уполномоченного на то государственн
19454. СРОКИ: ПОНЯТИЕ, ИСЧИСЛЕНИЕ И ВИДЫ 29 KB
  СРОКИ: ПОНЯТИЕ ИСЧИСЛЕНИЕ И ВИДЫ Срок – момент или период времени в который должны реализовываться права и выполняться возложенные обязанности с которым гражданское законодательство связывает определенные правовые последствия. Сроки по своей природе относятся к той...
19455. ПРАВО ОБЩЕЙ СОБСТВЕННОСТИ: ПОНЯТИЕ И ВИДЫ 27.5 KB
  ПРАВО ОБЩЕЙ СОБСТВЕННОСТИ: ПОНЯТИЕ И ВИДЫ В случаях когда имущество принадлежит на праве собственности не одному а двум и более лицам можно говорить об общей собственности.Общая собственность может возникать по различным основаниям: совместная покупка состояние в бра...
19456. Договор купли-продажи 23.5 KB
  Договор куплипродажи. Договор куплипродажи это соглашение по которому одна сторона продавец обязуется передать вещь товар в собственность другой стороне покупателю а покупатель обязуется принять этот товар и уплатить за него определенную денежную сумму цену ...
19457. Договор найма жилого помещения 24 KB
  Договор найма жилого помещения. Договор найма жилого помещения это соглашение сторон по которому одна сторона собственник жилого помещения или управомоченное им лицо наймодатель обязуется предоставить другой стороне нанимателю жилое помещение за плату во владе...
19458. Понятие договора хранения 24 KB
  Понятие договора хранения Договор хранения это соглашение сторон по которому одна сторона хранитель обязуется хранить вещь переданную ей другой стороной поклажедателем и возвратить эту вещь в сохранности. Договор хранения может быть как реальным так и консенсу...
19459. Символьные вычисления 37.15 KB
  В ходе лабораторной работы я научился выполнять символьные вычисления, такие как нахождение производной различных порядков, поиск пределов функций, нахождение определенных и неопределенных интегралов и т.д.
19460. Договор страхования 28.5 KB
  Договор страхования. Договор страхования это гражданскоправовая сделка между страховщиком и страхователем в силу которой страховщик обязуется при наступлении страхового случая произвести страховую выплату при условии оплаты страхователем страховой премии в обусл...
19461. Договор аренды зданий и сооружений 24.5 KB
  Договор аренды зданий и сооружений По договору аренды здания или сооружения арендодатель обязуется передать во временное владение и пользование или во временное пользование арендатору здание или сооружение. Стороны: Арендодатель и арендатор. Предмет: Здания и соор