Поэтому и в этой программе, несмотря на то, что внутренние структуры используют Unicode, та часть программы, которая определяет станцию и железную дорогу по коду (и наоборот) использует обычные однобайтные символы в кодировке koi8-r, т.к. Написаны они были до разработки основной программы. Для переноса в другую систему требуется их перекодировка, что достаточно несложно реализуется программами recode или iconv.
Также из-за особенностей библиотеки Qt, в программе не создаются конструкторы и деструкторы классов (в смысле – вручную). В качестве конструкторов используются функции init(), а в качестве деструкторов – destroy().
Остальные особенности языка C только способствовали разработке программы: указали позволяют абстрагироваться от типов данных т.к. в одном массиве храняться данные 4-х типов, но одного размера.
Так как значительная часть кода сгенерирована Qt Designer'ом, то здесь приводятся только та часть кода, в которой описываются конкретные действия по работе с данными.
Файл mainform.h – основная программа.
#define PROGNAM "Train Timetable Editor"
bool isChanged = FALSE;
bool fopened = FALSE;
int nelem=0;
QString filename = "";
struct datastr01 *header[4];
struct datastr00 *base[100];
struct datastr10 *chnum;
struct datastr11 *chrail;
QFile datafile;
void MainForm::init()
{
openresolvefile("codes_rus.txt");
openrresolvefile("railways.txt");
recalcsize();
}
void MainForm::recalcsize()
{
int width=trainTimeTable->width();
trainTimeTable->setColumnWidth(0,(int)width*0.440);
trainTimeTable->setColumnWidth(1,(int)width*0.075);
trainTimeTable->setColumnWidth(2,(int)width*0.122);
trainTimeTable->setColumnWidth(3,(int)width*0.119);
trainTimeTable->setColumnWidth(4,(int)width*0.047);
trainTimeTable->setColumnWidth(5,(int)width*0.119);
}
void MainForm::fileNew()
{
NewTrainForm *newtrainForm = new NewTrainForm( this, "new train", TRUE );
if (newtrainForm->exec())
{
if (fopened) deleteall();
filename="";
int i;
for (i=0; i<4; i++){
header[i]=new datastr01;
header[i]->id=1;
}
header[0]->trnum=newtrainForm->TrainnumspinBox->value();
header[1]->trnum=newtrainForm->TrainnumspinBox->value();
QString trnlett = newtrainForm->TrainCodeLineEdit->text();
QChar lett;
lett=trnlett.at(0);
header[0]->lett=lett.unicode();
lett=trnlett.at(1);
header[1]->lett=lett.unicode();
QString trnfrom = newtrainForm->StartStatEdit->text();
header[0]->stcode=trnfrom.toInt();
QString trnto = newtrainForm->EndStatEdit->text();
header[1]->stcode=trnto.toInt();
QString trnum;
trnum.setNum(header[0]->trnum);
TrainNametextLabel->setText(trnum+trnlett+" "+trnfrom.fromLocal8Bit(resolvestat(header[0]->stcode))+" - "+trnto.fromLocal8Bit(resolvestat(header[1]->stcode)));
isChanged=TRUE;
fopened=TRUE;
for (i=0; i<3; i++)
base[i]=new datastr00;
for (i=1; i<3; i++)
{
base[i]->id=0;
base[i]->arr_h=25;
base[i]->dec_h=25;
}
base[0]->id=1;
base[1]->stcode=header[0]->stcode;
base[1]->dist=0;
base[2]->stcode=header[1]->stcode;
base[2]->dist=-1;
nelem=3;
redrawtable();
enableActions();
}
delete newtrainForm;
}
void MainForm::fileOpen()
{
filename = QFileDialog::getOpenFileName(
QString::null, tr("Train timetable information (*.trn)"), this,
"file open", QString(tr(PROGNAM))+tr(" -- File Open") );
if (filename.isEmpty()) return;
if (fopened) deleteall();
datafile.setName(filename);
datafile.open(IO_ReadOnly);
int i;
for (i=0; i<4; i++)
header[i]=new datastr01;
for (i=0; i<4; i++)
datafile.readBlock((char *)header[i],(Q_LONG)9);
i=0;
while (!datafile.atEnd()){
base[i]=new datastr00;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.