Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Visualist
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201

Ошибка окна предпросмотра при печати

13.12.2014, 20:38. Показов 800. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть PrintPreviewDialog. При нажатии на кнопку Предпросмотр - он открывается. Если в RichTextBox знаков 32490 или меньше (незнаю почему именно так) - выводит все нормально. Если знаков больше - выводит последние 30 000 знаков.
Например, у нас 90 000 знаков, в окне PrintPreviewDialog первые страницы, на которых 60 000 знаков будут пустыми, последние, где 30 000 - с текстом, как и положено быть.
На принтер в любом случае выводит корректно. То есть, получается, что на первых страницах знаки тоже есть, но PrintPreviewDialog их не хочет показывать???
Не могу разобраться, в чем вообще ошибка, даже предположений нет.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
'кнопка предпросмотр
    Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
        'Инициализируем переменные
        PrintDocument1.DocumentName = FilePath
        stringPrintText = Note.Text
        StartPage = 1
        NumPages = PrintDialog1.PrinterSettings.MaximumPage
        PageNumber = 1
        'Показываем диалог
        PrintPreviewDialog1.ShowDialog()
    End Sub
 
        Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        'Создаем экземпляр graph класса Graphics
        Dim graph As Graphics = e.Graphics
        'Создаем объект font, которому устанавливаем 
        ' шрифт элемента Note
        Dim font As Font = Note.Font
        'Получаем значение межстрочного интервала — высоту шрифта Т1, 134
        Dim HeightFont As Single = font.GetHeight(graph)
        'Создаем экземпляр stringformat класса StringFormat для определения 
        'дополнительных параметров форматирования текста.
        Dim stringformat As New StringFormat()
        'Создаем экземляры  rectanglefFull и rectanglefText класса RectangleF для 
        'определния областей печати и текста. Т1, 104
        Dim rectanglefFull As RectangleF, rectanglefText As RectangleF
        'Создаем переменные для подсчета числа символов и строк.
        Dim NumberSymbols As Integer, NumberLines As Integer
        'В качестве области печати устанавливаем объект rectanglefFull
        If graph.VisibleClipBounds.X < 0 Then
            rectanglefFull = e.MarginBounds
        Else
            'Определяем   объект  rectanglefFull
            'Устанавливаем координату  X  
            'Устанавливаем координату  Y
            'Устанавливаем ширину области
            'Устанавливаем высоту области
            'rectanglefFull = New RectangleF(e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width) / 2, e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height) / 2, e.MarginBounds.Width, e.MarginBounds.Height)
            rectanglefFull = New RectangleF(40, 40, e.PageBounds.Width - 80, e.PageBounds.Height - 40)
        End If
        'rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2 * HeightFont)
        rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2 * HeightFont)
        'Определяем число строк
        Dim NumDisplayLines As Integer = CInt(Math.Floor(rectanglefText.Height / HeightFont))
        'Устанавливаем высоту области
        rectanglefText.Height = NumDisplayLines * HeightFont
 
        If Note.WordWrap Then
            stringformat.Trimming = StringTrimming.Word
        Else
            stringformat.Trimming = StringTrimming.EllipsisCharacter
            stringformat.FormatFlags = stringformat.FormatFlags Or StringFormatFlags.NoWrap
        End If
        'При печати выбранных страниц переходим к первой стартовой странице
        While (PageNumber < StartPage) AndAlso (stringPrintText.Length > 0)
            If Note.WordWrap Then
                'Измеряем текстовые переменные, 
                'формирующие печать,  и возвращаем число символов NumberSymbols
                'и число строк NumberLines
                graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, NumberSymbols, NumberLines)
            Else
                NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines)
            End If
            stringPrintText = stringPrintText.Substring(NumberSymbols)
            'Увеличиваем число страниц 
            PageNumber += 1
        End While
        'Если длина строки stringPrintText равняется нулю (нет текста для печати),
        ' останавливаем печать
        If stringPrintText.Length = 0 Then
            e.Cancel = True
            Return
        End If
        'Выводим (рисуем) текст для печати — stringPrintText, используем для этого шрифт font,
        'кисть черного цвета  — Brushes.Black, область печати — rectanglefText,
        'передаем строку  дополнительного форматирования stringformat
        graph.DrawString(stringPrintText, font, Brushes.Black, rectanglefText, stringformat)
        'Получаем текст для следующей страницы
        If Note.WordWrap Then
            graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, NumberSymbols, NumberLines)
        Else
            NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines)
        End If
        stringPrintText = stringPrintText.Substring(NumberSymbols)
        'Очищаем объект stringformat, использованный для формирования полей.
        stringformat = New StringFormat()
        'Добавляем  вывод на каждую страницу ее номера
        stringformat.Alignment = StringAlignment.Far
        graph.DrawString("Страница " & PageNumber, New Font("Courier New", 10), Brushes.Black, rectanglefFull, stringformat)
        PageNumber += 1
        'Cнова проверяем, имеется ли текст для печати и номер страницы, заданной для печати
        e.HasMorePages = (stringPrintText.Length > 0) AndAlso (PageNumber < StartPage + NumPages)
        'Для печати из окна предварительного просмотра  снова инициализируем переменные
        If Not e.HasMorePages Then
            stringPrintText = Note.Text
            StartPage = 1
            NumPages = PrintDialog1.PrinterSettings.MaximumPage
            PageNumber = 1
        End If
    End Sub
 
    Private Function SymbolsInLines(stringPrintText As String, NumLines As Integer) As Integer
        Dim index As Integer = 0
        For i As Integer = 0 To NumLines - 1
            index = 1 + stringPrintText.IndexOf(ControlChars.Lf, index)
            If index = 0 Then
                Return stringPrintText.Length
            End If
        Next
        Return index
    End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.12.2014, 20:38
Ответы с готовыми решениями:

Обрезание текста и отключение границ при печати(ошибка во время печати)
Есть несколько excel документов с заголовками и таблицей. Есть 2 проблемы, при переходе в режим предварительного просмотра он просто...

Ошибка предпросмотра с FastReport
программа учета поставок товаров на склад, нужен отчет, я его сделал все компилируется, при первом запуске программы появляется...

Ошибка при печати
Всем добрейшего времени суток, недавно столкнулся с такой проблемой. У нашего бухгалтера на компьютере периодически отмирает принтер с...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2014, 20:38
Помогаю со студенческими работами здесь

Ошибка при печати
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,...

Ошибка при печати.
Не удалось сформировать внешнюю печатную форму! Ошибка при вызове метода контекста (Выполнить): {(16, 2)}: Поле не найдено...

Ошибка при печати
Здравствуйте, у меня такая проблема сделал программу но она не выводит на печать файл подгружаемый из XML, пожалуйста помогите решить эту...

Ошибка при печати 0x00002ef3
0x00002ef3 не могу понять в чем дело, принтер раньше работал нормально между 4 компами. Но сегодня он не печатал и выдавал такую ошибку....

Ошибка 1004 при печати
Почему то не печатает выделенную область Sheets(&quot;Заказы с истекшим сроком&quot;).Activate Sheets(&quot;Заказы с истекшим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 16.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 15.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru