Mehrere Datensätze Drucken in Tabellenform

UrsaMajor

Mitglied
Hallo zusammen,

ich möchte eine Textdatei die mehrere Datensätze beinhaltet ausdrucken lassen. Vorher ließt mein Programm die Datensätze ein. Meine Frage ist jetzt wie kann ich das in Tabellen Form ausgeben sodass ich auf dem Ausdruck Linien habe und wie kann ich mehrere Zeilen in ein RichText das ich fürs Drucken anscheinend brauche hinzufügen. Gibt es auch andere Möglichkeiten mein Projekt zu realisieren. Habe den Borland 1.0 c++ Builder Standart!


Gruß
Ursa
 
Du kannst den Druck über einen DC realisieren. Das Knifflige daran ist lediglich, den richtigen Drucker-HDC zu erhalten.

Dann kannst du über GDI auf den DC ganz normal wie auf einer Grafik Texte ausgeben und Linien zeichnen.
 
Sorry das ich nochmal nach Frage,

aber was ist DC und HDC und GDI, bin noch nen was c++ angeht. Kannst du mir vielleicht sowas wie ein Beispiel geben?
 
Ich hab direkt nix gefunden, im Büro hab ich aber einen Schnipsel. Ist nämlich ein bisschen aufwendig (Drucker enumerieren, Namen aussuchen, DC erstellen, .usw).

Ich kann dir den am Montag hier reinposten. Erinnere mich notfalls daran :)
 
Siehste, hab ich doch am Montag prompt vergessen. Achtung, die Schnipsel sind aus dem Code rauskopiert, da gibts bestimmt fehlende Definitionen. Aber das Grundgerüst sollte funktionieren.

Anmerkung:

Das ist saumässig umständlich, aber dafür kannst du da auch Grafik drauf malen.

Hier das Drucker enumerieren (sprich alle Drucker auflisten):

Code:
// benötigte Puffergrösse feststellen
 EnumPrinters( PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK | PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned );

 if(dwNeeded)
  { 
    BYTE* pBuffer = new BYTE[dwNeeded];
    memset(pBuffer,0,dwNeeded);

    // Druckerliste abfragen
    if ( EnumPrinters( PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK | PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_DEFAULT, NULL, 2, pBuffer, dwNeeded, &dwNeeded, &dwReturned ) ) 
      DWORD dwErr = GetLastError();

    PRINTER_INFO_2 *pinfo5 = (PRINTER_INFO_2*) pBuffer;

    for(i = 0;i < dwReturned;i++)
     {
       // wichtig, hier pinfo5[i].pPrinterName merken, wird für CreateDC gebraucht!
        wsprintf(cText,"%s",pinfo5[i].pPrinterName);
 
     }
   delete[] pBuffer;
  }

Und Drucken selbst:

Code:
HDC CBelegPrinter::CreateHandleForDC( const char* printerName )
{

  HANDLE             hPrinter;

  if ( ( ::OpenPrinter( const_cast<TCHAR*>( printerName ), &hPrinter, NULL ) ) )
  {
    LPPRINTER_INFO_2  lpPrinterInfo2 = NULL;
    DWORD             sizeOfPrintInfo = 0;
    DWORD             cbReturned = 0;

    ::GetPrinter( hPrinter, 2, NULL, 0, &sizeOfPrintInfo );

    lpPrinterInfo2 = (LPPRINTER_INFO_2)new char[sizeOfPrintInfo];

    if ( ::GetPrinter( hPrinter,              // handle to printer
                       2,                        // information level
                       (LPBYTE)lpPrinterInfo2,   // printer information buffer
                       sizeOfPrintInfo,          // size of buffer
                       &cbReturned ) )             // bytes received or required
    {
      m_hDC = ::CreateDC( lpPrinterInfo2->pDriverName, 
                          lpPrinterInfo2->pPrinterName, 
                          NULL, 
                          lpPrinterInfo2->pDevMode );
    }

    delete[] lpPrinterInfo2;
    lpPrinterInfo2=NULL;

    ClosePrinter( hPrinter );
  }
  return m_hDC;

} 



// Druckvorgang
HDC m_hDC = CreateHandleForDC( szGemerkterDruckerName );

  DOCINFO di;

  memset( &di, 0, sizeof( di ) );
  di.cbSize = sizeof( DOCINFO );
  di.lpszDocName = "Mein Drucki!";

  if ( StartDoc( m_hDC, &di ) <= 0 )
  {
    DeleteDC( m_hDC );
    return false;
  }

  if ( StartPage( m_hDC ) <= 0 )
  {
    AbortDoc( m_hDC );
    DeleteDC( m_hDC );    
    return false;
  }

// hier auf dem DC rumkrakeln


// Druck abschliessen bzw. drucken
  if ( EndPage( m_hDC ) > 0 )
  {
    EndDoc( m_hDC );
  } 	   

DeleteDC( m_hDC );


Wenn das auf Anhieb klappen sollte, hätte ich gerne Senf zu dem Besen, den ich fressen werde.
 
Das ist so ein Begriff, um Nicht-Eingeweihte zu verwirren. Bedeutet auf- bzw. durchzählen.

Das gibt es in Windows bei vielen Dingen, Drucker, DirectX-Grafik-Adapter, DirectX-Sound-Adapter, und und und.
 
Zurück