marconi |
Отправлено: 16.03.2004, 21:43 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Хотел попробовать сделать отчет из AdvStringGrid с помощью FastReport
как всегда ничего не получается. Получается пробный отчет из БД.
А как вывести например из StringGrid ? Читал описание 2 раза ничего не понял.
Может у кого есть простые примеры. Объясните пожалуйста.
|
|
Георгий |
Отправлено: 16.03.2004, 23:03 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
Эх... давно всё это было... попробую по памяти пересказать.
делаешь 2 псевдоБД ( TfrUserDataset ) для него определяешь методы (для навигации по виртуальной таблице):
CheckEOF
First
Next
Prior
и для репорта
PrintColumn — для установки ширины столбцов по значению
frReport1GetValue — для работы самого отчёта
выглядело у меня это так:
CODE | static int y;
static int x;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->frReport1->PrepareReport();
this->frReport1->ShowReport();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::channelDataCheckEOF(TObject *Sender, bool &Eof)
{
Eof=(y==this->StringGrid1->RowCount);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::channelDataFirst(TObject *Sender)
{
y=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::channelDataNext(TObject *Sender)
{
if (y<this->StringGrid1->RowCount)
y++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::channelDataPrior(TObject *Sender)
{
if (y)y--;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frReport1GetValue(const AnsiString ParName,
Variant &ParValue)
{
if (ParName=="time")
ParValue=this->StringGrid1->Cells[x][0];
if (ParName=="channel")
ParValue=this->StringGrid1->Cells[0][y];
if (ParName=="CELL")
ParValue=this->StringGrid1->Cells[x][y];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timeDataCheckEOF(TObject *Sender, bool &Eof)
{
Eof=(x==this->StringGrid1->ColCount);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timeDataFirst(TObject *Sender)
{
x=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timeDataNext(TObject *Sender)
{
if (x<this->StringGrid1->ColCount)
x++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timeDataPrior(TObject *Sender)
{
if (x)x--;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frReport1PrintColumn(int ColNo, int &Width)
{
int i,w;
Width=0;
for (i=0;i<this->StringGrid1->RowCount;i++)
{
w=Canvas->TextWidth(StringGrid1->Cells[ColNo][i]);
if (w>Width)Width=w;
};
Width+=5+5;
} |
после этого надо настроить репорт. как это делать помню очень смутно (всё таки уже год прошёл). вроде клал горизонтальную и вертикальные полосы (band) и на пересечении помещал псевдоэлемент (кажется текстовый) с заданной в нём формулой — 'CELL'. и каждая полоса быал связана со своей псевдо БД — одна с time, а другая с channel
PS. всё тогдашнее изучение FR делал по помощи, которая поставляется вместе с демонстрационной версией этого продукта и там даже есть описание создания самодельного отчёта (не основанного на выборке из БД). Правда читать надо очень внимательно.
Отредактировано Георгий — 17/03/2004, 00:07 |
|
marconi |
Отправлено: 17.03.2004, 16:13 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Класс!!! И это всё по памяти ?
Кстати ещё вопрос Георгий, помните Вы давали ссылку на скачивание
примера FastReporta и ещё говорили что нужно выставить двоичный режим для скачивания. Я скачал просто так, этот Zip не открывается.
А как скачивать?
|
|