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. *** |