Drucken funktioniert (noch) nicht richtig...
-
Hallo,
ich drucke mit nachfolgendem Code den Inhalt aus einem Memo-Feld. Das funktioniert auch soweit ganz gut. Allerdings möchte ich den Inhalt des Memos auf dem Blatt in drei Spalten aufteilen. Irgendwie bin ich schon wieder zu blöd das richtig hinzubekommen. Entweder wird der erste und zweite Block gedruckt oder der erste und der dritte. Alle zusammen wollen nicht. Falls jemand helfen kann wäre ich echt dankbar.
Hier mein Code:
void __fastcall Tf_abrechnung_streifen_import::Button6Click(TObject *Sender) { void druck(); { int x; static int lineHoehe, lineCount, lineSeite, lineBlock; // Printer Setup Dialog aufrufen if (!PrinterSetupDialog1->Execute()) return; // Font festlegen Printer()->Canvas->Font->Name = "Courier"; Printer()->Canvas->Font->Size = 7; // Höhe einer Zeile berechnen lineHoehe = abs(MulDiv(Printer()->Canvas->Font->Size, GetDeviceCaps(Printer()->Handle, LOGPIXELSY), 72)); lineHoehe *= 1.4; lineSeite = (Printer()->PageHeight / lineHoehe) - 4; lineBlock = 330; // Startzeile zum drucken festlegen lineCount = 9; // Name für Druckjob festlegen Printer()->Title = "Streifen"; // Drucken beginnen Printer()->BeginDoc(); // In Position x-Achse 300 eine Überschrift Printer()->Canvas->TextOut(330, 2 * lineHoehe, "Streifen"); // Alle Zeilen von Memo auf x-Achse 200 ausgeben for (x = 0; x < Memo1->Lines->Count; x++) { Printer()->Canvas->TextOut(lineBlock, lineCount * lineHoehe, Memo1->Lines->Strings[x]); lineCount++; // Neuer Block falls Block 1 voll ist if (lineCount == lineSeite) { lineCount = 9; lineBlock = 1450; } if (lineBlock == 1450) { // Neuer Block falls Block 2 voll ist if (lineCount == lineSeite) { lineCount = 9; lineBlock = 2570; } } } // Drucken Ende Printer()->EndDoc(); } }
Gruss Maik
-
Deine Abfrage 'lineCount == lineSeite' wird für alle Blöcke erfüllt...
Warum überhaupt diese speziellen Abfragen?
for (...) { ... lineCount++; if(lineCount >= lineSeite) // besser auf >= testen (man weiß ja nie) { lineCount = 9; lineBlock += 1120; // Differenz zwischen den Blöcken } }
-
Danke für die Anwort.
In der ersten IF-Abfrage wird geprüft ob die Seite von den Zeilen her voll ist, wenn ja soll er den Rest in den zweiten Block schreiben. In der zweiten If-Abfrage wird geprüft ob der zweite Block voll ist, wenn ja soll der Rest in den dritten Block geschrieben werden.
-
Hallo,
schau dir doch erstmal das Beispiel von Th69 richtig an... Es macht genau das, was du willst und ist dabei wesentlich übersichtlicher als deine Version. Damit würde die for-Schleife schonmal so aussehen:for(x= 0; x < Memo1->Lines->Count; x++){ Printer()->Canvas->TextOut(lineBlock, lineCount * lineHoehe, Memo1->Lines->Strings[x]); lineCount++; if(lineCount >= lineSeite){ lineCount= 9; lineBlock+= 1120; } }
Ich kann in dieser for-Schleife momentan kein Problem entdecken - schau doch mal mit dem Debugger, ob die (in der for-Schleife genutzten) Variablen immer richtig initialisiert sind (speziell lineSeite)! Ich habe die Vermutung, dass bei den vorhergehenden Berechnungen nicht immer dasselbe herauskommt...
MfG
-
Sorry, ich habe nicht gesagt das es nicht funktioniert, ich habe nur erklärt warum ich diese beiden Schleifen hatte.
Danke an alle, es funktioniert jetzt...
Gruss
Maik
-
maikmueller schrieb:
Sorry, ich habe nicht gesagt das es nicht funktioniert, ich habe nur erklärt warum ich diese beiden Schleifen hatte.[...]
Verstehe, ich dachte du wolltest dich weigern deinen Quellcode übersichtlicher zu gestalten...
maikmueller schrieb:
[...]Danke an alle, es funktioniert jetzt...[...]
Aha! Und woran lag es? Ich kann mir nicht vorstellen, dass es an den Abfragen in der for-Schleife lag...
MfG