void __fastcall TfmPrint::bbPrintClick(TObject *Sender)
{
//Диалог выбора принтера - пользователь выбрал отмену
if(!pd->Execute()) bbCancel->Click();
Prn = Printer();
if(!Prn->Printers->Count){
Application->MessageBoxA("В системе не обнаружено принтера. Установите принтер используя меню \"Пуск\\Настройка\\Принтеры\\Добавить принтер\" и напечатайте накладную используя журнал накладных.","Нет принтера по умолчанию",MB_ICONINFORMATION+MB_OK);
bbCancel->Click();
return;
}
Prn->BeginDoc();
int Vert = 0;
Vert = Print(Vert);
Print(Vert);
//Предполагается что печатается две накладные -
//легко может быть модифицировано.
Prn->EndDoc();
}
Печать содержимого StringGrid
У меня есть какие-то данные в таблице StringGrid.Каким образом можно вывести эти данные на печать, желательно вместе с самой таблицей?
Цитата: Fevzi
У меня есть какие-то данные в таблице StringGrid.Каким образом можно вывести эти данные на печать, желательно вместе с самой таблицей?
1. Например заставить ЭТО сделать Word или Excel.
2. Воспользоваться каким-либо генератором отчетов напр. FastReport (TfrDataSet + TfrReport::OnGetValue) или TQuickRep::OnNeedData.
3. Можно попробовать метод PaintTo
4. И наконец попробовать самому "рисовать" например на канве метафайла страницы и слать их на принтер.
Я делаю это по методу 2 FR.
А именно - мне нужно распечатать табличку такого плана:
Шапка
Еще какойто текст
ТАБЛИЦА С ГРИДА
подпись
З.Ы: см. вложение...
А по подробнее надо изучать уже.
Конечно правильней будет если использовать какой либа из мастеров отчетов.
Допустим я иногда выкручивался тем что создавал HTML страничку на лету и пускал ее на печать, это удобно если лень разбиратся с FR, или же требуется нечно не стандртное, мне это было проще организовывать на HTML. Красиво и сердито.
Но повторюсь правильней использовать мастер отчетов.
Код:
Ну а далее - собственно функция - все переменные или классы, которые явно не объявлены - являются закрытыми членами класса TfmPrint
Код:
//---------------------------------------------------------------------------
int __fastcall TfmPrint::Print(const int& Vert){
TCanvas *pCanvas = Prn->Canvas;//Получаем указатель на канву
// принтера
int PosVert = Vert,PosGor = 0;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth; //Закрытая переменная класса - ширина отступа
// вверху
}
pCanvas->Brush->Color = clWhite;
pCanvas->Font->Size = 14;
pCanvas->Font->Color = clBlack;
pCanvas->Font->Style=TFontStyles()<< fsBold;
AnsiString String = InvoiceIn.GetName()+" № "+InvoiceIn.GetCode();
if(Vert==0)PosVert = TopWidth;
PosGor = Prn->PageWidth/2;
PosGor -= (pCanvas->TextWidth(String)/2);
pCanvas->TextOutA(PosGor,PosVert,String);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(InvoiceIn.GetName()+" № "+InvoiceIn.GetName());
pCanvas->Font->Size = 12;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String)*2;
String = "Дата: " + Form1->stDocumentData->Caption;
PosGor = Prn->PageWidth/2;
PosGor -= (pCanvas->TextWidth(String)/2);
pCanvas->TextOutA(PosGor,PosVert,String);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosGor = LeftWidth;//Ширина отступа слева - устанавливаем каретку
PosVert += pCanvas->TextHeight(String);
pCanvas->Font->Size = 10;
String = "Поставщик: " + Form1->stPostav->Caption+"\r\n";
int j = 1;
//Устанавливаем переносы
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
String = "Получатель: "+Form1->stFirmAddress->Caption+"\r\n";
j = 1;
PosGor = LeftWidth;
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String)*2;
PosGor = LeftWidth;
TRect Num;
TRect Cod;
TRect Name;
TRect EdIz;
TRect Cena;
TRect Colvo;
TRect Summ;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
Num.Left = PosGor;
Num.Right = PosGor+pCanvas->TextWidth("№ п/п")+1;
Num.Top = PosVert;
Num.Bottom = PosVert+pCanvas->TextHeight("№ п/п")+40;
Cod.Left = Num.Right;
Cod.Right = Num.Right+(pCanvas->TextWidth("Код")+20);
Cod.Top = PosVert;
Cod.Bottom = Num.Bottom;
Name.Left = Cod.Right;
Name.Right = Cod.Right+(pCanvas->TextWidth("Наименование")+500);
Name.Top = PosVert;
Name.Bottom = Num.Bottom;
EdIz.Left = Name.Right;
EdIz.Right = Name.Right+(pCanvas->TextWidth("Ед.изм")+2);
EdIz.Top = PosVert;
EdIz.Bottom = Num.Bottom;
Cena.Left = EdIz.Right;
Cena.Right = EdIz.Right+(pCanvas->TextWidth("Цена")+300);
Cena.Top = PosVert;
Cena.Bottom = Num.Bottom;
Colvo.Left = Cena.Right;
Colvo.Right = Cena.Right+(pCanvas->TextWidth("Кол-во")+300);
Colvo.Top = PosVert;
Colvo.Bottom = Num.Bottom;
Summ.Left = Colvo.Right;
Summ.Right = Colvo.Right+(pCanvas->TextWidth("Сумма")+500);
Summ.Top = PosVert;
Summ.Bottom = Num.Bottom;
pCanvas->Pen->Color = clWindowText;
pCanvas->Font->Size = 10;
pCanvas->Brush->Color = clActiveCaption;
pCanvas->Font->Color = clWhite;
pCanvas->TextRect(Num,Num.Left+1,Num.Top+10,"№ п/п");
pCanvas->TextRect(Cod,Cod.Left+10,Cod.Top+10,"Код");
pCanvas->TextRect(Name,Name.Left+10,Name.Top+10,"Наименование");
pCanvas->TextRect(EdIz,EdIz.Left+1,EdIz.Top+10,"Ед.изм");
pCanvas->TextRect(Cena,Cena.Left+10,Cena.Top+10,"Цена");
pCanvas->TextRect(Colvo,Colvo.Left+10,Colvo.Top+10,"Кол-во");
pCanvas->TextRect(Summ,Summ.Left+10,Summ.Top+10,"Сумма");
pCanvas->Brush->Color = clBlack;
pCanvas->FrameRect(Num);
pCanvas->FrameRect(Cod);
pCanvas->FrameRect(Name);
pCanvas->FrameRect(EdIz);
pCanvas->FrameRect(Cena);
pCanvas->FrameRect(Colvo);
pCanvas->FrameRect(Summ);
for(int i=0;i<InvoiceIn.GetProductCount();i++){
pCanvas->Brush->Color = clNone;
pCanvas->Brush->Style = bsClear;
pCanvas->Pen->Color = clWindowText;
pCanvas->Font->Color = clBlack;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height();
Num.Top = PosVert;
Num.Bottom = PosVert+pCanvas->TextHeight("№ п/п")+10;
Cod.Top = PosVert;
Cod.Bottom = Num.Bottom;
Name.Top = PosVert;
Name.Bottom = Num.Bottom;
EdIz.Top = PosVert;
EdIz.Bottom = Num.Bottom;
Cena.Top = PosVert;
Cena.Bottom = Num.Bottom;
Colvo.Top = PosVert;
Colvo.Bottom = Num.Bottom;
Summ.Top = PosVert;
Summ.Bottom = Num.Bottom;
ScladList.Product = ScladList.findId(InvoiceIn.getProduct(i));
pCanvas->TextRect(Num,Num.Left+10,Num.Top+10,IntToStr(i+1));
pCanvas->TextRect(Cod,Cod.Left+10,Cod.Top+10,IntToStr(ScladList.Product->GetCode()));
pCanvas->TextRect(Name,Name.Left+10,Name.Top+10,ScladList.Product->GetName());
pCanvas->TextRect(EdIz,EdIz.Left+1,EdIz.Top+10,ScladList.Product->GetPack());
pCanvas->TextRect(Cena,Cena.Left+10,Cena.Top+10,FloatToStr(ScladList.Product->GetPriceIn()));
pCanvas->TextRect(Colvo,Colvo.Left+10,Colvo.Top+10,FloatToStr(ScladList.Product->GetCount()));
pCanvas->TextRect(Summ,Summ.Left+10,Summ.Top+10,FloatToStr(ScladList.Product->GetPriceIn()*ScladList.Product->GetCount()));
pCanvas->Brush->Color = clBlack;
pCanvas->FrameRect(Num);
pCanvas->FrameRect(Cod);
pCanvas->FrameRect(Name);
pCanvas->FrameRect(EdIz);
pCanvas->FrameRect(Cena);
pCanvas->FrameRect(Colvo);
pCanvas->FrameRect(Summ);
}
pCanvas->Brush->Color = clWhite;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height()*2;
pCanvas->Font->Size = 14;
pCanvas->TextOutA(PosGor,PosVert,"Всего сумма: ");
pCanvas->TextOutA(Summ.Left,PosVert,FloatToStr(InvoiceIn.GetAmount()));
pCanvas->Font->Size = 12;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height()*2;
pCanvas->TextOutA(PosGor,PosVert,"Поставщик:_____________________ ");
pCanvas->TextOutA(PosGor+pCanvas->TextWidth("Поставщик:_____________________ ")+800,PosVert,"Получатель:_____________________ ");
PosVert += Num.Height()*6;
do{
pCanvas->TextOutA(PosGor,PosVert,"- ");
PosGor += pCanvas->TextWidth("- ");
}while(PosGor < Prn->PageWidth);
PosVert += Num.Height()*6;
return PosVert;
}
int __fastcall TfmPrint::Print(const int& Vert){
TCanvas *pCanvas = Prn->Canvas;//Получаем указатель на канву
// принтера
int PosVert = Vert,PosGor = 0;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth; //Закрытая переменная класса - ширина отступа
// вверху
}
pCanvas->Brush->Color = clWhite;
pCanvas->Font->Size = 14;
pCanvas->Font->Color = clBlack;
pCanvas->Font->Style=TFontStyles()<< fsBold;
AnsiString String = InvoiceIn.GetName()+" № "+InvoiceIn.GetCode();
if(Vert==0)PosVert = TopWidth;
PosGor = Prn->PageWidth/2;
PosGor -= (pCanvas->TextWidth(String)/2);
pCanvas->TextOutA(PosGor,PosVert,String);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(InvoiceIn.GetName()+" № "+InvoiceIn.GetName());
pCanvas->Font->Size = 12;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String)*2;
String = "Дата: " + Form1->stDocumentData->Caption;
PosGor = Prn->PageWidth/2;
PosGor -= (pCanvas->TextWidth(String)/2);
pCanvas->TextOutA(PosGor,PosVert,String);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosGor = LeftWidth;//Ширина отступа слева - устанавливаем каретку
PosVert += pCanvas->TextHeight(String);
pCanvas->Font->Size = 10;
String = "Поставщик: " + Form1->stPostav->Caption+"\r\n";
int j = 1;
//Устанавливаем переносы
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
String = "Получатель: "+Form1->stFirmAddress->Caption+"\r\n";
j = 1;
PosGor = LeftWidth;
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String)*2;
PosGor = LeftWidth;
TRect Num;
TRect Cod;
TRect Name;
TRect EdIz;
TRect Cena;
TRect Colvo;
TRect Summ;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
Num.Left = PosGor;
Num.Right = PosGor+pCanvas->TextWidth("№ п/п")+1;
Num.Top = PosVert;
Num.Bottom = PosVert+pCanvas->TextHeight("№ п/п")+40;
Cod.Left = Num.Right;
Cod.Right = Num.Right+(pCanvas->TextWidth("Код")+20);
Cod.Top = PosVert;
Cod.Bottom = Num.Bottom;
Name.Left = Cod.Right;
Name.Right = Cod.Right+(pCanvas->TextWidth("Наименование")+500);
Name.Top = PosVert;
Name.Bottom = Num.Bottom;
EdIz.Left = Name.Right;
EdIz.Right = Name.Right+(pCanvas->TextWidth("Ед.изм")+2);
EdIz.Top = PosVert;
EdIz.Bottom = Num.Bottom;
Cena.Left = EdIz.Right;
Cena.Right = EdIz.Right+(pCanvas->TextWidth("Цена")+300);
Cena.Top = PosVert;
Cena.Bottom = Num.Bottom;
Colvo.Left = Cena.Right;
Colvo.Right = Cena.Right+(pCanvas->TextWidth("Кол-во")+300);
Colvo.Top = PosVert;
Colvo.Bottom = Num.Bottom;
Summ.Left = Colvo.Right;
Summ.Right = Colvo.Right+(pCanvas->TextWidth("Сумма")+500);
Summ.Top = PosVert;
Summ.Bottom = Num.Bottom;
pCanvas->Pen->Color = clWindowText;
pCanvas->Font->Size = 10;
pCanvas->Brush->Color = clActiveCaption;
pCanvas->Font->Color = clWhite;
pCanvas->TextRect(Num,Num.Left+1,Num.Top+10,"№ п/п");
pCanvas->TextRect(Cod,Cod.Left+10,Cod.Top+10,"Код");
pCanvas->TextRect(Name,Name.Left+10,Name.Top+10,"Наименование");
pCanvas->TextRect(EdIz,EdIz.Left+1,EdIz.Top+10,"Ед.изм");
pCanvas->TextRect(Cena,Cena.Left+10,Cena.Top+10,"Цена");
pCanvas->TextRect(Colvo,Colvo.Left+10,Colvo.Top+10,"Кол-во");
pCanvas->TextRect(Summ,Summ.Left+10,Summ.Top+10,"Сумма");
pCanvas->Brush->Color = clBlack;
pCanvas->FrameRect(Num);
pCanvas->FrameRect(Cod);
pCanvas->FrameRect(Name);
pCanvas->FrameRect(EdIz);
pCanvas->FrameRect(Cena);
pCanvas->FrameRect(Colvo);
pCanvas->FrameRect(Summ);
for(int i=0;i<InvoiceIn.GetProductCount();i++){
pCanvas->Brush->Color = clNone;
pCanvas->Brush->Style = bsClear;
pCanvas->Pen->Color = clWindowText;
pCanvas->Font->Color = clBlack;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height();
Num.Top = PosVert;
Num.Bottom = PosVert+pCanvas->TextHeight("№ п/п")+10;
Cod.Top = PosVert;
Cod.Bottom = Num.Bottom;
Name.Top = PosVert;
Name.Bottom = Num.Bottom;
EdIz.Top = PosVert;
EdIz.Bottom = Num.Bottom;
Cena.Top = PosVert;
Cena.Bottom = Num.Bottom;
Colvo.Top = PosVert;
Colvo.Bottom = Num.Bottom;
Summ.Top = PosVert;
Summ.Bottom = Num.Bottom;
ScladList.Product = ScladList.findId(InvoiceIn.getProduct(i));
pCanvas->TextRect(Num,Num.Left+10,Num.Top+10,IntToStr(i+1));
pCanvas->TextRect(Cod,Cod.Left+10,Cod.Top+10,IntToStr(ScladList.Product->GetCode()));
pCanvas->TextRect(Name,Name.Left+10,Name.Top+10,ScladList.Product->GetName());
pCanvas->TextRect(EdIz,EdIz.Left+1,EdIz.Top+10,ScladList.Product->GetPack());
pCanvas->TextRect(Cena,Cena.Left+10,Cena.Top+10,FloatToStr(ScladList.Product->GetPriceIn()));
pCanvas->TextRect(Colvo,Colvo.Left+10,Colvo.Top+10,FloatToStr(ScladList.Product->GetCount()));
pCanvas->TextRect(Summ,Summ.Left+10,Summ.Top+10,FloatToStr(ScladList.Product->GetPriceIn()*ScladList.Product->GetCount()));
pCanvas->Brush->Color = clBlack;
pCanvas->FrameRect(Num);
pCanvas->FrameRect(Cod);
pCanvas->FrameRect(Name);
pCanvas->FrameRect(EdIz);
pCanvas->FrameRect(Cena);
pCanvas->FrameRect(Colvo);
pCanvas->FrameRect(Summ);
}
pCanvas->Brush->Color = clWhite;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height()*2;
pCanvas->Font->Size = 14;
pCanvas->TextOutA(PosGor,PosVert,"Всего сумма: ");
pCanvas->TextOutA(Summ.Left,PosVert,FloatToStr(InvoiceIn.GetAmount()));
pCanvas->Font->Size = 12;
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += Num.Height()*2;
pCanvas->TextOutA(PosGor,PosVert,"Поставщик:_____________________ ");
pCanvas->TextOutA(PosGor+pCanvas->TextWidth("Поставщик:_____________________ ")+800,PosVert,"Получатель:_____________________ ");
PosVert += Num.Height()*6;
do{
pCanvas->TextOutA(PosGor,PosVert,"- ");
PosGor += pCanvas->TextWidth("- ");
}while(PosGor < Prn->PageWidth);
PosVert += Num.Height()*6;
return PosVert;
}
Цитата: Fevzi
У меня есть какие-то данные в таблице StringGrid.Каким образом можно вывести эти данные на печать, желательно вместе с самой таблицей?
На Торри нашёл вот такую печаталку СтрингГрида. Может быть, подойдёт.