Page 1 of 2 1 2 LastLast
Results 1 to 15 of 26

Thread: Message while printing

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

    Question Message while printing

    Gebruik CodeTyphon in Windows8.1.

    Zou graag een message tonen zolang de printer bezig is.
    Code:
    procedure TFmain.MenuItemPRINTClick(Sender: TObject);
    begin
      If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
         '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        //  code nodig om boodschap te tonen : "Begin print"
        PrintStringGrid(StringGrid1, 'Print Stringgrid Wiezen '+
              formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
       // code nodig om boodschap te verwijderen 
      end;
    end;
    Code:
    procedure PrintStringGrid(Grid: TStringGrid; Title: string);
    var
      varI, varJ, varP : Integer;
      varAnzSeiten, varSeite : Integer;
      varRow, varRowSize : Integer;
      varFontHeight : Integer;
      varYPos, varXPos : Integer;
      varHorzSize, varVertSize : Integer;
      varHeaderSize, varFooterSize : Integer;
      varFooter : String;
      varMMX, varMMY : Extended;
    begin
      //FontSize, Header, Footer, Row distance
      varHeaderSize := 100;
      varFooterSize := 200;
      varRowSize := 78; //36; aangepast - spatie tussen lijnen
      varFontHeight := 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;
      varVertSize := Trunc(varMMY) * 10;
      varHorzSize := Trunc(varMMX) * 10;
      SetMapMode(TwinPrinter(Printer).Handle, MM_LOMETRIC);
      //Zeilenanzahl festlegen
      varRow := (varVertSize - varHeaderSize - varFooterSize) div varRowSize;
      varRow := varRow -1; // <--- om onderaan pagina plaats te hebben voor footer
      //Seitenanzahl ermitteln
      if Grid.RowCount mod varRow <> 0 then
        varAnzSeiten := Grid.RowCount div varRow + 1
      else
        varAnzSeiten := Grid.RowCount div varRow;
      varSeite := 1;
      //Print Grid
      for varP := 1 to varAnzSeiten do
      begin
        //Header
        Printer.Canvas.Font.Name := 'Arial';
        Printer.Canvas.Font.Style := []; //[fsBold];
        Printer.Canvas.Font.Height := 68; //48; //aangepast
        Printer.Canvas.TextOut((varHorzSize div 2 -
           (Printer.Canvas.TextWidth(Title) div 2)),- 20,Title);
        Printer.Canvas.Pen.Width := 5;
        Printer.Canvas.MoveTo(0, - varHeaderSize);
        Printer.Canvas.LineTo(varHorzSize, - varHeaderSize);
        //Footer
        Printer.Canvas.MoveTo(0, - varVertSize + varFooterSize);
        Printer.Canvas.LineTo(varHorzSize, - varVertSize + varFooterSize);
        Printer.Canvas.Font.Height := 56; //36; // aangepast
        varFooter := 'Pagina: ' + IntToStr(varSeite) + ' van ' + IntToStr(varAnzSeiten);
        Printer.Canvas.TextOut((varHorzSize div 2 - (Printer.Canvas.TextWidth(varFooter) div 2)),
          - varVertSize + 150,varFooter);
        //Print Row
        Printer.Canvas.Font.Height := varFontHeight;
        varYPos := varHeaderSize + 10;
        // *** volgende dient om op tweede pagina ook de hoofding (namen) te zetten ***
        varXPos := 400;//0; //aangepast volgens de ruimte links v.d. kolom en bladrand
        // druk de namen van de spelers af bovenaan elke pagina
        for varJ := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(varXPos, - varYPos, Grid.Cells[varJ, 0]); // <-- dit zou dan je eerste regel printen
          varXPos := varXPos + Grid.ColWidths[varJ] * 3;
        end;
        varYPos := varYPos + varRowSize;
        // **********
        for varI := 1 to varRow do
        begin
          if Grid.RowCount >= varI + (varSeite - 1) * varRow + 1 then
          begin
            varXPos := 400; //0; //aangepast volgens de ruimte links v.d. kolom en bladrand ;
            for varJ := 0 to Grid.ColCount - 1 do
            begin
              Printer.Canvas.TextOut(varXPos, - varYPos,
              Grid.Cells[varJ, varI + (varSeite - 1) * varRow +1 -1]);
              varXPos := varXPos + Grid.ColWidths[varJ] * 3;
            end;
            varYPos := varYPos + varRowSize;
          end;
        end;
        //Seite hinzufügen
        Inc(varSeite);
        if varSeite <= varAnzSeiten then Printer.NewPage;
      end;
      Printer.EndDoc;
    end;

  2. #2
    Ik gebruik in Delphi CreateMessageDialog zonder knoppen. Maar ik zag dat in Lazarus er toch ALTIJD een OK knop bijkomt indien je [] opgeeft voor knoppen. (RAAR)

    Dus hier even een kleine andere variant.

    Delphi Code:
    1. function MaakMelding(CaptionValue: String): TForm;
    2. begin
    3.   Result := TForm.Create(nil);
    4.   try
    5.     Result.Position := poMainFormCenter;
    6.     Result.Height := Round(80 * (Result.PixelsPerInch / 96));
    7.     Result.Width := Round(200 * (Result.PixelsPerInch / 96));
    8.     Result.BorderStyle := bsDialog;
    9.     with TLabel.Create(Result) do
    10.     begin
    11.       Parent := Result;
    12.       Align := alClient;
    13.       Alignment := taCenter;
    14.       Layout := tlCenter;
    15.       Font.Size := 14;
    16.       Caption := CaptionValue;
    17.     end;
    18.     Result.Show;
    19.     Result.Repaint;
    20.   except
    21.     on E: Exception do
    22.       Result.Free;
    23.   end;
    24. end;
    25.  
    26. procedure TFmain.MenuItemPRINTClick(Sender: TObject);
    27. var
    28.   dl: TForm;
    29. begin
    30.   If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
    31.      '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
    32.   begin
    33.  
    34.     dl := MaakMelding('Printer is bezig');
    35.     try
    36.       PrintStringGrid(StringGrid1, 'Print Stringgrid Wiezen '+
    37.             formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
    38.     finally
    39.       dl.Free;
    40.     end;
    41.  
    42.   end;
    43. end;

    Name:  SUGKipo.png
Views: 282
Size:  4.0 KB

  3. #3
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Een tegenvraag: Waarom zou je dat willen ?

    Het is toch zonde van de tijd om je gebruiker in je programma te laten wachten op het uitprinten.
    Een melding maken is genoeg: Document is naar de printer gestuurd.

    Want ik kan best wel wat situaties bedenken waar het kan stagneren o.a:
    - Je bent niet de enige gebruiker van de printer, en als deze door meerdere gebruik wordt kom je gewoon in een wachtrij te staan.
    - Je heb een (wat oudere) laserprinter die moet eerst wakker worden en vervolgens opwarmen.

    In alle gevallen kan jouw gebruiker niets anders doen dan wachten.

    Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  4. #4
    Dat er een rij bij de printer staat is iets dat de Windows queue wel oplost.
    Vaak is het zo dat het sturen naar de printerqueue toch een paar seconden kan duren. Net te weinig om het naar een thread te verplaatsen (met bijbehorende problemen) en te lang om geen feedback aan de gebruiker te geven. Een venstertje dat je bezig bent om de taak naar de printer te gooien is dan wel zo duidelijk.

    (Natuurlijk wacht dit venster niet tot het papier daadwerkelijk uit de printer komt rollen want dat doet Windows wel op de achtergrond)

  5. #5
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    rvk, opnieuw een dikke merci voor de code.

    Ik heb vandaag geen tijd om het uit te proberen.
    Zal resultaat laten weten.

  6. #6
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    rvk,
    Jouw code werkt prima.
    Heb enkel nog volgende moeten inplanten:
    - Application.ProcessMessages;
    - Sleep(9000);
    Tot later ...

    Code:
    procedure TFmain.MenuItemPRINTClick(Sender: TObject);
    var
      vardl: TForm;
    begin
      If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
         '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        vardl := MaakMeldingPrint('Printer is bezig');
        Application.ProcessMessages;     // nodig om de form/tekst zichtbaar te maken.
        try
          PrintStringGrid(StringGrid1, 'Print Stringgrid Wiezen '+
                formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
          Sleep(9000);       // nodig om de boodschap lang genoeg op het scherm te houden.
        finally
          vardl.Free;
        end;
      end;

  7. #7
    Als je een sleep(9000) in moet bouwen omdat de melding anders te snel weg is, dan is het de vraag of je wel een melding nodig hebt. De genoemde melding is er eigenlijk alleen voor zolang je programma nog bezig is.

    Anders kun je net zo goed, zoals Peter al voorstelde, en melding inbouwen dat de gegevens naar de printer gestuurd zijn. En dit kan dan gerust een showmessage zijn. Ik zou het niet fijn vinden dat ik 9 seconden extra moet wachten op die melding voordat ik door kan gaan.

    Soms gebruik ik ook systray notifications. Die verschijnen 4 seconden rechtsonder in het scherm bij de tijd en verdwijnen zelf weer, maar de gebruiker kan in die tijd wel doorwerken.

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

    Exclamation

    Als ik de "sleep" niet gebruik dan duurt het ongeveer 5 sec. voordat mijn printer aanslaat en daarna begint te printen(wifi).
    Dus het volledig afwerken van de print duurt langer dan de 9 sec.
    De boodschap geeft voor mij aan dat er een opdracht naar de prinrter is gestuurd.

  9. #9
    Ja, maar dan is een showmessage handiger, want die kun je wegdrukken. Je zou zelfs een showmessage met time-out kunnen gebruiken.

    Dan kun je in ieder geval al binnen die 9 seconden doorwerken door de melding gewoon weg te drukken.

    Maar goed. Het kan ook een keuze zijn om de gebruiker 9 seconden te laten wachten. Maar dit zou in een professioneel programma in ieder geval een big NO-NO zijn.

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

    Question

    rvk,
    ... Je zou zelfs een showmessage met time-out kunnen gebruiken. ...
    Is het mogelijk om hier te helpen?

  11. #11
    Quote Originally Posted by seghele View Post
    Is het mogelijk om hier te helpen?
    Ik heb op dit moment even niet direct wat tijd.
    Maar het staat op mijn lijstje.

    Je zou bijvoorbeeld ook TPopupNotifier met een TTimer kunnen gebruiken (die popupnotifier staat onder Common Controls). Je zou dan bijvoorbeeld die popup zichtbaar kunnen maken rechts onderin en met een timer na 9 seconden weer verbergen. Voordeel is dat je programma dan gewoon doorloopt.

    (Als ik even heb maak ik wel een voorbeeld.)

  12. #12
    Quote Originally Posted by rvk View Post
    (Als ik even heb maak ik wel een voorbeeld.)
    Wat doe je dan als je oneven hebt?

    Bart

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

    Exclamation

    rvk,
    OK - Bedankt

  14. #14
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Bart B View Post
    Wat doe je dan als je oneven hebt?
    Dan maakt hij geen voorbeeld natuurlijk.
    TMemoryLeak.Create(Nil);

  15. #15
    Ja, het is inmiddels "even"

    Hier dezelfde MaakMelding() functie die iets meer uitgebreider is. Deze maakt ook een TTimer aan zodat na 6 seconden het schermpje sluit. Nu wordt het schermpje ook rechts onderin gezet. Je kunt de 6 seconden afwachten, je kunt het schermpje zelf sluiten maar je kunt het ook laten staan en gewoon doorwerken (tot ie na 6 seconden zelf verdwijnt). De Result.OnClose was nodig om Action op caFree te zetten zodat je het form zelf niet "op hoeft te ruimen". Je moet dan ook NIET meer de dl.Free doen (want het form ruimt zichzelf op).

    Natuurlijk zou je de MaakMelding() ook uit kunnen breiden voor het meegeven van een andere time-out dan 6 seconden of bijvoorbeeld een andere achtergrond kleur.

    Delphi Code:
    1. type
    2.   TMyEvents = class(TComponent)
    3.   public
    4.     procedure DoeOnTimer(Sender: TObject);
    5.     procedure DoeOnFormClose(Sender: TObject; var Action: TCloseAction);
    6.   end;
    7.  
    8. procedure TMyEvents.DoeOnTimer(Sender: TObject);
    9. begin
    10.   TForm(TTimer(Sender).Owner).Close;
    11. end;
    12.  
    13. procedure TMyEvents.DoeOnFormClose(Sender: TObject; var Action: TCloseAction);
    14. begin
    15.   Action := caFree;
    16. end;
    17.  
    18. function MaakMelding(CaptionValue: string): TForm;
    19. var
    20.   Events: TMyEvents;
    21. begin
    22.   Result := TForm.Create(nil);
    23.   try
    24.     Events := TMyEvents.Create(Result);
    25.     Result.Height := Round(80 * (Result.PixelsPerInch / 96));
    26.     Result.Width := Round(200 * (Result.PixelsPerInch / 96));
    27.     Result.BorderStyle := bsDialog;
    28.     Result.OnClose := @Events.DoeOnFormClose;
    29.     // Result.Position := poMainFormCenter;
    30.     Result.Left := Screen.WorkAreaWidth - Result.Width - 4;
    31.     Result.Top := Screen.WorkAreaHeight - GetSystemMetrics(SM_CYCAPTION) - 4 - Result.Height;
    32.  
    33.     with TTimer.Create(Result) do
    34.     begin
    35.       Interval := 6000;
    36.       OnTimer := @Events.DoeOnTimer;
    37.       Enabled := True;
    38.     end;
    39.  
    40.     with TLabel.Create(Result) do
    41.     begin
    42.       Parent := Result;
    43.       Align := alClient;
    44.       Alignment := taCenter;
    45.       Layout := tlCenter;
    46.       Font.Size := 14;
    47.       Caption := CaptionValue;
    48.       Color := clInfoBk;
    49.     end;
    50.  
    51.     Result.Show;
    52.  
    53.   except
    54.     on E: Exception do
    55.       Result.Free;
    56.   end;
    57. end;
    58.  
    59. procedure TFmain.MenuItemPRINTClick(Sender: TObject);
    60. var
    61.   dl: TForm;
    62. begin
    63.   if QuestionDlg('KEUZE !', 'Gegevens afdrukken?' + #13 + '', mtConfirmation,
    64.     [mrYes, 'OK', mrNo, 'Annuleren'], '') = mrYes then
    65.   begin
    66.  
    67.     dl := MaakMelding('Printer is bezig');
    68.     try
    69.       PrintStringGrid(StringGrid1, 'Print Stringgrid Wiezen ' +
    70.         formatdatetime('dd' + '/' + 'mm' + '/' + 'YYYY', Now));
    71.     finally
    72.       // dl.Free; // vrijgeven moet niet omdat dat vanzelf gebeurd
    73.     end;
    74.  
    75.   end;
    76. end;

Page 1 of 2 1 2 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
  •