Fastreport i problem z kopią wydruku

Fastreport i problem z kopią wydruku
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:11 dni
  • Lokalizacja:Zielona Góra
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:

Kopiuj
  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:

Kopiuj
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?

CL
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
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.

robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:11 dni
  • Lokalizacja:Zielona Góra
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.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
0

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


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:11 dni
  • Lokalizacja:Zielona Góra
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)