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

 
Отчет, Количество страниц в отчете
Pan-SQL
Отправлено: 15.06.2005, 11:28


Не зарегистрирован







Здравствуйте! Нужна помощь по выводу количества страниц в отчёте. Проблема такая: приложение имеет 2 формы Form1 и Form2 соответственно. Форма Forn2 является собственным окном предварительного просмотра отчета. Она содержит следующие компоненты: непосредственно сам отчет (QuickRep1) и компонент предварительного просмотра отчета (QRPreview1)

Событие OnPreview компонента QuickRep1 выглядит следующим образом:

TQRPrinter *qrPrinter = dynamic_cast(Sender);
QRPreview1->QRPrinter=qrPrinter;

Событие OnClose формы Form2 выглядит так:

Action=caNone;
if (QRPreview1->QRPrinter)
{
QRPreview1->QRPrinter->ClosePreview(QRPreview1);
QRPreview1->QRPrinter=NULL;
}
Action=caFree;


Вторая форма открывается путем нажатия на кнопку Button1, находящуюся на форме Form1.

Ее код выглядит так:

TReportViewForm* frm = new TReportViewForm(Application);
if (!frm) return;
frm->Show();

Событие onActivate формы Form2 выглядит так:

QuickRep1->Preview();


Форма Form2 также имеет строку состояния (StstusBar1), в которую необходимо выводить информацию о текущей странице и общем количестве страниц в отчете.

Я пробовал добавлять в событие onActivate формы Form2 строку

StatusBar1->SimpleText= QRPreview1->QRPrinter->PageCount;

В строку состояния выводится ноль. Кто знает решение, подскажите. Заранее благодарю.
Guest
Отправлено: 15.06.2005, 11:51


Не зарегистрирован







OnStartPage не помогает?
Pan-SQL
Отправлено: 15.06.2005, 11:54


Не зарегистрирован







К сожалению нет
Guest
Отправлено: 15.06.2005, 12:24


Не зарегистрирован







Странно, а мне помогает.
.h
private: int FCurPage;
.cpp
конструктор
FCurPage = 0;
обработчик
void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
ShowMessage(++FCurPage);
}
Предано выводит номера всех создаваемых страниц.
Или я не так понял вопрос, и нужны номера просматриваемых страниц?
Pan-SQL
Отправлено: 16.06.2005, 10:06


Не зарегистрирован







При открытии формы просмотра отчета в строке состояния должно выводиться "Страница (№ страницы) из (Количество страниц)"
AVC
Отправлено: 16.06.2005, 12:44


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
При открытии формы просмотра отчета в строке состояния должно выводиться "Страница (№ страницы) из (Количество страниц)"


Вот так в "первом приближении" работает
CODE

private:
int FTotalPages;
void __fastcall SetPageNumber (int value, bool isdelta = true);

//---------------------------------------------------------------------------
void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
FTotalPages++;
SetPageNumber(1, false);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Bt_StartClick(TObject *Sender)
{
FTotalPages = 0;
QuickRep1->Preview();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Bt_NextClick(TObject *S) { SetPageNumber( 1); }
void __fastcall TForm2::Bt_PrevClick(TObject *S) { SetPageNumber(-1); }

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

void __fastcall TForm2::SetPageNumber (int value, bool isdelta)
{
int pgn = (!isdelta)? value : (QRPreview1->PageNumber + value);
if (pgn < 1) pgn = 1;
if (pgn > FTotalPages) pgn = FTotalPages;
QRPreview1->PageNumber = pgn;
StatusBar1->Panels->Items[0]->Text = AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
}
//---------------------------------------------------------------------------


PS. Уже успел подзабыть насколько QR капризен.
Pan-SQL:
Отправлено: 27.06.2005, 21:57


Не зарегистрирован







CODE
void __fastcall TForm2::SetPageNumber (int value, bool isdelta)
{
int pgn = (!isdelta)? value : (QRPreview1->PageNumber + value);
if (pgn < 1) pgn = 1;
if (pgn > FTotalPages) pgn = FTotalPages;
QRPreview1->PageNumber = pgn;
StatusBar1->Panels->Items[0]->Text = AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
};

В строку состояния выводится нормально, но при попытке вывести эту инфу внизу каждой страницы отчета (в компонент QRLabel, который находится в полосе:PageFooter ( QRLabel->Caption= AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
) выводиться 1/1, при переходе на следующую страницу выводиться 2/2 и т.д. Т. е. в том месте, где должно выводиться общее количество страниц в отчете, выводится номер текущей страницы. Возможно ли решение данной проблемы? Заранее благодарен!!!!!!!

Отредактировано Георгий — 27/06/2005, 23:02
AVC
Отправлено: 29.06.2005, 10:34


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

выводиться 1/1, при переходе на следующую страницу выводиться 2/2 и т.д. Т. е. в том месте, где должно выводиться общее количество страниц в отчете, выводится номер текущей страницы.

Все правильно, ведь для получения FTotalPages используется событие StartPage, а на момент заполнения QRLabel текущая страница и является последней.

QUOTE

Возможно ли решение данной проблемы?

Да, на этом уровне, если использовать два прохода (сначала считаем, потом показываем).
Pan-SQL
Отправлено: 30.06.2005, 17:37


Не зарегистрирован







Как это реализовать, какое событие использовать?
AVC
Отправлено: 01.07.2005, 08:18


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Как это реализовать, какое событие использовать?

Пока не знаю, будет время — поэкспериментирую. А лучше переходите на FastReport — удобная вещь!
AVC
Отправлено: 01.07.2005, 09:17


Ветеран

Группа: Модератор
Сообщений: 1583



Вариант решения.
Небольшая модификация моего предыдущего примера.
CODE

private:
bool FIsPrepareMode;

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

void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
if (FIsPrepareMode) FTotalPages++;
else                SetPageNumber(1, false);
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Bt_StartClick(TObject *Sender)
{
FTotalPages = 0;
try {
FIsPrepareMode = true;
QuickRep1->Prepare();
FIsPrepareMode = false;
QuickRep1->Preview();
}
catch(Exception &xcp) { ShowMessage(xcp.Message); }
SetPageNumber(1, false);
FIsPrepareMode = false;
}
//---------------------------------------------------------------------------

на рэпорте в PageFoter лежат
QRExpr1 — PAGENUMBER и
QRLabel1 с событием OnPrint
void __fastcall TForm2::QRLabel1Print(TObject *sender, AnsiString &Value)
{
Value = AnsiString(FTotalPages);
}

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