//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//заполнение заголовка списка
lst = new TStringList();
lst->Add("Автор");
lst->Add("Название");
lst->Add("Год издательства");
lst->Add("Место издания");
lst->Add("Количество страниц");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N6Click(TObject *Sender)
{
//пункт меню "Выход"
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
//создание новой вкладки(списка) и создание новой таблицы с описанием ее
свойств
TTabSheet* sheets = new TTabSheet(this);
sheets->PageControl = PageControl1;
sheets->Caption = "Новый список";
TStringGrid* grids = new TStringGrid(this);
grids->Parent = sheets;
grids->Align = alClient;
grids->FixedCols = 0;
grids->RowCount = 2;
grids->ColCount = 5;
for(int i=0; i<lst->Count; i++) grids->Cells[i][0] = lst->Strings[i];
grids->ColWidths[0] = grids->RowHeights[0];
grids->DefaultColWidth = grids->ClientWidth / grids->ColCount;
grids->Options >> goRangeSelect << goColSizing << goEditing <<
goDrawFocusSelected;
grids->OnSetEditText = workSetEditText;
grids->OnMouseDown = workMouseDown;
grids->DoubleBuffered = true;
PageControl1->ActivePageIndex = PageControl1->PageCount - 1;
PageControl1Change(NULL);
N3->Enabled = true;
N4->Enabled = true;
N5->Enabled = true;
N7->Enabled = true;
N9->Enabled = true;
N10->Enabled = true;
N16->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PageControl1Change(TObject *Sender)
{
//переключение по вкладкам
work = (TStringGrid*)PageControl1->ActivePage->Controls[0];
if( work->RowCount == 2 ) N8->Enabled = false;
else N8->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
//закрытие вкладки с проверкой на необходимость сохранения изменений в списке
if( PageControl1->PageCount )
{
if( ( PageControl1->ActivePage->Caption == "Новый список" ||
PageControl1->ActivePage->Caption.c_str()[0] == '*' ) )
{
int res = MessageBox(Handle, "Сохранить изменения перед закрытием?",
"Закрытие несохраненного каталога", MB_ICONQUESTION | MB_YESNOCANCEL);
if( res == IDYES ) N3Click(NULL);
if( res == IDCANCEL ) return;
}
PageControl1->ActivePage->SetFocus();
delete PageControl1->ActivePage->Controls[0];
PageControl1->ActivePage->~TTabSheet();
if( PageControl1->PageCount ) PageControl1Change(NULL);
else
{
N3->Enabled = false;
N4->Enabled = false;
N5->Enabled = false;
N7->Enabled = false;
N8->Enabled = false;
N9->Enabled = false;
N10->Enabled = false;
N16->Enabled = false;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N7Click(TObject *Sender)
{
//добавление новой строки в таблицу
N16Click(NULL);
work->RowCount += 1;
N8->Enabled = true;
if( PageControl1->ActivePage->Caption != "Новый список" &&
PageControl1->ActivePage->Caption.c_str()[0] != '*' )
PageControl1->ActivePage->Caption = "*" + PageControl1->ActivePage->Caption;
work->Row = work->RowCount -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N8Click(TObject *Sender)
{
//удаление строки из таблицы
if( work->RowCount > 2 )
{
for(int i=1; i<work->RowCount; i++)
if( work->RowHeights[i] == -1 )
{
N16Click(NULL);
return;
}
if( work->Row != work->RowCount - 1 )
{
int i, j;
for(i=work->Row; i<work->RowCount-1; i++)
for(j=0; j<work->ColCount; j++)
work->Cells[j][i] = work->Cells[j][i+1];
for(j=0; j<work->ColCount; j++) work->Cells[j][work->RowCount-1] = "";
}
work->RowCount -= 1;
if( work->Row == 1 ) N8->Enabled = false;
if( PageControl1->ActivePage->Caption != "Новый список" &&
PageControl1->ActivePage->Caption.c_str()[0] != '*' )
PageControl1->ActivePage->Caption = "*" + PageControl1->ActivePage->Caption;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
//пункт меню "Сохранить как ..."
SaveDialog1->InitialDir = ExtractFilePath(Application->ExeName) +
"Catalogs\\";
if( SaveDialog1->Execute() )
{
String file;
if( !AnsiCompareText(ExtractFileExt(SaveDialog1->FileName), ".lbr") ) file =
SaveDialog1->FileName;
else file = SaveDialog1->FileName + ".lbr";
if( FileExists(file) )
{
if( MessageBox(Handle, "Перезаписать файл?", "Файл уже существует",
MB_ICONQUESTION | MB_YESNO) == IDYES ) Save(file);
else N4Click(NULL);
}
else Save(file);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Save(String file)
{
//функция записи данных в бинарный файл
if( FileExists(file) ) DeleteFile(file);
int i, j, qnt;
TFileStream* strm = new TFileStream(file, fmCreate);
qnt = work->RowCount - 1;
strm->Write(&qnt, 4);
for(i=1; i<work->RowCount; i++)
{
for(j=0; j<work->ColCount; j++)
{
qnt = work->Cells[j][i].Length()+1;
strm->Write(&qnt, 4);
strm->Write(work->Cells[j][i].c_str(), qnt);
}
}
delete strm;
PageControl1->ActivePage->Hint = file;
PageControl1->ActivePage->Caption = ExtractFileName(file);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
//пункт меню "Сохранить"
if( PageControl1->ActivePage->Caption == "Новый список" ) N4Click(NULL);
else Save(PageControl1->ActivePage->Hint);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::workSetEditText(TObject *Sender, int ACol, int ARow,
const AnsiString Value)
{
//обработчик событий при измененнии текста в таблице
if( PageControl1->ActivePage->Caption != "Новый список" &&
PageControl1->ActivePage->Caption.c_str()[0] != '*' )
PageControl1->ActivePage->Caption = "*" + PageControl1->ActivePage->Caption;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
//пункт меню "Открыть"
if( OpenDialog1->Execute() )
{
N1Click(NULL);
Load(OpenDialog1->FileName);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Load(String file)
{
//функция чтения списка из файла
if( FileExists(file) )
{
int i, j, qnt;
char* buf;
TFileStream* strm = new TFileStream(file, fmOpenRead);
strm->Read(&qnt, 4);
work->RowCount = qnt + 1;
for(i=1; i<work->RowCount; i++)
{
for(j=0; j<work->ColCount; j++)
{
strm->Read(&qnt, 4);
buf = new char[qnt];
strm->Read(buf, qnt);
work->Cells[j][i] = AnsiString(buf);
delete [] buf;
}
}
delete strm;
PageControl1->ActivePage->Hint = file;
PageControl1 valign=->ActivePage->Caption = ExtractFileName(file);
PageControl1Change(NULL);
}
else MessageBox(Handle, "Файла с таким именем не существует!", "Ошибка",
MB_OK | MB_ICONERROR);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::workMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//обработчик событий нажатий на заголовки списка
if( Y <= work->CellRect(0,0).Bottom )
{
for(int i=0; i<work->ColCount; i++)
{
if( X > work->CellRect(i,0).left && X < work->CellRect(i,0).right )
{
SetSort(i);
break;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetSort(int col)
{
//функция сортировки данных по конкретному столбцу
int i, j;
String str;
for(i=1; i<work->RowCount; i++)
{
if( work->RowHeights[i] == -1 )
{
col = -1;
break;
}
}
for(i=0; i<work->ColCount; i++)
{
if( i == col ) work->Cells[i][0] = "•" + lst->Strings[i];
else work->Cells[i][0] = lst->Strings[i];
}
if( col == -1 ) return;
for(i=1; i<work->RowCount-1; )
{
if( work->Cells[col][i] > work->Cells[col][i+1] && col != 2 && col != 4 || (
col == 2 || col == 4 ) && atoi(work->Cells[col][i].c_str()) >
atoi(work->Cells[col][i+1].c_str()) )
{
for(j=0; j<work->ColCount; j++)
{
str = work->Cells[j][i];
work->Cells[j][i] = work->Cells[j][i+1];
work->Cells[j][i+1] = str;
}
i = 1;
}
else i++;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete lst;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//закрытие программы с проверкой на несохранненые данные
int i, res;
TCloseAction Act = caFree;
for(i=0; i<PageControl1->PageCount; i++)
{
PageControl1->ActivePageIndex = i;
PageControl1Change(NULL);
if( PageControl1->ActivePage->Caption == "Новый список" ||
PageControl1->ActivePage->Caption.c_str()[0] == '*' )
res = MessageBox(Handle, "Сохранить изменения перед закрытием?", "Закрытие
несохраненного каталога", MB_ICONQUESTION | MB_YESNOCANCEL);
if( res == IDYES ) N3Click(NULL);
if( res == IDCANCEL )
{
Act = caNone;
break;
}
}
Action = Act;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N9Click(TObject *Sender)
{
//пункт меню "Поиск"
f_r = 1;
f_c = 0;
FindDialog1->FindTextA = "";
FindDialog1->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
//функция осуществления поиска текста в таблице
int i, j;
bool ok = false;
for(i=f_c; i<work->ColCount; i++)
{
for(j=f_r; j<work->RowCount; j++)
{
if( work->Cells[i][j].Pos(FindDialog1->FindTextA) && work->RowHeights[j] !=
-1 )
{
if( j < work->RowCount - 1 ) f_r = j + 1;
else
if( i < work->ColCount - 1 )
{
f_r = 1;
f_c = i + 1;
}
work->Row = j;
work->Col = i;
ok = true;
break;
}
}
if( ok ) break;
}
if( !ok )
{
MessageBox(Handle, "Поиск завершен!", "Поиск", MB_ICONINFORMATION | MB_OK);
FindDialog1->CloseDialog();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N10Click(TObject *Sender)
{
//создание списков для фильтрации данных
N11->Clear();
N12->Clear();
N13->Clear();
N14->Clear();
N15->Clear();
SetList(0, N11);
SetList(1, N12);
SetList(2, N13);
SetList(3, N14);
SetList(4, N15);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetList(int col, TMenuItem* menu)
{
//функция создания списков для фильтрации для конкретного столбца
int i, j;
bool yes;
TStringList* tmp = new TStringList();
for(i=1; i<work->RowCount; i++)
{
yes = false;
for(j=0; j<tmp->Count; j++)
if( tmp->Strings[j] == work->Cells[col][i] )
{
yes = true;
break;
}
if( !yes ) tmp->Add(work->Cells[col][i]);
}
String str;
for(i=0; i<tmp->Count-1;)
{
if( tmp->Strings[i] > tmp->Strings[i+1] && col != 2 && col != 4 || (col == 2
|| col == 4 ) && atoi(tmp->Strings[i].c_str()) > atoi(tmp->Strings[i+1].c_str())
)
{
str = tmp->Strings[i];
tmp->Strings[i] = tmp->Strings[i+1];
tmp->Strings[i+1] = str;
i = 0;
}
else i++;
}
TMenuItem** ni = new TMenuItem*[tmp->Count];
for(i=0; i<tmp->Count; i++)
{
ni[i] = new TMenuItem(menu);
ni[i]->Caption = tmp->Strings[i];
ni[i]->Hint= tmp->Strings[i];
ni[i]->OnClick = SetFiltr;
ni[i]->Tag = col;
menu->Add(ni[i]);
}
delete tmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetFiltr(TObject *Sender)
{
//функция фильтрации данных
work->DefaultRowHeight = work->RowHeights[0];
int i, j = ((TMenuItem*)Sender)->Tag;
for(i=1; i<work->RowCount; i++) if( AnsiCompareText(work->Cells[j][i], ((TMenuItem*)Sender)->Hint)
) work->RowHeights[i] = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N16Click(TObject *Sender)
{
//функция отключения фильтрации данных
work->DefaultRowHeight = work->RowHeights[0];
}
//---------------------------------------------------------------------------