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


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

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

Страна

Количество

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

Запрос

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

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

      Выход


 

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

49894. Особливості лексичного складу у творі І.Котляревського «Наталка-Полтавка» 223.5 KB
  У лексиці зовсім інша ситуація: одні слова виходять з ужитку назавжди або згодом повертаються набувши нового значення інші з’являються як питомі або запозичені. Активна лексика – часто вживані загальновживані слова. До активної лексики належать такі семантичні групи: назви спорідненості назви частин організму людини тварин назви свійських і широковідомих диких птахів назви риб рослин явищ природи часових понять жител та їх частин предметів і процесів харчування одягу взуття почуттів кольору смаку розміру чисел...
49895. Система мотивації та оцінка організаційної поведінки 272 KB
  Методи поліпшення параметрів роботи. Технології роботи за персоналом. Протягом історії намагаються віднайти шляхи оптимізації використання людських ресурсів шляхом залучення інтелектуального психічного і фізичного потенціалу кожного окремого індивіда до роботи над досягненням цілей встановлених спільнотою людей залежно від домінуючих в даній спільноті потреб і мотивів які є рушійною силою її розвитку. Результати такої оцінки та прогнозування можуть виступити основою технологій роботи з персоналом які переслідують мету певним чином...
49896. Строение барабанной перепонки и ее роль в слуховой функции. Особенности барабанной перепонки у ребенка 13.66 KB
  Барабанная перепонка отделяет наружный слуховой проход от среднего уха и представляет собой тонкую упругую пластинку, покрытую со стороны слухового прохода тонким наружным слоем кожи (эпидермисом), а со стороны среднего уха — слизистой оболочкой.
49897. Организация и тактика тушения пожара на объекте оптовой торговой базы площадью 10000 м2 2.64 MB
  Прогнозирование возможной обстановки и расчетсил и средств для ограничения развития пожара8 Расчет сил и средств для тушения пожара. Исходные данные: Вариант 103 Номер учебного дела 5 Номер варианта расписания выезда 3 Номер варианта водоснабжения 3 Разряд СПТ 1 Место возникновения горения 17 Время возникновения пожара τ1 17:24 ч мин Время сообщений о нём в пожарную охрану τ2 17:39 ч. мин Площадь...
49898. Вырожденные случаи в бинарном поиске 134.5 KB
  тобы найти элемент 4 в таком дереве нужно пройти по всему дереву. Очень остроумное решение поддержания бинарного дерева в удобном для поиска виде было предложено в 1962 г. двумя советскими математиками Адельсоном-Вельским и Ландисом. Метод требует лишь добавления одного поля в каждый узел и никогда не использует более
49899. Нарушения нервно-мышечного механизма голосообразования. Параличи и парезы лицевых и гортанных мышц 14.63 KB
  Выпадение функции групп мышц (чаще парных) обычно является следствием перенесенных острых воспалительных процессов слизистой гортани, в которые был вовлечен и мышечный аппарат. Больные жалуются на повышенную утомляемость голоса.
49900. Расчет потенциометрических датчиков 610.5 KB
  Основными этапами расчета по этой методике являются: I Определение основных конструктивных параметров каркаса и обмотки; 2 Расчет электрических параметров обмотки; 3 Расчет температурного режима датчика. К схемным или электрическим параметрам относятся: U напряжение питания датчика; Rn общее сопротивление обмотки потенциометра; удельное сопротивление материала провода; lmx максимальная относительная погрешность нагруженного датчика. Названные параметры связаны между собой следующими соотношениями: Для инженерных расчетов...
49901. ПРОГНОЗИРОВАНИЕ СРЕДНЕЙ СТОИМОСТИ ЖИЛОЙ НЕДВИЖИМОСТИ С ИСПОЛЬЗОВАНИЕМ НЕЙРОСЕТИ 382.5 KB
  Принципы и методы прогнозирования и оценки недвижимости. Методы оценки недвижимости основанные на сравнении рыночной информации Методы оценки недвижимости основанные на анализе затрат.
49902. Искусственный нейрон. Алгоритм обратного распространения 467.33 KB
  Нейронные сети обратного распространения – это мощнейший инструмент поиска закономерностей, прогнозирования, качественного анализа. Такое название – сети обратного распространения (back propagation) они получили из-за используемого алгоритма обучения, в котором ошибка распространяется от выходного слоя к входному, т.е. в направлении...