Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zwei Datensätze mit for-Schleife auf eine Seite drucken (https://www.delphipraxis.net/131655-zwei-datensaetze-mit-schleife-auf-eine-seite-drucken.html)

Luckie 28. Mär 2009 20:35

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
Ach so. Gut. Verstanden.

Aber damit stimmt noch was nicht. Das ist irgendwie nur jeder zweite oder dritte Datensatz.

jfheins 28. Mär 2009 21:16

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
Zitat:

Zitat von Luckie
Ach so. Gut. Verstanden.

Aber damit stimmt noch was nicht. Das ist irgendwie nur jeder zweite oder dritte Datensatz.

Okay, sorry - hatte noch ein paar Fehlerchen drin :stupid:


Hier der (getestete) C# Quellcode:
Code:
for (int i = 0; i < (ContactCount + SetsPerPage - 1) / SetsPerPage; i++)
            {
                for (int j = 0; j < SetsPerPage; j++)
                {
                    if ((i * SetsPerPage + j) == ContactCount) break;
                    listBox1.Items.Add(string.Format("Index: {0} ; Seite: {1} ; Nummer {2}", i * SetsPerPage + j, i + 1, j + 1));
                }
                if (i != (ContactCount - 1) / SetsPerPage)
                     listBox1.Items.Add("--- New Page ---");
            }

Luckie 28. Mär 2009 21:27

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
So passt es jetzt:
Delphi-Quellcode:
procedure TPrintContacts.PrintAllContacts;
var
  i: Integer;
begin
  Printer.Title := 'Adressdatenbank - Kontaktliste drucken';
  Printer.Orientation := poPortrait;
  Printer.BeginDoc;
  FCanvas := Printer.Canvas;
  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);
  FPaperWidth := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE);
  FPaperHeight := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE);
  for i := 0 to (FContactList.Count - 1) div CONTACTS_PER_PAGE do
  begin
    PrintAllContactsHeader;
    PrintAllContactsFooter(Printer.PageNumber);
    PrintPageContacts(i);
    NewPageIfNeeded(i);
  end;
  Printer.EndDoc;
end;

procedure TPrintContacts.PrintPageContacts(PageIndex: Integer);
var
  j: Integer;
begin
  for j := 0 to CONTACTS_PER_PAGE - 1 do
  begin
    if (PageIndex * CONTACTS_PER_PAGE + j) = FContactList.Count - 1 then break;
      PrintAllSingleContact(ContactPosition(j), FContactList.Items[PageIndex * CONTACTS_PER_PAGE + j]);
  end;
end;

function TPrintContacts.ContactPosition(Index: Integer): Integer;
var
  Parts: Integer;
begin
  Parts := (FPaperHeight*10 - TOPMARGIN - BOTTOMMARGIN) div CONTACTS_PER_PAGE;
  Result := -(Parts * Index) + TOP_FIRST_DETAIL_LINE;
end;

procedure TPrintContacts.NewPageIfNeeded(PageIndex: Integer);
begin
  if PageIndex <> (FContactList.Count - 1) div CONTACTS_PER_PAGE then
    Printer.NewPage;
end;
Nur fehlt der letzte Datensatz. Die Seite wird erstellt aber der Datensatz fehlt.

(Ich habe es mal etwas in einzelne Routinen zerlegt, dann wird es übersichtlicher.)

jaenicke 28. Mär 2009 21:42

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
Zitat:

Zitat von Luckie
Nur fehlt der letzte Datensatz. Die Seite wird erstellt aber der Datensatz fehlt.

Das liegt am div. Beispiel: Anzahl 5, pro Seite 3. Dann müssten es zwei Seiten sein.
Delphi-Quellcode:
(FContactList.Count - 1) div CONTACTS_PER_PAGE
(5 - 1) div 3 = 4 div 3 = 1
Also muss es so lauten:
Delphi-Quellcode:
Ceil(FContactList.Count / CONTACTS_PER_PAGE)

jfheins 28. Mär 2009 21:44

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
Du brichst zu früh ab:
Delphi-Quellcode:
if (PageIndex * CONTACTS_PER_PAGE + j) = FContactList.Count - 1 then break;
So isses richtig:
Delphi-Quellcode:
if (PageIndex * CONTACTS_PER_PAGE + j) = FContactList.Count then break;
*g*

@jänicke: Das passt schon. (5 - 1) div 3 = 4 div 3 = 1

also for i := 0 to 1 do

macht Seite 0 und Seite 1 = 2 Seiten ;)

Luckie 28. Mär 2009 21:50

Re: Zwei Datensätze mit for-Schleife auf eine Seite drucken
 
@jfheins: Die -1 habe ich schon gar nicht mehr gesehen.

Besten Dank. Jetzt haben wir es geschafft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz