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?