C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
FastReport
marconi
Отправлено: 16.03.2004, 21:43


Станционный диспетчер

Группа: Участник
Сообщений: 86



Хотел попробовать сделать отчет из AdvStringGrid с помощью FastReport
как всегда ничего не получается. Получается пробный отчет из БД.
А как вывести например из StringGrid ? Читал описание 2 раза ничего не понял.sad.gif
Может у кого есть простые примеры. Объясните пожалуйста.
Георгий
Отправлено: 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 не открывается.
А как скачивать?

Вернуться в Вопросы программирования в C++Builder