Drucken über Printer(), finde Fehler nicht..
-
Hi LEute, heute nen sicher schusselfehler...aber ich finde fehler einfach nicht!
void __fastcall TOwnPad::printBtnClick(TObject *Sender) { if (PrintDialog->Execute()) { Printer()->Title = "OwnPad" + SaveDialog->FileName; Printer()->Canvas->Font = Memo->Font; int lineheight= abs(MulDiv(Printer()->Canvas->Font->Size,GetDeviceCaps(Printer()->Handle, LOGPIXELSY),72)); lineheight *=1.4; int linesperpage = (Printer()->PageHeight/lineheight)-4; 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) { PrintFooter(rect,lineheight); linecount=4; Printer()->NewPage(); } String s = Memo->Lines->Strings[i]; Printer()->Canvas->TextOutA(0,linecount*lineheight,s); } PrintFooter(rect,lineheight); Printer()->EndDoc(); } }hier soll eben über eine eigene Funktion PageFooter gedruckt werden....aber ich bekomme hier den fehler:
Konvertierung von TRect nach tagREct* nicht möglich, in der Zeile:
DrawText(Printer()->Handle,OpenDialog->FileName.c_str(),-1,rect,DT_CENTER);aber stimmt die DrawText Funktion so denn nicht?
PS: soviel hab ich mit der noch nich gearbeitet!
-
Hast Du Dir mal die Beispiele zu Printer in der BCB-Hilfe angeschaut?
DrawText() wie Du es verwendest habe ich nicht im Zusammenhang mit Printer gesehen.
Allerdings habe ich noch nie damit gearbeitet. Die konkreten Beispiele in der Hilfe sollten
aber für einen Start ausreichen.Gruß,
Alexander
-
DrawText erwartet an der Stelle einen Pointer auf eine Struktur vom Typ RECT (nicht TRect). Also folgendermaßen:
RECT 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);Ob das Drucken dann so funktioniert weiß ich aber auch nicht, da ich in diesem Zusammenhang DrawText noch nicht verwendet habe.
Siehe auch http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_0odw.asp
-
Ah es geht jetzt, waren paar fehler, einmal hatte ich stdlib nicht inkludiert!
Dann hatte ich im Protoyp der Funktion nen Fehler...
Und ich hatte vor dem rect das & vergessen....jetzt geht es einwandfrei...danke!
-
Zeig doch mal, wie es jetzt funktioniert. Nur so interessehalber, vielleicht braucht's ja
irgendjemand mal (am Ende vielleicht ich selbst
)Gruß,
Alexander
-
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!