Alphabet in QuickReport drucken.....Problem!
-
Hallo!
Ich würde gerne in meinem QuickReport ein Alphabet ausdrucken, also einzelne Bänder.
Das Alphabet wird durch eine for-Schleife erzeugt.
Wie schaffe ich es, dass pro Band ein Buchstabe benutzt wird.
Kann ja als Dataset nicht meine Schleife angeben.....:-)
Für eine kurze Hilfe wäre ich dankbar.
Gruß
Maik
-
Man kann mit dem QuickReport auch ohne Dataset drucken.
Dafür ist das OnNeedData Ereignis zuständig.
Setzte einfach in deinen Band ein QRLabel und weisse im OnNeedData den Caption
den gewünschten Wert zu.Beispiel:
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { static int Row = 1; AnsiString myString = "abcdefghijklmnopqrstuvwxyz"; if (Row <= 26) MoreData = true; else MoreData = false; if (MoreData) { QRLabel1->Caption = myString[Row]; Row++; } else Row = 1; }
-
Danke für die rasche Antwort, so funktionierts eigentlich auch schon ganz gut. Wollte aber eigentlich 4 Buchstaben pro Zeile haben.
Leider häng ich hier schon wieder.
Schöne Grüße
Maik
-
Hallo!
Ich habe nun versucht die Schleife zu ergänzen, leider ist das Ergebnis immer, dass dann 4 x derselbe Buchstabe pro Reihe vorkommt.
Ich möchte ja aber 4 Buchstaben des Alphabets pro Zeile, also in Zeile 1
A,B,C,D in Zeile 2 E,F,G,H usw.Kann mir da jemand weiterhelfen? ich komm sonst hier nicht weiter.
Gruß
Maik
-
Du musst hier ansetzen:
if (MoreData) { QRLabel1->Caption = myString[Row]; Row++; }Anstatt nur einen Buchstaben auszugeben, musst du halt gleich vier ausgeben und Row um vier erhöhen.
P.S. Wenn du Beispielcode posten würdest, könnte man dir bestimmt besser helfen.
-
Ich hatte es so versucht:
void __fastcall Tf_alphabetaufkleber_drucken::QuickRep1NeedData( TObject *Sender, bool &MoreData) { static int Row = 1; AnsiString myString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (Row <= 26) MoreData = true; else MoreData = false; if (MoreData) { QRLabel1->Caption = myString[Row]; Row++; QRLabel2->Caption = myString[Row]; Row++; QRLabel3->Caption = myString[Row]; Row++; QRLabel4->Caption = myString[Row]; Row++; } else Row = 1;Leider bricht er sofort mit einem Fehler ab.
Auch andere Versuche sind gescheitert, weil er immer nur 2 Buchstaben geschrieben hat und dann in die nächste Zeile gesprungen ist.
Für eine kurze Antwort wär ich dankbar
Gruß
Maik

-
Die Fehlermeldung wäre jetzt auch hilfreich zu wissen.
Ein Fehler in dem Beispielcode ist, das die Arraygrenze überschritten wird, d.h. du greifst auf myString[27] zu.
-
Die Fehlermeldung lautet:
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
Wie kann ich das überschreiten verhindern?
Gruß
Maik
-
Z. B. so:
if (Row <= 26) QRLabel2->Caption = myString[Row];oder so:
AnsiString myString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";...
-
Jetzt sind wir wieder am Anfang:
if (Row <= 26) QRLabel2->Caption = myString[Row];Dieser Code kommt bei mir bereits vor!
Noch mal, was ich möchte:
Pro Zeile 4 Buchstaben des Alphabets, solang bis das Alphabet durch ist!
Schöne Grüße
Maik
-
solange du 26 Buchstaben durch 4 teilen willst gibt das immer eine Überschreitung,
also versuch einfach mal Finkis Tipp und mach an myString noch 2 Leerzeichen dranund denk dran: du willst was von uns, nicht wir von dir

-
Ich hatte den Beitrag von Finki nicht richtig gelesen,
aber so funktionierts.
Vielen Dank.
Wollte nicht unhöflich sein.
Gruß
Maik
-
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { static int al = 0; TQRLabel *label[4]={QRLabel1,QRLabel2,QRLabel3,QRLabel4}; int i; for(i=0;i<4;i++) { if(al+i<26) label[i]->Caption=char(65+al+i); else label[i]->Caption =EmptyStr; } al+=i; if(al<26) MoreData=true; else MoreData=true; }