Zmiana ustawień drukarki w rejestrze

0

Nie mogę od kilku dni poradzić sobie z problemem. W procedurze ustawdruk zmieniam ustawienia drukarki w rejestrze systemowym i ta procedura działa mi dobrze. Chodzi o to, że poniższy kod drukuje mi wszystko z ustawieniami ustawdruk(2). Dopiero jak dam ShowMessage i odklikuje OK to wszystko jest w porządku. Wszystko fajnie ale przy 1000 stron jest to niedopuszczalne aby 2000 razy klikać myszką. Próbowałęm spowolnić przez sleep z dużymi wartościami i nie działa prawidłowo, a ShowMessage nawet szybko klikając zawsze działa dobrze. Jakieś pomysły ? Dodam, że jestem amatorem na poziomie TurboPascala sprzed 15 lat :)

for i := start to stron do
    begin
        if CheckBox1.Checked then
              begin
              ustawdruk(1);
              acropdf1.printPages(i,i);
              postep(i);
            //  ShowMessage('Wydrukowano 1');
              end;

        if CheckBox2.Checked then
              begin
              ustawdruk(2);
              acropdf2.printPages(i,i);
              postep(i);
             // ShowMessage('Wydrukowano 2');
              end;
0

Jeśli wywołanie ShowMessage poprawia sprawę to prawdopodobnie ```
Application.ProcessMessages

Jeśli dobrze rozumiem to masz 2 opcje wyboru dla ustawienia drukowania. Jeśli tak to zmodyfikował bym trochę ten kod. Obecnie można np. nie wybrać żadnego chekboxa (żadne ustawienia nie zostaną wczytane) albo zaznaczyć oba (strony będą drukowane podwójnie z obydwoma ustawieniami). Ja bym napisał coś takiego:
```delphi
for i := start to stron do
begin
 case RadioGroup.ItemIndex of
  0 : begin
         ustawdruk(1);
         acropdf1.printPages(i,i); 
       end;
  1 : begin
          ustawdruk(2);
          acropdf2.printPages(i,i);
       end;
 end;
postep(i);
Application.ProcessMessages;
end;
0

Nie działa Application.ProcessMessages;

Dobrze działa kod:

ustawdruk(1);  // tu ustawiam ilość kopii oraz format strony i zapisuję do rejestru
acropdf1.printPages(i,i);
ShowMessage('Wydrukowano 3');
ustawdruk(2); // tu ustawiam ilość kopii oraz format strony i zapisuję do rejestru
acropdf2.printPages(i,i);
ShowMessage('Wydrukowano 3');

a taki nie dział:

ustawdruk(1);  // tu ustawiam ilość kopii oraz format strony i zapisuję do rejestru
acropdf1.printPages(i,i);
Application.ProcessMessages;
ustawdruk(2); // tu ustawiam ilość kopii oraz format strony i zapisuję do rejestru
acropdf2.printPages(i,i);
Application.ProcessMessages;

Inaczej spytam. Czy jest jakiś sposób aby programowo kliknąć OK w ShowMessage ? Ewidentnie gdy jest interakcja z użytkownikiem kod działa. Jeśli tego nie ma wszystko drukuje się z ustadruk(2).

0

Wracając do Twojego pierwszego postu, co konkretnie masz ustawione na formatce odnośnie checkboxów? Które są zaznaczone? Skoro ustawienia wydruku masz obsłużone w procedurze

ustawdruk(x);

to czemu masz różne odwołania w

acropdf1.printPages(i,i);

i

acropdf2.printPages(i,i);

Nie wiem też co robisz w

ustawdruk(x);

Debugowałeś kod i sprawdzałeś co się dzieje w kodem przy zastosowaniu ```
ShowMessage

Interakcja z użytkownikiem to jedynie opóźnienie wykonania kodu, nie słyszałem żeby wywołanie komunikatu wpłynęło na działanie aplikacji. Spróbuj jeszcze coś takiego zamiast ```
Application.ProcessMessages;
``` na końcu.
```delphi
for i := 0 to 5 do
begin
  Sleep(5);
  Application.ProcessMessages; 
end;
0

Nie pomogło. Wyobraźmy sobie, że chcę wydrukować notes z okładką, każdy inny. W jednym PDF mam okładki 50str, w drugim pdf mam kartki 50str.
Wydruk ma wyglądać 1 okładka, 25 kartek, 1 okładka, 25 kartek. Okładka i kartki idą z innych podajników. Mam dwa różne odwołania bo mam dwa różne pdf,y. W zmiennej Buffer1 i Buffer2 mam zapisane ustawienia dla podajnika1 i podajnika2.

Procedura ustawdruk wygląda tak i działa:

procedure ustawdruk(tacka:integer);
var
Reg : TRegistry;
begin
  case tacka of
  1:
    begin
        Reg := TRegistry.Create;
        if Reg.OpenKey('Printers\DevModePerUser', False) then
          begin
            Reg.OpenKey('Printers\DevModePerUser', False);
            Reg.WriteBinaryData(drukarka, Buffer1, SizeOf(Buffer1));
           end
          else
            ShowMessage('Błąd! Nie ma klucza "Printers\DevModePerUser" w rejestrze.');
        Reg.Free;
    end;
  2:
    begin
        Reg := TRegistry.Create;
        if Reg.OpenKey('Printers\DevModePerUser', False) then
          begin
            Reg.OpenKey('Printers\DevModePerUser', False);
            Reg.WriteBinaryData(drukarka, Buffer2, SizeOf(Buffer2));
          end
          else
            ShowMessage('Błąd! Nie ma klucza "Printers\DevModePerUser" w rejestrze.');
        Reg.Free;
    end;
0

No to może

acropdfX.printPages(i,i);

nie bierze aktualnie zmienionych wartości z rejestru. Ja bym spróbował jeszcze dać Application.ProcessMessages; bezpośrednio po ustawdruk(x); a jeśli dalej będzie nie tak to może to rozwiązanie da radę: https://stackoverflow.com/questions/37404305/how-to-refresh-registry-keys-without-reboot

0

Dalej to samo i jeden i drugi pomysł.

0

Był na tym forum już problem dotyczący AcroPDF. Dotyczył czego innego ale może rozwiązanie będzie to samo. Wtedy komponent zabierał autofocusa z innych komponentów. Może jest tak, że aplikacja nie jest w stanie dostać się do nowych wartości rejestru właśnie przez takie zachowanie a MessageBox wymusza 'zdjęcie' autofocusa z komponentu. Ja bym spróbował jeszcze czegoś takiego po wywołaniu ustawdruk(x);

AcroPDF1.Enabled := False;
Application.ProcessMessages;
AcroPDF1.Enabled := True;

Więcej pomysłów chyba na teraz już nie mam.

0

To samo. Drukuje zawsze ustawdruk(2)

0

Doszedłem po wielu testach do tego, że trzeba poczekać określony czas na zbuforowanie się wydruku. Te czasy są różne. Okienka z Dialogs wyświetlają się dopiero jak operacja drukowania się zakończy a inne operacje lecą dalej po druku. Program dział mi dobrze kiedy dam np. InputBox. Kiedy dam np. sleep(1000). Pierwsze 5 stron idzie prawidłowo a potem już jest wszystko z ustawienia 2. Potrzebuję wstawić coś co poczeka aż wydruk z acropdf1.printPages(i,i) się zakończy i program pójdzie dalej. Dobrze realizuje to jakiegolwiek okienko dialogowe. Tylko jak takie okno wyświetlić na 0,00001s ?

3 dzień nad tym siedzę i nic ...

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