QReport manuell füllen
-
Hallo,
wenn du mir damit sagen willst das ich erstmal die Grundlagen lernen soll
dann mach ich das gerne. Die Grundlagen von C++ kenn ich aber schon. Mir fehlen
die Grundlagen vom QReport das kann ich auch ganz offen zugeben. Mir ist zwar
klar wie ich den QReport von einer DB füllen lassen kann (dafür gibt es ja
ein Beispiel) aber wie das eben manuell geht weiß ich nicht und ich find auch
nichts darüber bis auf eben das Beispiel das bei mir leider nicht geht.Leider find ich in der Borland Hilfe nichts was mich weiterbringt. Deshalb
frag ich hier nach.
-
Bsp. in 5 min zusammengeschossen, gleich mit 4 Werten(DS) je Zeile (wie in Frage gestern).
void __fastcall TForm1::Button1Click(TObject *Sender) { m_nCounter=0; QuickRep1->Preview(); }void __fastcall TForm1::QRBand1BeforePrint(TQRCustomBand *Sender, bool &PrintBand) { m_nCounter = m_nCounter + 1; AnsiString asCounter = m_nCounter; ZeilenNummer->Caption= "Zeile " + asCounter; if (!ADOQuery1->Eof) { QRLabel1->Caption=ADOQuery1->FieldByName("auftrag")->AsString; ADOQuery1->Next(); } else QRLabel1->Caption="EOF"; if (!ADOQuery1->Eof) { QRLabel2->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString; ADOQuery1->Next(); } else QRLabel2->Caption="EOF"; if (!ADOQuery1->Eof) { QRLabel3->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString; ADOQuery1->Next(); } else QRLabel3->Caption="EOF"; if (!ADOQuery1->Eof) { QRLabel4->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString; } else QRLabel4->Caption="EOF"; }Deklaration
int m_nCounter; in unit1.hDie eigentliche Frage ist, hilft Dir das weiter?
Jetzt hast Du gesehen, wie ich das schnell und ohne Nachdenken gemacht habe.Das ist eine simple Lösung, keine schöne, keine intelligente!
-
Hallo!
Danke für deine Antwort. Leider hilft mir das nicht wirklich weiter.
Also was mir klar ist:
- wie man einen QReport mit Daten aus einer Datenbank füllt
- wie man Labels eines QReports mit Daten vollpacktDas einzigste wo es klemmt ist dem QReport zu sagen, dass nun eine
neue Zeile kommen soll. Ich nehme an der QReport wird dann wohl die
aktuelle Zeile fixieren und daher kann man dann wieder auf Label1 zugreifen.Es hängt bei mir wirklich nur an der einen Zeile
QReport->NextDataLine() oder was auch immer.
-
Bau das doch mal auf fixe Werte um!
Nimm OnNeedData zur Abfrage, ob weitere Daten (=Zeile !!!!) benötigt werden.
Zähle Deine Werte in BeforePrint hoch.Und Du wirst sehen, es funktioniert einwandfrei.
void __fastcall TForm1::Button1Click(TObject *Sender) { m_nCounter=0; m_nCounter2=0; QuickRep1->Preview(); } void __fastcall TForm1::QRBand1BeforePrint(TQRCustomBand *Sender, bool &PrintBand) { m_nCounter = m_nCounter + 1; AnsiString asCounter = m_nCounter; ZeilenNummer->Caption= "Zeile " + asCounter; QRLabel1->Caption=m_nCounter; m_nCounter2 = m_nCounter2 + 1; QRLabel2->Caption=m_nCounter; m_nCounter2 = m_nCounter2 + 1; QRLabel3->Caption=m_nCounter; m_nCounter2 = m_nCounter2 + 1; } //und in OnNeedData if (m_nCounter2=250) MoreData=false; else MoreData=true;Wo also liegt Dein Problem?
Die Lösung liegt direkt vor Deinen Augen.
-
Danke für deine Hilfe aber bei mir klappt das einfach nicht. Da muss irgendwas
anderes nicht stimmen. Ich hab auch versucht deine Beispiele umzuwandeln oder
das andere Beispiel das neulich gepostet wurde.Auf der Form:
- TButton (Button1)
- TQReport (QuickRep1) darauf TQRBand (QRBand1) darauf TQRLabel (QRLabel1)in der Form als private deklariert:
unsigned int iRow;OnNeedData:
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { QRLabel1->Caption = "test " + IntToStr(iRow); iRow++; MoreData = iRow < 5; }Button1
void __fastcall TForm1::Button1Click(TObject *Sender) { iRow = 1; QuickRep1->Preview(); }normal müsste nun 4 mal "test " und die Nummer dastehen. Bei mir
kommt aber nur Test 1
NeedData wird laut Debugger 4 mal aufgerufen das passt also. Durch spielerei
mit verschiedenen Bändern hab ich es auch schon (leider nicht reproduzierbar)
geschafft bis zu 3 Zeilen darzustellen. Das war mit einem ChildBand.Also irgendwie funktioniert bei mir der QReport nicht so wirklich...
-
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
{
QRLabel1->Caption = "test " + IntToStr(iRow);
iRow++;
MoreData = iRow < 5;
}Weisst du überhaupt für was MoreData zuständig ist?
MoreData heißt "mehr Daten" und ist ein bool Variable mit der du der Methode mitteilst ob noch Daten(Zeilen) kommen,
also es kommen noch Zeilen dann JA (true) und wenn nicht NEIN (false) übergeben.
-
und was mach ich mit dieser Zeile?
MoreData = iRow < 5;ich schaue ob iRow kleiner 5 ist (true) oder größer gleich 5 (false)
somit gibt es mehr Daten wenn iRow kleiner als 5 ist und sonst nicht.
Ist doch alles richtig oder? Ich hab schon verstanden was ich gemacht
hab aber nciht warum die anderen geposteten Beispiele bei euch funktionieren
und bei mir nicht.Muss man vom QReport noch irgendwelche Updates einspielen? Ich verwende die
Version die bei BCB6 dabei ist. Die BCB6 Updates (v4 + Linker) hab ich gemacht.
-
hast du QRBand1->BandType = rbDetail; eingestellt?
falls nicht mach das mal
-
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { QRLabel1->Caption = "test " + IntToStr(iRow); iRow++; MoreData = iRow < 5; }Ist dir ist bewusst, das er so auch kein "test 4" anzeigen kann ?
-
Danke! Es lag am BandType
