Page 3 of 4 FirstFirst 1 2 3 4 LastLast
Results 31 to 45 of 49

Thread: Print stringgrid

  1. #31
    Ik kan onderstaand zelf even niet uittesten dus je moet er zelf even mee freubelen:

    Dit is het loopje dat alle regels print op alle pagina's:
    Delphi Code:
    1. for I := 1 to Zeilen do
    2. begin
    3.   if Grid.RowCount >= I + (Seite - 1) * Zeilen then
    4.   begin
    5.     XPos := 0;
    6.     for J := 0 to Grid.ColCount - 1 do
    7.     begin
    8.       Printer.Canvas.TextOut(XPos, - YPos,
    9.         Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
    10.       XPos := XPos + Grid.ColWidths[J] * 3;
    11.     end;
    12.     YPos := YPos + ZeilenSize;
    13.   end;
    14. end;

    Dus als je daar een "header" boven wilt hebben zul je die hierboven moeten zetten.

    Delphi Code:
    1. XPos := 0;
    2. for J := 0 to Grid.ColCount - 1 do
    3. begin
    4.   Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, 0]); // <-- dit zou dan je eerste regel printen
    5.   XPos := XPos + Grid.ColWidths[J] * 3;
    6. end;
    7. YPos := YPos + ZeilenSize;

    Alleen print ie dan op de eerste pagina de eerste regel 2 keer.
    Als je dat niet wilt zul je in de "1 to Zeilen" loop bij de "I + (Seite - 1) * Zeilen - 1" één op moeten tellen.

    Tevens is het natuurlijk ook mooier om daaronder weer een vettere regel te printen maar dat wordt nu even te veel.

  2. #32
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Heb al volgende:
    Code:
        for I := 1 to Zeilen do
        begin
          if Grid.RowCount >= I + (Seite - 1) * Zeilen then
          begin
            XPos := 0;
            for J := 0 to Grid.ColCount - 1 do
            begin
              Printer.Canvas.TextOut(XPos, - YPos,
                Grid.Cells[J,0]); // <-- dit zou dan je eerste regel printen
              //Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
              XPos := XPos + Grid.ColWidths[J] * 3;
            end;
            YPos := YPos + ZeilenSize;
          end;
        end;
        //Seite hinzufügen
    Alleen print ie dan op de eerste pagina de eerste regel 2 keer.
    Als je dat niet wilt zul je in de "1 to Zeilen" loop bij de "I + (Seite - 1) * Zeilen - 1" één op moeten tellen.
    Sorry, dit snap ik niet!

  3. #33
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    In mijn vorig bericht zit ook een probleem.
    De code zoals ze daar staat geeft enkel de namen van de spelers in elke rij(lijn), dus 20 maal.
    ???

  4. #34
    Dat komt omdat je niet opvolgt wat ik adviseerde.
    Ik zei dat je "boven" dat stukje code, de code moest zetten die ik daaronder aangaf.
    Jij bent dat stukje code zelf gaan wijzigen.

  5. #35
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Ok.

    Code:
    procedure PrintStringGrid(Grid: TStringGrid; Title: string);
    var
      P, I, J, YPos, XPos: Integer;
      AnzSeiten, Seite, Zeilen, ZeilenSize, FontHeight: Integer;
      HorzSize, VertSize, HeaderSize, FooterSize: Integer;
      Varmmx, Varmmy: Extended;
      Footer: string;
    begin
      //Koptekst, Voettekst, Zeilenabstand, Schriftgröße festlegen
      HeaderSize := 100;
      FooterSize := 200;
      ZeilenSize := 78; //36; aangepast - spatie tussen lijnen
      FontHeight := 68; //36; //aangepast
      Printer.Title  := Title;
      Printer.BeginDoc;
      //Druck auf mm einstellen
      Varmmx := GetDeviceCaps (TWinPrinter(Printer).Handle, PHYSICALWIDTH) /
        GetDeviceCaps(TWinPrinter(Printer).Handle, LOGPIXELSX) * 25.4;
      Varmmy := GetDeviceCaps(TWinPrinter(Printer).Handle, PHYSICALHEIGHT) /
        GetDeviceCaps(TwinPrinter(Printer).Handle, LOGPIXELSY) * 25.4;
      VertSize := Trunc(Varmmy) * 10;
      HorzSize := Trunc(Varmmx) * 10;
      SetMapMode(TwinPrinter(Printer).Handle, MM_LOMETRIC);
      //Zeilenanzahl festlegen
      Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
      //Seitenanzahl ermitteln
      if Grid.RowCount mod Zeilen <> 0 then
        AnzSeiten := Grid.RowCount div Zeilen + 1
      else
        AnzSeiten := Grid.RowCount div Zeilen;
      Seite := 1;
      //Grid Drucken
      for P := 1 to AnzSeiten do
      begin
        //Koptekst
        Printer.Canvas.Font.Name := 'Arial';
        Printer.Canvas.Font.Style :=[fsBold];
        Printer.Canvas.Font.Height := 68; //48; //aangepast
        Printer.Canvas.TextOut((HorzSize div 2 -
           (Printer.Canvas.TextWidth(Title) div 2)),- 20,Title);
        Printer.Canvas.Pen.Width := 5;
        Printer.Canvas.MoveTo(0, - HeaderSize);
        Printer.Canvas.LineTo(HorzSize, - HeaderSize);
        //Voettekst
        Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
        Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
        Printer.Canvas.Font.Height := 56; //36; // aangepast
        Footer := 'Pagina: ' + IntToStr(Seite) + ' van ' + IntToStr(AnzSeiten);
        Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
          - VertSize + 150,Footer);
        //Zeilen drucken
        Printer.Canvas.Font.Height := FontHeight;
        YPos := HeaderSize + 10;
        // *** volgende dient om op tweede pagina ook de hoofding (namen) te zetten ***
        XPos := 0;
        for J := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, 0]); // <-- dit zou dan je eerste regel printen
          XPos := XPos + Grid.ColWidths[J] * 3;
        end;
        YPos := YPos + ZeilenSize;
        // ***
        for I := 1 to Zeilen do
        begin
          if Grid.RowCount >= I + (Seite - 1) * Zeilen then
          begin
            XPos := 0;
            for J := 0 to Grid.ColCount - 1 do
            begin
              Printer.Canvas.TextOut(XPos, - YPos,
              Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
              XPos := XPos + Grid.ColWidths[J] * 3;
            end;
            YPos := YPos + ZeilenSize;
          end;
        end;
        //Seite hinzufügen
        Inc(Seite);
        if Seite <= AnzSeiten then Printer.NewPage;
      end;
      Printer.EndDoc;
    end;
    Alleen print ie dan op de eerste pagina de eerste regel 2 keer.
    Als je dat niet wilt zul je in de "1 to Zeilen" loop bij de "I + (Seite - 1) * Zeilen - 1" één op moeten tellen.
    Dit is voor mij niet duidelijk, sorry. Welk/waar cijfer moet er aangepast worden?

  6. #36
    Quote Originally Posted by seghele View Post
    Alleen print ie dan op de eerste pagina de eerste regel 2 keer.
    Als je dat niet wilt zul je in de "1 to Zeilen" loop bij de "I + (Seite - 1) * Zeilen - 1" één op moeten tellen.
    Dit is voor mij niet duidelijk, sorry. Welk/waar cijfer moet er aangepast worden?
    Wat print ie nu uit?

    Volgens mij print ie de eerste regel nu twee keer uit.
    Als dat zo is moet je overal waar "I + (Seite - 1) * Zeilen" staat 1 bij optellen.
    Dat is op twee plaatsen.

  7. #37
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    rvk,
    Dank voor je geduld.
    Veronderstel dat het over deze twee lijnen gaat:
    Code:
    ...
    if Grid.RowCount >= I + (Seite - 1) * Zeilen then 
    ....
    Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);       
    .....
    maar ik weet niet waar en hoe er opgeteld moet.

  8. #38
    Yep.

    Je weet toch wel hoe je + 1 moet doen?

  9. #39
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Is het dit dan ?

    Code:
    ...
    if Grid.RowCount >= I + (Seite - 1) * Zeilen +1 then 
    ....
    Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]) +1;       
    .....

  10. #40
    Quote Originally Posted by seghele View Post
    Is het dit dan ?
    Werkt het?

    Waarom probeer je het niet gewoon en meld je de foutmelding in plaats van te vragen of het goed is.

    Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]) +1; // <-- deze staat niet achter I + (Seite - 1) * Zeilen
    De eerste is goed maar bij de tweede heb je +1 buiten de haakjes gezet dus je moet dat direct achter I + (Seite - 1) * Zeilen zetten.

  11. #41
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Eindelijk!
    Code:
    Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, I + (Seite - 1) * Zeilen +1 -1]);

    Er zijn nog twee aanpassingen nodig op de print.
    Zie bijlage.
    De laatste 'row' op eerste pagina staat in de 'footer'.
    De druk zou iets meer naar rechts moeten.

    Kan je mij aangeven waar het aangepast moet worden?
    DANK.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	WiezenResult.jpg 
Views:	93 
Size:	78.1 KB 
ID:	7577  

  12. #42
    Voor tekst meer naar rechts moet je overal waar XPos := 0 staat veranderen in
    XPos := watjemaarwilt;
    Dat is op twee plaatsen.

    En omdat je nu één extra regel hebt met de namen moet je de aantal regels die geprint worden met één verlagen.

    Delphi Code:
    1. Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
    2. Zielen := Zielen - 1; // <--- deze toevoegen

  13. #43
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Heel duidelijk.
    Heb om 15u30 afspraak bij huisarts.
    Zal je daarna zo snel als mogelijk de resultaten met je code doorgeven.

  14. #44
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Als er maar vier spelers zijn, is er toch ruimte aan de rechterzijde voor de rest?
    Delphi is great. Lazarus is more powerfull

  15. #45
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    rvk,
    Code:
     //Zeilenanzahl festlegen
      Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
      Zeilen := Zeilen - 1; // <--- om onderaan pagina plaats te hebben voor footer
    Deze bovenstaande code werkt prima, de footer blijft nu volledig vrij van overschrijven.

    Code:
    ...
     XPos := 25;//0 //aangepast volgens de ruimte links v.d. kolom en bladrand
        for J := 0 to Grid.ColCount - 1 do 
    ...
    if Grid.RowCount >= I + (Seite - 1) * Zeilen + 1 then
    begin
        XPos := 25; //0; //aangepast volgens de ruimte links v.d. kolom en bladrand ;
    ...
    De aanpassing van 0 naar 25 (of lager) geeft geen enkel verschil. !!!
    Er zal nog ergens anders moeten aangepast worden!

    ************************************************** **************************
    jkuiper,
    Als er maar vier spelers zijn, is er toch ruimte aan de rechterzijde voor de rest?
    Het gaat hem om meer ruimte aan de "LINKER" kant van het blad.
    De vier kolommen zouden zelfs ongeveer in het centrum mogen.

Page 3 of 4 FirstFirst 1 2 3 4 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •