TQRLabel dynamisch zur Laufzeit erzeugen
-
Hi,
ich kämpfe grad mit den QuickReports, und zwar möchte ich zur Laufzeit einige TQRLabels erzeugen, beschriften und anzeigen. Das Ganze passiert als in einem TQRSubDetail und dient zur Ausgabe einer Tabellenzeile. Im Konstruktor des Formulars erzeuge ich die Labels in folgender Schleife:
//---------- Schnipp ------------------// for( unsigned int uiCol = 0; uiCol < ColCount; ++uiCol ) { TQRLabel* pLabel = dynamic_cast<TQRLabel*>( SubDetailBand->AddPrintable( __classid( TQRLabel ) ) ); if( NULL != pLabel ) { pLabel->Parent = SubDetailBand; pLabel->Top = 2; pLabel->Height = 14; pLabel->Font->Size = 7; pLabel->Visible = true; pLabel->Transparent = true; pLabel->AutoSize = false; pLabel->WordWrap = false; // erzeugtes Label in Vektor einfügen CellLabels.push_back( pLabel ); } }
Im Ereignishandler OnBeforePrint des vorhergehenden Bandes bestimme ich dann die benötigte Breite und Positionen der Labels und setze sie entsprechend:
void __fastcall TFormReport::OnBeforePrint( TCustomBand* Sender, bool& PrintBand ) { // nutzbare Papierbreite bestimmen double dPageWidth = QuickRep->PageWidth - QuickRep->LeftMargin - QuickRep->RightMargin; // Zellenbreite bestimmen double dCellWidth = dPageWidth / CellLabels.size(); for( unsigned int uiCell = 0; uiCell < CellLabels.size(); ++uiCell ) { // Printable Size anpassen CellLabels[uiCell]->Size->Left = uiCell * dCellWidth; CellLabels[uiCell]->Size->Width = uiCell * dCellWidth; } }
Leider funktioniert das nicht so, wie gedacht. Die Labels werden zwar erzeugt, aber nur horizontal richtig positioniert. Die Anzahl der Zeilen stimmt ebenfalls, aber die Zellen überlappen sich vertikal bzw. werden nicht angezeigt. Muss ich noch irgendwas anderes setzen?
-
Korrektur:
Die Breite des Labels ist natürlich nur dCellWidth und nicht, wie geschrieben, iCellIndex * dCellWidth.
-
So, Problem gefunden und gelöst.
Ich habe bei der Reihenfolge der QuickReport Ereignisse ein wenig danebengelegen, sie sind nicht in der Reihenfolge aufgetreten, in der ich es erwartet hätte. Musste ein paar Funktionsaufrufe aus einem Handler in einen anderen verschieben und nun klappts.