Fastreport i problem z kopią wydruku

0

Cześć,

Napisałem program w którym zlecenie drukowane jest na dwóch drukarkach termicznych w trybie graficznym (sterowniki pod Windows). Robię to w ten prosty sposób:

  with DM.qrydruk_linie, SQL do  // pobranie zawartości paragonu
  begin
    Close;
    Clear;
    Add('select * from linie where rachunek=:rachunek and storno=:storno order by id');
    ParamByName('rachunek').AsInteger := main.licznik_rachunki;
    ParamByName('storno').AsBoolean := False;
    Open;
    First;
  end;

  with DM.qrydruk_rachunek, SQL do  // pobranie nagłówka paragonu
  begin
    Close;
    Clear;
    Add('select * from rachunki where id=:id');
    ParamByName('id').AsInteger := main.licznik_rachunki;
    Open;
  end;

  if main.Konfiguracja.drukarka_kuchenna_zainstalowana then
    wydruk_kuchnia('WYDRUK WSTĘPNY');

  //  Sleep(2000);

  if main.Konfiguracja.drukarka_kuchenna_kopia_zainstalowana then
    wydruk_kuchnia_kopia('WYDRUK WSTĘPNY');

Wszystko proste. ustawiam tabele na odpowiednie rekordy i wywołuję procedury do wydruku. Przykładowa procedura wygląda następująco:

procedure wydruk_kuchnia(komunikat: string);
begin
  if FileExists('wydruki\zlecenie.fr3') then
  begin
    try
      main.frxReport1.LoadFromFile('wydruki\zlecenie.fr3');
      main.frxReport1.PrintOptions.Printer := main.Konfiguracja.drukarka_kuchenna;
      main.frxReport1.PrintOptions.Copies := 1;
      TfrxMemoView(main.frxReport1.FindObject('barman')).Memo.Text := main.Konfiguracja.Nazwisko + ' ' + main.Konfiguracja.Imie;
      TfrxMemoView(main.frxReport1.FindObject('komunikat')).Memo.Text := komunikat;

      main.frxReport1.PrintOptions.ShowDialog := False;
      main.frxReport1.PrepareReport();
      if main.Konfiguracja.drukarka_kuchenna_podglad then
        main.frxReport1.ShowReport()
      else
        main.frxReport1.Print;
    except
      ShowMessage('Problem z wydrukowaniem zlecenia!');
    end;
  end
  else
    ShowMessage('Brak pliku zlecenie.fr3 w folderze wydruki');
end;

Jak widać proste jak budowa cepa. Działa w zasadzie idealnie ... na podglądzie niestety.

W rzeczywistości okazało się że jest problem. Drukarki oczywiście są podłączone interfejsem sieciowym (jedna stoi przy barze, druga w kuchni), jak pisałem sterownik Windows.
Na wydruku mamy nagłówek, później sekcję MasterData z danymi z tabeli, podsumowanie jednej kolumny i prostą stopkę.

Gdy ustawię żeby wydruk szedł tylko na jedną drukarkę wszystko działa (nie ważne którą). Gdy zamiast wydruku ustawię aby był wygenerowany podgląd - wszystko działa (oczywiście wydruk z podglądu jest prawidłowy). Jednak gdy ustawię w konfiguracji że wydruk ma polecieć na dwie drukarki jest problem.

Dane w części MasterData są tak jakby wymieszane miedzy wydrukami i zazwyczaj brakuje dalszych rekordów. Powiedzmy że dobrze drukują się z 2-3 rekordy, później jest problem. Oczywiście kombinowałem z drugim komponentem frxReport, osobnym szablonem wydruku, dodatkowymi query i datasource dla drugiego wydruku. Kompletnie żadnego efektu. Tak jakby to Windows mieszał te dane na poziomie swojego sterownika drukowania? Nawet ustawiłem w sterowniku drukarki aby poczekać na kompletne dane i dopiero zacząć drukować - bez rezultatu.
Jedyne co pomogło to sleep po pierwszym wywołaniu procedury drukowania, odczekaniu eksperymentalnie około 2 sekund i uruchomieniu ponownie drukowania? Niestety to rozwiązanie całkowicie mi się nie podoba ze względu na jego prymitywność, poza tym okazało się dzisiaj że przyszła jakaś wycieczka i wydruk miał kilkadziesiąt linii no i czas 2 sekund był nie wystarczający.

No dobrze, gdyby nic nie zadziałało mógłbym eksperymentalnie zmierzyć ile potrzeba czasu na jedną linijkę i czas sleep ustawić na tą wyliczoną wartość ale jakoś nie mogę się z tym pogodzić.

Myślę że jeśli faktycznie jest jakiś problem na poziomie spoolera Windows to rzeczywiście mógłbym poczekać ale najlepiej abym wiedział kiedy dane dotarły do spoolera w całości. Ale jak to sprawdzić?

Macie jakieś pomysły?

0

Nie korzystałem z FastReport ale pierwsza myśl - ProcessMessages pomiędzy wydrukami. Niby nie powinno mieć to żadnego znaczenia ale nie zaszkodzi sprawdzić.
Jeśli nie wiesz ile czekać pomiędzy wydrukiem to może dać z pętli ze Sleepem main.frxReport1.isPrinting i drugi wydruk dopiero jak wyjdziemy z pętli.

0

W oryginale jest ProcessMessages i rzeczywiście program staje się mniej zamrożony, usunąłem to przed pokazaniem kodu aby nie zwracać na to uwagi czytających.
Co do isPrinting to sprawdzę to. Dzięki za sugestie.

0

@robertz68: czemu nie użyjesz wątku pobocznego?

0
furious programming napisał(a):

@robertz68: czemu nie użyjesz wątku pobocznego?

A użyłem z godzinę temu ale w wersji prostszej czyli TTask. Przesłałem program na komputer testowy i zrobiłem zdalne testy. Wydaje się że to może zadziałać ale dowiem się jutro jak zajadę do klienta gdzie mam stanowisko testowe z dwoma drukarkami i zobaczę jak wygląda wydruk. Jak to nie zadziała to po prostu użyję zwykłego wątku, jestem jednak dobrej myśli.

1 użytkowników online, w tym zalogowanych: 0, gości: 1