ListView drucken
-
Setzen 6
-
VergissEs schrieb:
Setzen 6
das bedeutet wohl ich bin zu blöd um das zu kapieren...
-
Naja mit aneinanderreihen von gefunden Code wird das nichts,
man solle schon wissen was man tut.Also Grundlagen lernen.
Und Print() druckt eben die Form aus, wenn du die Form nicht ausdrucken willst
dann darfst du es auch nicht anwenden
-
VergissEs schrieb:
Naja mit aneinanderreihen von gefunden Code wird das nichts,
man solle schon wissen was man tut.Also Grundlagen lernen.
Und Print() druckt eben die Form aus, wenn du die Form nicht ausdrucken willst
dann darfst du es auch nicht anwenden
-
Gut dann hier die Lösung,
void __fastcall TForm1::PrintBtnClick(TObject *Sender) { //ListView1 = das zu druckende ListView //PrintDialog1 = die PrintDialog PrintListview(ListView1, PrintDialog1, "Druckauftrag Titel"); } //--------------------------------------------------------------------------- void PrintListview(TListView *lv, TPrintDialog *PrintDialog, String sTitel) { ...
und schmeiß die ganzen
... Printer()->Canvas->TextOut(10,80,Form2->ListView2->Items->Item[4]->Caption); Printer()->Canvas->TextOut(10,80,Form2->ListView2->Items->Item[5]->Caption); ...
aus der Funktion PrintListview wieder raus!
-
Also wie schon oben bereits gesagt, man sollte wissen, was der ganze Code bedeutet, aber versuch doch mal es ohne diesen Vector-Quatsch das zu machen.
Denk doch mal ein bissl logisch: Also du versuchst alle Einträge einer Listview auszudrucken, aber nicht die ListView selbst.
D.H. dein Programm muss erstmal den Druck vorbereiten...
Printer()->Title="Mein ListView Ausdruck"; Printer()->BeginDoc()
Dann musst das Programm jeden Eintrag deines Listviews durchgehen - eleganterweise mit einer for-Schleife. In dieser Schleife liest du jeden Eintrag aus und zeichnest den Wert auf das Canvas des Printer().
int Zeile=20; ///-----Startposition von oberen Rand for (int i=0;i<ListView1->Items->Count;i++) { Printer()->Canvas->TextOut(20,Zeile,ListView1->Items->Item[i]->Caption); Zeile+=Printer->Canvas->TextHeight(ListView1->Items->Item[i]->Caption)+10; ///Zeilenabstand berechnen //---Neue Seite nehmen, wenn z.B. Seite nach 30 Einträgen voll sein sollte if (i==30) { Printer()->NewPage(); Zeile=10; } }
Zum Schluss natürlich den Druck freigeben...
Printer()->EndDoc();
Fertig!
Also, das war schon alles. Natürlich muss vieles modifiziert werden, wenn du auch die SubItems eines Eintrages haben willst, aber mehr brauchst du eigentlich nicht....
PrintDialog->Execute() brauchst du nur wenn du vor dem Drucken unbedingt einen Drucker auswählen willst, aber ist nicht notwendig, denn ohne das wird der Standarddrucker genommen...
Um alles natürlich besser zu machen, müsstest du Berechnungen über die max. Anzahl der Zeilen pro Seite machen, oder den Seitenrand noch berücksichtigen, aber dazu ein anderes mal.
-
VergissEs schrieb:
Gut dann hier die Lösung,
void __fastcall TForm1::PrintBtnClick(TObject *Sender) { //ListView1 = das zu druckende ListView //PrintDialog1 = die PrintDialog PrintListview(ListView1, PrintDialog1, "Druckauftrag Titel"); } //--------------------------------------------------------------------------- void PrintListview(TListView *lv, TPrintDialog *PrintDialog, String sTitel) { ...
und schmeiß die ganzen
... Printer()->Canvas->TextOut(10,80,Form2->ListView2->Items->Item[4]->Caption); Printer()->Canvas->TextOut(10,80,Form2->ListView2->Items->Item[5]->Caption); ...
aus der Funktion PrintListview wieder raus!
kann leider nicht compiliert werden= call to undefined function 'PrintListView'
das kam immer wenn ich irgendwo listview angegeben hatte.
trotzdem dankeschön ihr beiden!!!
-
@Hawkxxx
schon mal geschaut was die Funktion PrintListview macht ?
und vector als quatsch zu bezeichnenna dann bleib bei deinen "starren" Arrays und schau nicht über den Tellerrand, könnte ja was neues kommen
assassipretzel schrieb:
kann leider nicht compiliert werden= call to undefined function 'PrintListView'
das kam immer wenn ich irgendwo listview angegeben hatte.Du musst die Funktion natürlich noch im Header bekannt machen
> C++ GRUNDLAGEN <<<<<<<<
void PrintListview(TListView *lv, TPrintDialog *PrintDialog, String Titel);
-
so meinte ich es nicht, aber man sollte es so einfach wie möglich für einen Anfänger machen, denn wenn man vector benutzt, dann muss man sich wieder damit noch auseinandersetzen - was meiner Meinung nach für sein Problemchen überflüssig ist.
Ich wollte nur, dass er erstmal mit den einfachen Mitteln arbeitet und nicht sich mit neuen Headern und neuen Funktionen auseinandersetzt.Aber letztendlich ist er derjenige, der sich für eine einfache oder komplizierte Lösung entscheiden muss...
-
Hawkxxx schrieb:
so meinte ich es nicht, aber man sollte es so einfach wie möglich für einen Anfänger machen, denn wenn man vector benutzt, dann muss man sich wieder damit noch auseinandersetzen - was meiner Meinung nach für sein Problemchen überflüssig ist.
Ich wollte nur, dass er erstmal mit den einfachen Mitteln arbeitet und nicht sich mit neuen Headern und neuen Funktionen auseinandersetzt.Aber letztendlich ist er derjenige, der sich für eine einfache oder komplizierte Lösung entscheiden muss...
So habe ich früher auch gedacht, aber inzwischen bin ich anderer Meinung. Die Benutzung der STL ist mMn elementar und man sollte sich so früh wie möglich angewöhnen sie zu benutzen. Ansonsten eignet man sich Sachen an, die man schwer wieder los wird. Wenn die dynamischen C-Style arrays funktionieren warum sollte ich mich dann um Alternativen kümmern? malloc/realloc sind auch nur Einzeiler, warum sollte da ein std::vector::push_back() oder std::vector::resize() besser sein?
Die STL gehört zu den Grundlagen, auch wenn man anfangs nicht viel versteht bzw. die Einarbeitungszeit etwas länger ist. Aber es zahlt sich langfristig aus, weil der höhere Zeitaufwand zum Lernen durch kürzerer Entwicklungszeiten kompensiert wird, und ab einem bestimmten Zeitpunkt überwiegt die Zeiteinsparung bei der Entwicklung.Du kannst natürlich so lange irgendwelche Codezeilen irgendwie hin- und herschieben, bis irgendwann irgendetwas herauskommt das irgendwie Ähnlichkeit mit dem Wunschergebnis hat. Das Ausdrucken einer ListView ist trivial, und wenn du dazu schon mehrmals fragen musst fehlen dir einfach die nötigen Grundlagen.
Also: Basics lernen! Am besten suchst du dir ein gutes Buch (Vorschläge gibts hier im Forum) und arbeitest das durch.
-
VergissEs schrieb:
Du musst die Funktion natürlich noch im Header bekannt machen
> C++ GRUNDLAGEN <<<<<<<<
void PrintListview(TListView *lv, TPrintDialog *PrintDialog, String Titel);
thx