TPrinter,Canvas, der Drucker druckt anders als gewollt



  • Hallo, ich hab zwei Probleme:
    Das erste ist, daß ich in einem Simulationsprogramm die Simulation auf die Zeichenfläche (Canvas) zeichne (also Feld + Kreise für die Belegung) und
    das ausdrucken will. Dafür habe ich die ganze Prozedur umgeändert um direkt auf
    die Zeichenfläche von TPrinter zu schreiben.
    Das Feldgitter ist auch richtig angeordnet, aber der Versuch die Belegung
    (rote Kreise) genau in die Mitte von bestimmten Feldern zu zeichnen scheitert.
    Die Kreise haben plötzlich unterschiedlich Größen, haben zu einander überlappende und verzogene Lagen und liegen ganz und gar nicht da, wo sie im
    Feldgitter erscheinen sollen. Wenn mir jemand meinen Denkfehler aufzeigen kann wäre ich dankbar, hab leider noch zu wenig erhahrung mit der VCL und C++
    Hier ist der Code:

    void __fastcall TLifeHauptForm::DruckenClick(TObject *Sender)
    {
    
            TPrinter *pPrinter=Printer(); //Zeiger auf das Druckerobjekt speichern
            TColor farbe=clRed;
            pPrinter->BeginDoc(); //Druckvorgang starten
    
            pPrinter->Canvas->Pen->Color=clBlack;
            pPrinter->Canvas->Pen->Width=1;
            int fh=1;
            int fb=1;
            LifeGrafik->Feldzeichnen(fh,fb); 
    
    /*gibt die Feldhöhe fh und   
    Feldbreite   fb zurück*/
    
            int h=pPrinter->PageHeight/fh;
            int b=pPrinter->PageWidth/fb;
            int x=h<b?h:b;
            int h1=pPrinter->PageHeight-(x*fh);
            int b1=pPrinter->PageWidth-(x*fb);
            int dh=0;
            int db=0;
            if (((h1/2)+(h1/2))<h1) {dh=1;}
            if (((b1/2)+(b1/2))<b1) {db=1;}
    
            if (x>1)
            {
                    for(int i=h1/2;i<=(pPrinter->PageHeight-(h1/2+dh));i+=x)
                    {
                    pPrinter->Canvas->MoveTo(b1/2,i);
                    pPrinter->Canvas->LineTo(pPrinter->PageWidth-(b1/2+db),i);
                    }
                    for(int i=b1/2;i<=(pPrinter->PageWidth-(b1/2+db));i+=x)
                    {
                    pPrinter->Canvas->MoveTo(i,h1/2);
                    pPrinter->Canvas->LineTo(i,pPrinter->PageHeight-(h1/2+dh));
                    }
             }
    
             //----------------------------
    
            for (int j=0;j<fb;j++)
            {
            for (int i=0;i<fh;i++)
            {
    
                    if (LifeGrafik->FeldBelegungAnzeigen(j,i)==1)
    //Liefert 1, wenn das Feld [j][i] belegt ist
                    {
    
                            int x1=(i*x)+(h1/2)+1;
                            int y1=(j*x)+(b1/2)+1;
                            x--;
                            /*Beginn des Problems! MoveTo ist immer nur 
                            reine Verzweiflung! */
    
                            pPrinter->Canvas->Brush->Color = farbe;
                            pPrinter->Canvas->Pen->Color= farbe;
                            if (x>=3)
                            {
                            pPrinter->Canvas->Brush->Style = bsSolid;
                            pPrinter->Canvas->MoveTo(y1+(x/2),x1+(x/2));
                            pPrinter->Canvas->Ellipse(y1, x1, y1+x, x1+x);
                            }
                            else if(x==2)
                            {
                            pPrinter->Canvas->Pixels[y1][x1]=farbe;
                            pPrinter->Canvas->MoveTo(y1+1,x1);
                            pPrinter->Canvas->Pixels[y1+1][x1]=farbe;
                            pPrinter->Canvas->MoveTo(y1+1,x1+1);
                            pPrinter->Canvas->Pixels[y1+1][x1+1]=farbe;
                            pPrinter->Canvas->MoveTo(y1,x1+1);
                            pPrinter->Canvas->Pixels[y1][x1+1]=farbe;
                            }
                            else if (x==1)
                            {
                            pPrinter->Canvas->MoveTo(y1,x1);
                            pPrinter->Canvas->Pixels[y1][x1]=farbe;
                            }
    
                    }
    
            }
            }
    
            pPrinter->EndDoc(); //Druckvorgang beenden
    
    }
    

    So und das zweite Problem ist, daß ich die Simulation in einer Schleife durchlaufen lasse und man aber in der Lage sein soll, diese zu unterbrechen, indem man auf einen Button klickt. Jedoch führt das Programm diesen Mausklick bzw. Tastenklick erst nah Durchlauf der Schleife aus. Also muß ich irgendwie auf die von Windows protokolierten Tastenklicks zugreifen. Habe hier im Forum etwas über ProcessMessages gesehen und werde mal versuchen mich da rein zu finden, aber Hinweise und Ideen kämen mir auch gelegen *g*

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • Zur zweiten Frage gibt's einen eigenen FAQ-Beitrag ("Schleife durch Button abbrechen").

    In Zukunft für neue Fragen bitte immer auch einen neuen Thread benutzen. Natürlich nicht, ohne vorher ausführlich von der BCB-Hilfe, der FAQ und der Suchfunktion hier Gebrauch gemacht zu haben. Danke!


Anmelden zum Antworten