Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 41 Магазин

Программа Магазин (Рис. 48 и 49) работает с одноименной базой данных и демонстрирует использование компонентов BDE.

Рис 48

Рис 49

Вывод:В этой программе создали окно магазина для базы данных .

Листинг

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)

{

try {

Table1->Open();

}

catch ( EDBEngineError &e)

{

ShowMessage("Для доступа к базе данных надо создать " "псевдоним stock");

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::DataSource1StateChange(TObject *Sender)

{

if ( DataSource1->State == dsBrowse) StatusBar1->Panels->Items[1]->Text = "Просмотр";

else

StatusBar1->Panels->Items[1]->Text = "Редактирование";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Table1AfterScroll(TDataSet *DataSet)

{

AnsiString Picture;

if ( Table1->RecNo != -1)

{

StatusBar1->Panels->Items[0]->Text = "Запись: " + IntToStr( Table1->RecNo );

try {

Picture = Table1->Database->Directory + DataSet->FieldValues["Image"];

}

catch (EVariantTypeCastError &e)

{

Image1->Visible = false;

return;

}

ShowPhoto(Picture);

}

else

{

StatusBar1->Panels->Items[0]->Text = "";

StatusBar1->Panels->Items[1]->Text = "Новаязапись";

Image1->Visible = false;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ShowPhoto(AnsiString Picture)

{

try

{

Image1->Picture->LoadFromFile(Picture);

}

catch ( EFOpenError &e)

{

Image1->Visible = false;

return;

}

Image1->Visible = true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

if (Table1->State == dsEdit )

Table1->Post();

}

//---------------------------------------------------------------------------

Задача 42. Ежедневник

Программа Ежедневник (рис. 50) демонстрирует использование компонентов ADO для доступа к базе данных формата Microsoft Access. База данных содержит информацию о запланированных мероприятиях (дата, задача). Программа позволяет вносить в базу данных изменения (добавлять, удалять и редактировать записи), а также обеспечивает выбор информации по запросу — выводит список мероприятий, запланированных "на сегодня", "на завтра" и "на эту неделю". При запуске программа автоматически выводит список мероприятий, запланированных "на сегодня" или, если программа запущена в пятницу, субботу или воскресенье, "на сегодня и ближайшие дни”.

Рис 50

Вывод: В этом задании мы научились использовать компонентов ADO для доступа к базе данных формата Microsoft Access.

Листинг

AnsiString stDay[7] = ("воскресенье","понедельник","вторник", "среда","четверг","пятница","суббота"} ;

AnsiString stMonth[12] = {"января","февраля","марта", "апреля","мая","июня","июля", "августа","сентября","октября", "ноября","декабря"};

void fastcall TForml::FormShow(TObject *Sender)

{

TDateTime Today, // сегодня

NextDay; // следующий день (не обязательно завтра)

Word Year, Month, Day; // год, месяц, день

Today п Now ();

DecodeDate(Today, Year, Month, Day);

Labell->Caption = "Сегодня " + IntToStr(Day) + " " + stMonth[Month-1] + " " + IntToStr(Year) + " года, " + stDay[DayOfWeek(Today) -1];

Label2->Caption » "Сегодня и ближайшие дни";

/* вычислим следующий день, если сегодня пятница, то, чтобы не забыть, что запланировано на понедельник, считаем, что следующий день - понедельник */ switch ( DayOfWeek(Today) ) { case 6 : NextDay = Today + 3; break; // сегодня пятница case 7 : NextDay r» Today + 2; break; // сегодня суббота default : NextDay = Today + 1; break;

176 Часть 1. Примерыизадачи

ADODataSetl->CommandText = "SELECT * FROM schedule WHERE aDate BETWEEN DateValueC" FormatDateTimeC'dd/iran/yyyy", Today) + "') AND DateValue('" + FormatDateTime("dd/mm/yyyy",NextDay) + "') ORDER BY aDate";

// еслинадо, отобразить SQL-команду if ( CheckBoxl->Checked) ShowSQLO;

// если БД не зарегистрирована как источник данных ODBC, // возникает исключение EOleException

try { // открыть набор данных (выполнить // SQL-команду ADODataSetl->CommandText ADODataSetl->Open();

catch ( EOleException &e) // чтобы тип EOleException был доступен, в программу // надо поместить директиву ^include <ComObj.hpp> I

ShowMessage( "Ошибка обращения к БД. База данных Planner.mdb должна" "быть зарегистрирована\пв системе как источник данных ODBC " "под именем dplaner"

Buttonl->Enabled = false; Button2->Enabled = false; Button3->Enabled = false;

Базыданных 177

Button4->Enabled = false; return;

if ( ! ADODataSetl->RecordCount ) ShowMessage("На сегодня и ближайшие дни ни каких дел "не запланировано.");

// ЩелчокнакнопкеСегодня void fastcall TForml::ButtonlClick(TObject *Sender) { AnsiString today = FormatDateTime("dd/inm/yyyy",Now());

Forml->Label2->Caption = "Сегодня";

ADODataSetl->Close(); // закрытьнаборданных

// изменитькритерийзапроса ADODataSetl->CommandText = "SELECT * FROM schedule WHERE aDate = DateValue('" + today +"')";

if ( CheckBoxl->Checked) ShowSQLf); // отобразитьзапрос

ADODataSetl->Open(); // открыть набор данных с новым // запросом

// щелчокнакнопкеЗавтра void fastcall TForml::Button2Click(TObject *Sender) { AnsiString tomorrow = FormatDateTime("dd/mm/yyyy" Now () +1 ) ;

Label2->Caption = "Завтра";

178 Часть 1. Примеры и задачи

ADODataSetl->Close() ;

// изменитькритерийзапроса ADODataSetl->CornmandText = "SELECT * FROM schedule WHERE aDate = DateValue('" +

tomorrow + " ')";

if ( CheckBoxl->Checked) ShowSQLO;

ADODataSetl->Open(); // выполнить запрос

if ( ! ADODataSetl->RecordCount )

{

ShowMessage("На завтра никаких дел не" "запланировано!");

// щелчокнакнопкеНаэтойнеделе void fastcall TForml::Button3Click(TObject *Sender)

{

// "эта неделя" - от текущего дня до конца недели // (до воскресенья) TDateTime Present, eWeek;

Label2->Caption = "На этой неделе";

Present^ Now О; // Now - возвращает текущую дату

eWeek = EndOfAWeek(YearOf(Present),WeekOf(Present));

/* длядоступак StartOfWeek, EndOfAWeek, YearOf и WeekOf надоподключить DateUtils.hpp (см. директивы iinclude ) */

Базыданных 179

ADODataSetl->Close();

ADODataSetl->CommandText = "SELECT * FROM schedule WHERE aDate BETWEEN DateValue('" + FormatDateTime("dd/mm/yyyy", Present) + ."•') AND DateValuef1" + FormatDateTime("dd/mm/yyyy",eWeek)+"') ORDER BY aDate";

if ( CheckBoxl->Checked) ShowSQLO;

ADODataSetl->Open();

if ( ! ADODataSetl->RecordCount ) ShowMessage("На эту неделю никаких дел " "не запланировано.");

} // ЩелчокнакнопкеВсе void fastcall TForml::Button4Click(TObject *Sender) { ADODataSetl->Close();

ADODataSetl->CommandText = "SELECT * FROM schedule ORDER BY aDate"; if ( CheckBoxl->Checked) ShowSQLO; ADODataSetl->Open(); Label2->Caption - "Все, чтонамеченосделать";

} // отображает SQL-команду void fastcall TForml::ShowSQL(void) { ShowMessage ( ADODataSetl->CommandText );