| Summary: | 1с 8.1 (8.1.9.57) При печати с указанием "Число копий" больше одной, печатается куча лишних копий. | ||
|---|---|---|---|
| Product: | WINE@Etersoft | Reporter: | Dmitry Isakov <beltinc> | 
| Component: | Печать ; Диалог печати | Assignee: | Виталий Перов <vitperov> | 
| Status: | CLOSED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P5 | CC: | baraka, beltinc, lav, n-oberemko, saa, vitperov | 
| Version: | 1.0.8 | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Заявки RT: | Связано с: | ||
| Дата напоминания: | |||
| Bug Depends on: | |||
| Bug Blocks: | 437, 443, 777 | ||
| 
        
          Description
        
        
          Dmitry Isakov
        
        
        
        
          2008-02-02 09:58:20 MSK
        
       *** Bug 1423 has been marked as a duplicate of this bug. *** Трудно воспроизвести багу. Пробую печатать в файл. В итоге только 1 раз, когда я выбирал 3 копии, программа показала: "печатаю 1/9...." В остальных случаях пишет "печатаю 1/1...." независимо от числа копий. А в выходном файле всё нормально: столько страниц, сколько должно быть При дебаге обнаружил, что в одних случаях функция выдаёт: trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 3 а в других: trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 при этом выходной файл содержит столько страниц, сколько надо (возможно внутри содержится информация о числе копий, но как мне её не удалось прочитать стандартными средствами) Changing Copies to... когда 3, а когда 1. Зависимость прослеживается плохо, но заметил, что при смене принтера это число 1. ага! Если открыть файл в текстовом редакторе, то можно найти строку:
mark {
 << /NumCopies 4 >> setpagedevice
} stopped cleartomark
т.е сам файл состоит из 4-х копий документа, да ещё и печатается 4 разаПроверил: сразу после смены принтера печатается столько страниц, сколько нужно стек вызова непосредственно перед изменением числа копий:
PSDRV_CreateDC -> PSDRV_MergeDevmodes
а в PSDRV_MergeDevmodes стоит комманда:
    dm1->dmPublic.u1.s1.dmCopies = dm2->dmPublic.u1.s1.dmCopies;
    TRACE("Changing Copies to %d\n", dm2->dmPublic.u1.s1.dmCopies);
как я понял PSDRV_CreateDC вызывается непосредственно из программы (т.к вызова этой функции из других я не нашёл)Нашёл примерное место ошибки:
в comdlg32/printdlg.c функция PRINTDLG_UpdatePrintDlgA
если не выполняется (а оно в данном случае не выполняется)
if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE)
то приложение само ответственно за печать нескольких копий. Выполняется:
	    if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED)
	        lppd->Flags |= PD_COLLATE;
            else
               lppd->Flags &= ~PD_COLLATE;
            lppd->nCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE);
Ошибся в предыдущем сообщении Если в lppd->Flags стоит бит PD_USEDEVMODECOPIESANDCOLLATE т.е выполняется условие if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE) это значит, что принтер не поддерживает печать нескольких копий, и приложение само ответственно за это. В данном случае всё правильно: принтер поддерживает печать копий. Скорее всего неправильно формируется сам документ Есть заявка по проблеме http://rt.etersoft.ru/Ticket/Display.html?id=5730 Разобрался со флагом PD_USEDEVMODECOPIESANDCOLLATE Если он сброшен, то приложение ответственно за печать нескольких копий (в нашем случае он сброшен) Есть 2 переменные, в которых задаётся число копий: - dmCopies в структуре DEVMODE - отвечает за драйвер принтера - nCopies в структуре PRINTDLG - если я правильно понял, это количество копий, которе должно создать приложение Получается, что если nCopies = Х, то приложение создаёт Х копий, а если ещё dmCopies = X, то драйвер эти Х копий повторяет Х раз. Получается Х^2. Думаю надо просто проверять флаг PD_USEDEVMODECOPIESANDCOLLATE и, если он сброшен, то ставить dmCopies = 1 Исправлено! Патч лежит в /wine-etersoft-public/patches/check/comdlg32-printdlg-number_of_copies.patch Будет ли патч выложен в ближайшее время для общего доступа или его можно будет забирать только вместе с новой версией 1.0.9? Будет обновлённая сборка бета-версии. *** Bug 2530 has been marked as a duplicate of this bug. *** |