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


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

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

Страна

Количество

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

Запрос

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

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

      Выход


 

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

3770. Звукоподражание в современном английском языке 157 KB
  Введение Настоящая курсовая работа посвящена изучению агломератов английских звукоподражательных единиц. Основные понятия настоящей работы: Звукоподражание (ономатопея) – условное воспроизведение звуков природы и звучаний, сопровождающих некото...
3771. Орнамент — один из древнейших видов изобразительной деятельности человека 589 KB
  Введение. В народном декоративном искусстве все основано на отработанных профессиональных навыках и приемах, выработанных на протяжении многих поколений. Эти приемы настолько совершенны, что их применение позволяет достичь большой художественной выр...
3772. Конспект урока по рассказу А.И. Солженицына Правая кисть 120.5 KB
  Конспект урока по рассказу А.И. Солженицына Правая кисть Методический замысел урока: Этот урок – продолжение разговора об осмыслении трагедии маленького человека, беззащитного перед мертвой идеологией. Урок по рассказу А.И. Солженицына ...
3773. Комп’ютерне моделювання в економіці 100.33 KB
  Розв'язання засобами сучасних комп'ютерних технологій укономічних та інженерних задач, що моделюються сумісними системами лінійних алгебраїчних рівнянь.
3774. Food. Yummy, yummy 74.5 KB
  Food. Yummy, yummy Цель: Формирование лексико-фонетических, грамматических умений и навыков. Главные основания выбора замысла урока. Место данного урока в системе уроков, его связь с предыдущими и последующими уроками. Данный урок являе...
3775. ПРАВИЛА ДОРОЖНЫЕ ЗНАТЬ КАЖДОМУ ПОЛОЖЕНО 45 KB
  Внеклассное мероприятие по ОБЖ Правила дорожные знать каждому положено Цель: Актуализация знаний правил дорожного движения Развитие творческих способностей, внимания, быстроты реакции. Воспитание умения работать в колл...
3776. Введение в раздел О весна, без конца и без краю 38.56 KB
  Введение в раздел О весна, без конца и без краю… (Стихотворения А. Макаревича Снег, Ф. Тютчева Ещё земли печален вид). Цель и задачи урока: Познакомить детей со стихами о весне. Учить анализировать стихи, воспринимать и понимать чувства...
3777. Brain Ring What? Where? When? 135.5 KB
  Brain Ring What? Where? When? Мета: освітня – закріплення та повторення одержаних знань практична – вчити радити, пропонувати та аргументувати свою думку, сприймати розповідь на слух розвиваюча – розвивати увагу, пізнавальний інт...
3778. Значение института несостоятельности (банкротства) 120.5 KB
  Институт несостоятельности предприятия (банкротства) появился в нашем правовом регулировании в связи с переходом к рыночным отношениям. В условиях всеобъемлющего господства государственной и кооперативно-колхозной собственности проблема пр...