S
Ok, also ein funktion, die über Printer() ein Formular ausdruckt, einen rand lässt, unten Page anzeigt, und automatisch neue Seite druckt, wenn rand erreicht wird:
Funktion:
void TOwnPad::PrintFooter(TRect& rect,int lineheight)
{
char buff[10];
wsprintf(buff,"Page %d",Printer()->PageNumber);//Für Page
rect.Top=Printer()->PageHeight-(lineheight*2); //Rand oben
rect.Bottom=rect.Top+lineheight; //Rand unten
DrawText(Printer()->Handle,buff,-1,&rect,DT_CENTER); //zum "schreiben"
Printer()->Canvas->MoveTo(0,rect.Top-2); //eine Linie über Seitenanzahl
Printer()->Canvas->LineTo(rect.Right,rect.Top-2); //
}
Und der aufruf..
void __fastcall TOwnPad::printBtnClick(TObject *Sender)
{
if (PrintDialog->Execute())
{
String blank = " ";
Printer()->Title = "OwnPad" + blank + SaveDialog->FileName; //Name in Druckfenster
Printer()->Canvas->Font = Memo->Font;
int lineheight= abs(MulDiv(Printer()->Canvas->Font->Size,GetDeviceCaps(Printer()->Handle,
LOGPIXELSY),72)); //Berechnung der Höhe der Linien zum drucken, ABS das nich negativ
lineheight *=1.4; //
int linesperpage = (Printer()->PageHeight/lineheight)-4; //4 Zeilen wegnehmen
int linecount = 4;
Printer()->BeginDoc();
TRect rect;
rect.Top=lineheight;
rect.Left=20;
rect.Right=Printer()->PageWidth;
rect.Bottom=lineheight*2;
DrawText(Printer()->Handle,OpenDialog->FileName.c_str(),-1,&rect,DT_CENTER);
for (int i =0;i<Memo->Lines->Count;i++)
{
if(linecount++==linesperpage) //wenn linesperpage erreicht wird dann..
{
PrintFooter(rect,lineheight);
linecount=4;
Printer()->NewPage(); //...neue Seite
}
String s = Memo->Lines->Strings[i]; //jede Zeile drucken
Printer()->Canvas->TextOutA(0,linecount*lineheight,s);
}
PrintFooter(rect,lineheight);
Printer()->EndDoc();
}
}
und eben in der Headerdatei die deklaration nich vergessen für funktion!