Здравствуйте, novij2011!
Вообще-то, если Вы хотели создать базу данных, то следовало работать с компонентами вкладки DataAccess, а не с текстовыми файлами, но раз вопрос был сформулирован именно так, то вот вариант решения.
Главная форма приложения MainForm выглядит следующим образом:
Форма ввода данных о работнике - InputForm - вызывается из обработчика события активации меню void __fastcall TMainForm::InputDataMenuItemClick(TObject *Sender).
Данные о работниках загружаются в вектор объектов класса TWorker - член класса главной формы.
Класс работника TWorker объявлен в заголовочном файле TWorker.h.
Сортировка по фамилии реализована в меню "Поиск".
В остальном - см. приложение, код комментирован.
Файл проекта Borland Developer Studio 2006 прикреплён к ответу.
Приложение:
// Файл TWorker.h
// Класс работника
//---------------------------------------------------------------------------
#ifndef _TWorker_h_
#define _TWorker_h_
//---------------------------------------------------------------------------
enum TSex {Male = 0, Female = 1, Unknown = 2};
//---------------------------------------------------------------------------
class TWorker
{
public:
TWorker() {}; // Пустой конструктор
AnsiString sLastName; // Фамилия
AnsiString sName; // Имя
AnsiString sMiddleName; // Отчество
TSex Sex; // Пол
AnsiString sAddress; // Адрес
AnsiString sAppointment; // Должность
AnsiString sSeniority; // Стаж
AnsiString sEducation; // Образование
AnsiString sPhone; // Телефон
};
//---------------------------------------------------------------------------
#endif
// Файл InputUnit.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "InputUnit.h"
#include "TWorker.h"
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TInputForm *InputForm;
//---------------------------------------------------------------------------
__fastcall TInputForm::TInputForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TInputForm::CancelButtonClick(TObject *Sender)
{
InputForm->Close();
}
//---------------------------------------------------------------------------
void __fastcall TInputForm::ClearButtonClick(TObject *Sender)
{
NameEdit->Clear();
MiddleNameEdit->Clear();
LastNameEdit->Clear();
AddressEdit->Clear();
AppointmentEdit->Clear();
SeniorityEdit->Clear();
EducationEdit->Clear();
PhoneEdit->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TInputForm::SubmitButtonClick(TObject *Sender)
{
if(NameEdit->Text.IsEmpty() ||
MiddleNameEdit->Text.IsEmpty() ||
LastNameEdit->Text.IsEmpty() ||
AddressEdit->Text.IsEmpty() ||
AppointmentEdit->Text.IsEmpty() ||
SeniorityEdit->Text.IsEmpty() ||
EducationEdit->Text.IsEmpty() ||
PhoneEdit->Text.IsEmpty())
{
MessageBox(0, "Введите данные!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
TWorker TmpWorker;
TmpWorker.sName = NameEdit->Text;
TmpWorker.sMiddleName = MiddleNameEdit->Text;
TmpWorker.sLastName = LastNameEdit->Text;
if(SexBox->Text == "Мужской") TmpWorker.Sex = Male;
else if(SexBox->Text == "Женский") TmpWorker.Sex = Female;
else if(SexBox->Text == "Не указан") TmpWorker.Sex = Unknown;
TmpWorker.sAddress = AddressEdit->Text;
TmpWorker.sAppointment = AppointmentEdit->Text;
TmpWorker.sSeniority = SeniorityEdit->Text;
TmpWorker.sEducation = EducationEdit->Text;
TmpWorker.sPhone = PhoneEdit->Text;
MainForm->Worker.push_back(TmpWorker);
this->ClearButtonClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TInputForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if(MainForm->Worker.size() == 0) return;
MainForm->ShowWorkers(); // Если список работников не пуст, показываем его
}
//---------------------------------------------------------------------------
// Файл MainUnit.h
//---------------------------------------------------------------------------
#ifndef MainUnitH
#define MainUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
#include "TWorker.h"
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <Grids.hpp> // Подключаем класс работника
//---------------------------------------------------------------------------
#include <vector>
using namespace std;
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu;
TMenuItem *DataMenuItem;
TMenuItem *LoadDataMenuItem;
TOpenDialog *OpenDialog;
TMenuItem *N1;
TMenuItem *ExitMenuItem;
TStringGrid *WorkersGrid;
TMenuItem *InputDataMenuItem;
TMenuItem *SearchMenuItem;
TMenuItem *SearchByLastNameMenuItem;
TMenuItem *ShowMenuItem;
TSaveDialog *SaveDialog;
TMenuItem *SaveDataMenuItem;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *SortByLastNameMenuItem;
void __fastcall LoadDataMenuItemClick(TObject *Sender);
void __fastcall ExitMenuItemClick(TObject *Sender);
void __fastcall InputDataMenuItemClick(TObject *Sender);
void __fastcall SearchByLastNameMenuItemClick(TObject *Sender);
void __fastcall ShowMenuItemClick(TObject *Sender);
void __fastcall SaveDataMenuItemClick(TObject *Sender);
void __fastcall SortByLastNameMenuItemClick(TObject *Sender);
private:
void ShowSortedByLastName(); // Показать список работников, отсортированный по фамилии
public:
vector<TWorker> Worker; // Список работников
void ShowWorkers(); // Показать список работников
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
// Файл MainUnit.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainUnit.h"
#include "InputUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
// Формируем заголовки таблицы
WorkersGrid->Cells[1][0] = "Фамилия";
WorkersGrid->Cells[2][0] = "Имя";
WorkersGrid->Cells[3][0] = "Отчество";
WorkersGrid->Cells[4][0] = "Пол";
WorkersGrid->Cells[5][0] = "Адрес";
WorkersGrid->Cells[6][0] = "Должность";
WorkersGrid->Cells[7][0] = "Стаж";
WorkersGrid->Cells[8][0] = "Образование";
WorkersGrid->Cells[9][0] = "Телефон";
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::LoadDataMenuItemClick(TObject *Sender)
{
this->Worker.clear(); // Очищаем вектор перед загрузкой новых данных
AnsiString sFileName; // Название файла для чтения
if(OpenDialog->Execute())
{
sFileName = OpenDialog->FileName; // Выбор пользователя
TStringList* pTmpStrings = new TStringList(); // Список строк для загруженных данных
TWorker TmpWorker;
pTmpStrings->LoadFromFile(sFileName); // Загружаем строки из файла
int iLines = 0; // Загружено строк
int iElement = 0; // Номер члена загружаемого объекта
while(iLines != (pTmpStrings->Count - 1))
{
if(iElement == 0)
{
TmpWorker.sLastName = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 1)
{
TmpWorker.sName = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 2)
{
TmpWorker.sMiddleName = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 3)
{
TSex Sex = (TSex)StrToInt(pTmpStrings->Strings[iLines]);
TmpWorker.Sex = Sex;
iElement++;
iLines++;
}
else if(iElement == 4)
{
TmpWorker.sAddress = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 5)
{
TmpWorker.sAppointment = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 6)
{
TmpWorker.sSeniority = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 7)
{
TmpWorker.sEducation = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 8)
{
TmpWorker.sPhone = pTmpStrings->Strings[iLines];
iElement++;
iLines++;
}
else if(iElement == 9)
{
iElement = 0; // Новый элемент для загрузки - первый член
this->Worker.push_back(TmpWorker); // Добавляем загруженные данные работника в вектор
iLines++;
}
}
delete pTmpStrings;
}
else return;
if(Worker.size() == 0)
{
MessageBox(0, "Нет введённых данных о работниках!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
this->ShowWorkers(); // Если список работников не пуст, показываем его
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ExitMenuItemClick(TObject *Sender)
{
MainForm->Close(); // Завершаем работу программы
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::InputDataMenuItemClick(TObject *Sender)
{
InputForm->ShowModal(); // Показываем диалог ввода данных о работнике
}
//---------------------------------------------------------------------------
void TMainForm::ShowWorkers()
{
WorkersGrid->RowCount = (int)(Worker.size() + 1);
for(unsigned i = 0; i < Worker.size(); i++)
{
WorkersGrid->Cells[0][i + 1] = IntToStr(i + 1);
WorkersGrid->Cells[1][i + 1] = Worker[i].sLastName;
WorkersGrid->Cells[2][i + 1] = Worker[i].sName;
WorkersGrid->Cells[3][i + 1] = Worker[i].sMiddleName;
if(Worker[i].Sex == Male) WorkersGrid->Cells[4][i + 1] = "Мужской";
else if(Worker[i].Sex == Female) WorkersGrid->Cells[4][i + 1] = "Женский";
else if(Worker[i].Sex == Unknown) WorkersGrid->Cells[4][i + 1] = "Не указан";
WorkersGrid->Cells[5][i + 1] = Worker[i].sAddress;
WorkersGrid->Cells[6][i + 1] = Worker[i].sAppointment;
WorkersGrid->Cells[7][i + 1] = Worker[i].sSeniority;
WorkersGrid->Cells[8][i + 1] = Worker[i].sEducation;
WorkersGrid->Cells[9][i + 1] = Worker[i].sPhone;
}
}
//---------------------------------------------------------------------------
void TMainForm::ShowSortedByLastName()
{
if(Worker.size() == 0) return;
// Если список работников не пуст - сортируем по фамилии
TWorker TempWorker;
for(unsigned i = 0; i <= (Worker.size() - 1); i++)
{
for(unsigned j = i + 1; j < Worker.size(); j++)
{
if(Worker[i].sLastName > Worker[j].sLastName)
{
TempWorker = Worker[i];
Worker[i] = Worker[j];
Worker[j] = TempWorker;
}
}
}
this->ShowWorkers();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SearchByLastNameMenuItemClick(TObject *Sender)
{
if(Worker.size() == 0)
{
MessageBox(0, "Нет введённых данных о работниках!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
AnsiString sSearchString = InputBox("Поиск", "Введите фамилию для поиска:", "");
if(sSearchString.IsEmpty())
{
MessageBox(0, "Не введена фамилия для поиска!", "Ошибка", MB_ICONWARNING | MB_OK);
return;
}
int iFound = 0; // Найдено элементов
WorkersGrid->RowCount = 2;
WorkersGrid->Rows[1]->Clear(); // Очищаем таблицу
WorkersGrid->FixedRows = 1;
for(unsigned i = 0; i < Worker.size(); ++i)
{
if(Worker[i].sLastName == sSearchString) // Если фамилия работника совпадает с данными поиска...
{
iFound++; // ...добавляем работника в список
WorkersGrid->RowCount = iFound + 1;
WorkersGrid->Cells[0][iFound] = IntToStr(i + 1);
WorkersGrid->Cells[1][iFound] = Worker[i].sLastName;
WorkersGrid->Cells[2][iFound] = Worker[i].sName;
WorkersGrid->Cells[3][iFound] = Worker[i].sMiddleName;
if(Worker[i].Sex == Male) WorkersGrid->Cells[4][iFound] = "Мужской";
else if(Worker[i].Sex == Female) WorkersGrid->Cells[4][iFound] = "Женский";
else if(Worker[i].Sex == Unknown) WorkersGrid->Cells[4][iFound] = "Не указан";
WorkersGrid->Cells[5][iFound] = Worker[i].sAddress;
WorkersGrid->Cells[6][iFound] = Worker[i].sAppointment;
WorkersGrid->Cells[7][iFound] = Worker[i].sSeniority;
WorkersGrid->Cells[8][iFound] = Worker[i].sEducation;
WorkersGrid->Cells[9][iFound] = Worker[i].sPhone;
}
}
if(iFound == 0) MessageBox(0, "Фамилии нет в списке.", "Нет совпадений", MB_ICONINFORMATION | MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ShowMenuItemClick(TObject *Sender)
{
if(Worker.size() == 0)
{
MessageBox(0, "Нет введённых данных о работниках!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
this->ShowWorkers();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SaveDataMenuItemClick(TObject *Sender)
{
if(Worker.size() == 0)
{
MessageBox(0, "Нет введённых данных о работниках!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
AnsiString sFileName; // Название файла для записи
if(SaveDialog->Execute())
{
sFileName = SaveDialog->FileName; // Выбор пользователя
TStringList* pTmpStrings = new TStringList(); // Список строк для загрузки данных из вектора
for(unsigned i = 0; i < Worker.size(); ++i)
{
pTmpStrings->Add(Worker[i].sLastName);
pTmpStrings->Add(Worker[i].sName);
pTmpStrings->Add(Worker[i].sMiddleName);
if(Worker[i].Sex == Male) pTmpStrings->Add("0");
else if(Worker[i].Sex == Female) pTmpStrings->Add("1");
else if(Worker[i].Sex == Unknown) pTmpStrings->Add("2");
pTmpStrings->Add(Worker[i].sAddress);
pTmpStrings->Add(Worker[i].sAppointment);
pTmpStrings->Add(Worker[i].sSeniority);
pTmpStrings->Add(Worker[i].sEducation);
pTmpStrings->Add(Worker[i].sPhone);
pTmpStrings->Add("***");
}
pTmpStrings->Add(""); // Последняя строка файла - пустая
pTmpStrings->SaveToFile(sFileName); // Сохраняем данные в файл
delete pTmpStrings;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SortByLastNameMenuItemClick(TObject *Sender)
{
if(Worker.size() == 0)
{
MessageBox(0, "Нет введённых данных о работниках!", "Ошибка!", MB_ICONWARNING | MB_OK);
return;
}
this->ShowSortedByLastName(); // Сортируем по фамилии и показываем список работников
}
//---------------------------------------------------------------------------