Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Создание отчета в HTML


Автор: Нитонисе 9.6.2011, 22:01
Нужно сгенерировать отчет о выполненном инженерном расчете. Возможностей мемо и ричэдита не хватает. Генерация в ворд происходит медленно. Решил делать в HTML используя компонент CppWebBrowser. На данный момент это выглядит лучшим вариантом, хотя есть и определенные неудобства. 

Есть ли какие-то еще компоненты, куда можно выводить HTML-отчет? Есть ли какие-то специальные классы облегчающие работу с HTML?

Автор: Alca 10.6.2011, 09:57
У тебя только таблицы?

Добавлено через 3 минуты и 5 секунд
FastReport кажись может делать HTML 

Автор: Нитонисе 10.6.2011, 10:16
Таблицы, картинки, формулы, текст... 
FastReport что-то мне совсем не понравился... точнее сказать я не разобрался как он работает  smile  Вообще имел ввиду стандартные компоненты, там есть что-нибудь кроме CppWebBrowser, способное отображать текст HTML?

Автор: Alca 10.6.2011, 11:14
глянь здесь http://jvcl.delphi-jedi.org/

Автор: Нитонисе 10.6.2011, 11:44
Цитата(Alca @  10.6.2011,  11:14 Найти цитируемый пост)
глянь здесь http://jvcl.delphi-jedi.org/

А что это такое?

Автор: Alca 10.6.2011, 11:47
Цитата

he JEDI Visual Component Library (JVCL) consists of a large collection (currently ca 500) visual and non-visual components which can be instantly reused in your Delphi, Kylix and C++ Builder projects.

Автор: artsb 13.6.2011, 22:24
Зачем какие-то компоненты?
Я делал так:
Добавлял в проект форму, на которой лежит только CppWebBrowser.
В коде формировал страницу динамически или же брал шаблон и делал соответствующие замены.
Далее, сохранял готовую страницу во временную папку %Temp%
Скармливал этот файл CppWebBrowser.
Вызывал метод "Предпросмотр" (для печати).

Автор: Нитонисе 14.6.2011, 09:30
Цитата(artsb @  13.6.2011,  22:24 Найти цитируемый пост)
Зачем какие-то компоненты?Я делал так:Добавлял в проект форму, на которой лежит только CppWebBrowser.В коде формировал страницу динамически или же брал шаблон и делал соответствующие замены.Далее, сохранял готовую страницу во временную папку %Temp%Скармливал этот файл CppWebBrowser.Вызывал метод "Предпросмотр" (для печати).

Так я так и делаю. Только есть всякие неудобства, потому и спросил об альтернативных вариантах. Кстати, а как печать можно повесить на отдельную кнопу, а не из контекстного меню вызывать?

Автор: artsb 14.6.2011, 10:58
Цитата(Нитонисе @  14.6.2011,  09:30 Найти цитируемый пост)
Так я так и делаю. Только есть всякие неудобства, потому и спросил об альтернативных вариантах. Кстати, а как печать можно повесить на отдельную кнопу, а не из контекстного меню вызывать? 

Судя по последнему предложению, вы делаете не так как я smile
Говоря, вызываю предпросмотр, я имел ввиду, не отображение окна с CppWebBrowser, а вызов его метода, который создаёт стандартное окно предпросмотра с различными опциями:
Код

    OleVariant vaIn, vaOut;

    try {
        CppWebBrowser1->ControlInterface->ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut);
    }
    catch(...) { ; }

Автор: Нитонисе 14.6.2011, 14:15
А где можно посмотреть возможные параметры такого вызова?

Автор: Нитонисе 14.6.2011, 15:15
С параметрами немного разобрался. Вот какой вопрос появился.

У меня CppWebBrowser лежит на отдельной форме. На главной форме кнопка - предварительный просмотр. По нажатию на нее CppWebBrowser заполняется актуальным отчетом и нужно чтобы раскрылась форма предварительного просмотра на весь монитор. Ваша команда в этом случае не срабатывает. Похоже ей надо чтобы форма с отчетом была видна.

Автор: artsb 14.6.2011, 17:40
Странно. У меня всё работало. Правда, я не помню точно как делал. Весь код у меня на работе. А я сейчас в отпуске. Если получится, позвоню другу: может он глянет.

Автор: ZVano 14.6.2011, 18:25
Цитата(artsb @  13.6.2011,  22:24 Найти цитируемый пост)
Далее, сохранял готовую страницу во временную папку %Temp%

Можно текст HTML гнать напрямую в TWebBrowser без временного файла.
Функция, которая делает это 3мя разными способами. Способ задается в method (1, 2, 3)
Код

#include "Mshtml.hpp"
#include "UTILCLS.H"
#include "DateUtils.hpp"

bool SetWbrHtml(TWebBrowser * wbr, UnicodeString fNotify, int method) {
    bool result = false;
    try {
        wbr->Navigate("about:blank");
        // WebBrowserReadyState::Uninitialized;
        // wbr->ReadyState
        TDateTime timeStat = Now();
        //DateUtils::SecondsBetween
        //SecondsBetween
        do {
            Application->ProcessMessages();
            __int64 timeLeft = SecondsBetween(Now(), timeStat);
            if (timeLeft > 10)
                return false;
        }
        while (wbr->ReadyState != tagREADYSTATE::READYSTATE_COMPLETE);

        switch(method) {
        case 1: {
                IHTMLDocument2 * document = NULL;
                wbr->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*) & document);
                document->body->Set_innerHTML(fNotify);
                result = true;
                break;
            }
        case 2: {
                if (!wbr->Document)
                    return false;

                TComInterface<IHTMLDocument2>pDocument;
                wbr->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*) & pDocument);

                if (!pDocument)
                    return false;

                pDocument->body->innerHTML = fNotify;

                result = true;
                break;
            }
        case 3: {
                // wbr->OleObject.Document.body.innerHTML = fNotify;
            }
        }
    }
    catch(...) {
    }
    return result;
}




Автор: Нитонисе 15.6.2011, 13:25
А где можно посмотреть управляющие команды для формирования колонтитулов в отчете при выполнению функции предпросмотра? Вот например номер страницы задается последовательностью &p. А как выровнять этот номер страницы по правому краю?

Автор: artsb 16.6.2011, 10:27
Удалось дозвониться. В целом всё как я и говорил. Единственное, CppWebBrowser лежит на главной форме и он не скрыт, а убран за левый край формы.

Цитата(Нитонисе @  15.6.2011,  13:25 Найти цитируемый пост)
А где можно посмотреть управляющие команды для формирования колонтитулов в отчете при выполнению функции предпросмотра? Вот например номер страницы задается последовательностью &p. А как выровнять этот номер страницы по правому краю?

Нужно на MSDN'е поискать. По идее, всё это Microsoft'овские фишки. Так что я думаю, что можно и в справке по Word это поискать.

Автор: Нитонисе 19.6.2011, 12:36
Цитата(artsb @  16.6.2011,  10:27 Найти цитируемый пост)
Удалось дозвониться. В целом всё как я и говорил. Единственное, CppWebBrowser лежит на главной форме и он не скрыт, а убран за левый край формы.

Да, так все работает, но есть неудобство связанное с тем, что окно предварительного просмотра имеет размеры формы моего приложения. У меня приложение не полноэкранное, соответственно и форма предпросмотра маленькая. А хотелось бы ее развернуть на весь монитор. Как это сделать? Стандартной системной кнопки в этом окне нет.

Автор: artsb 19.6.2011, 18:58
Цитата(Нитонисе @  19.6.2011,  12:36 Найти цитируемый пост)
Как это сделать? Стандартной системной кнопки в этом окне нет. 

Да. Кнопки нет.
Ещё одна поправочка: я использовал не CppWebBrowser, а просто WebBrowser smile Вот у него, окно разворачивается на весь экран.

Автор: Нитонисе 20.6.2011, 08:52
Цитата(artsb @  19.6.2011,  18:58 Найти цитируемый пост)
Ещё одна поправочка: я использовал не CppWebBrowser, а просто WebBrowser  Вот у него, окно разворачивается на весь экран.

А где вы такой компонент нашли?

Автор: artsb 20.6.2011, 10:53
Цитата(Нитонисе @  20.6.2011,  08:52 Найти цитируемый пост)
А где вы такой компонент нашли? 

Там же где и CppWebBrowser, в разделе Internet.

Автор: Нитонисе 20.6.2011, 11:17
Цитата(artsb @  20.6.2011,  10:53 Найти цитируемый пост)
Там же где и CppWebBrowser, в разделе Internet.

А у меня нет такого компонента. У меня билдер 6, а у вас?

Автор: artsb 20.6.2011, 11:25
У меня RAD Studio XE.

Автор: Нитонисе 20.6.2011, 11:43
А можно как-то ваш компонент установить на билдер?

Автор: artsb 20.6.2011, 12:18
Нет. Это компонент вшитый в среду.
В принципе, разница между превью (Print Preview) одного и другого только в том, что у WebBrowser окно предпросмотра развёрнуто на весь экран. Это можно сделать и вручную:
1. найти окно и получить его хендл
2. получить размеры рабочей области экрана
3. установить эти размеры для окна предпросмотра

Но тут есть один нюанс. Окно предпросмотра открывается как модальное. Поэтому, нужно либо стартовать поток (перед вызовом окна предпросмотра), который выполнит описанные выше шаги, либо искать ещё какое-нибудь решение.

Автор: Нитонисе 20.6.2011, 13:26
Чем вручную это делать - мне наверное будет проще установить эту среду разработки с тем чтобы использовать более удобный компонент  smile 

Автор: artsb 20.6.2011, 15:57
Да делать не так уж и много. Но решайте сами. По идее, этот компонент появился с C++Builder 2006. Но я точно не уверен.

Автор: Нитонисе 20.6.2011, 16:19
Я имел ввиду не то, что это много кода, а то, что я не знаю как это делать. А в билдере 6 такого компонента точно нет... А RAD Studio XE - получше шестерки, или на любителя?

Автор: artsb 20.6.2011, 16:59
Ну как получше... Среда развивается. Добавляется что-то новое. Устраняются старые баги. Появляются новые smile

Автор: ZVano 21.6.2011, 09:07
Цитата(Нитонисе @  20.6.2011,  16:19 Найти цитируемый пост)
А RAD Studio XE - получше шестерки, или на любителя?

Не знаю как XE, но в 2010й есть плющки из за которых стоит переходить.
+  сворачивание кода
+ удобная палитра компонент
+ удобные сворачивающиеся панели инструментов
+ поиск и замена имен переменных и типов.
ну, и деготь
- менее удобная справка
- больше глюков самой IDE

Автор: Нитонисе 21.6.2011, 09:30
Улучшения интерфейса мне менее важны. А вот уменьшение глюков IDE и наличие новых компонентов - приветствуется  smile 

Автор: ZVano 21.6.2011, 10:37
Цитата(Нитонисе @  21.6.2011,  09:30 Найти цитируемый пост)
лучшения интерфейса мне менее важны.

IMXO: Сворачивание кода просто обязана поддеорживать любой современный редактор кода. Иначе путаешся на больших кусках кода.
Еще одна очень важная функция - самодокументирование кода с возможностью генерации хклпов по исходникам (как в VS). К сожалению, 2010я этого не умеет. 

Цитата(Нитонисе @  21.6.2011,  09:30 Найти цитируемый пост)
наличие новых компонентов

Опять же IMXO - компонент в инете валом. Можно найти на любой вкус и цвет как для BCB6, так и для 2010й.
В 2010 есть ряд стандартных интересных новых(возможно, насчет некоторых ошибаюсь) компонент.
+ TCategoryPanrlGroup 
+ TGridPanel
+ TButtonedEdit
+ TButtonGroup
+ TTrayIcon
+ TCategoryButtons
+ TButtonedEdit

Автор: Нитонисе 21.6.2011, 12:01
Цитата(ZVano @  21.6.2011,  10:37 Найти цитируемый пост)
Опять же IMXO - компонент в инете валом.

Хотелось бы, чтоб они были выполнены профессионально и хорошо документированы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)