Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание отчета в HTML, какие компоненты использовать? 
:(
    Опции темы
Нитонисе
Дата 9.6.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

Есть ли какие-то еще компоненты, куда можно выводить HTML-отчет? Есть ли какие-то специальные классы облегчающие работу с HTML?
PM MAIL   Вверх
Alca
Дата 10.6.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



У тебя только таблицы?

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


--------------------
PM WWW ICQ Skype Jabber   Вверх
Нитонисе
Дата 10.6.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Таблицы, картинки, формулы, текст... 
FastReport что-то мне совсем не понравился... точнее сказать я не разобрался как он работает  smile  Вообще имел ввиду стандартные компоненты, там есть что-нибудь кроме CppWebBrowser, способное отображать текст HTML?
PM MAIL   Вверх
Alca
Дата 10.6.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



глянь здесь http://jvcl.delphi-jedi.org/


--------------------
PM WWW ICQ Skype Jabber   Вверх
Нитонисе
Дата 10.6.2011, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

А что это такое?
PM MAIL   Вверх
Alca
Дата 10.6.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

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.


Это сообщение отредактировал(а) Alca - 10.6.2011, 12:58


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 13.6.2011, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 14.6.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

Так я так и делаю. Только есть всякие неудобства, потому и спросил об альтернативных вариантах. Кстати, а как печать можно повесить на отдельную кнопу, а не из контекстного меню вызывать?
PM MAIL   Вверх
artsb
Дата 14.6.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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

    OleVariant vaIn, vaOut;

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



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 14.6.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



А где можно посмотреть возможные параметры такого вызова?
PM MAIL   Вверх
Нитонисе
Дата 14.6.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



С параметрами немного разобрался. Вот какой вопрос появился.

У меня CppWebBrowser лежит на отдельной форме. На главной форме кнопка - предварительный просмотр. По нажатию на нее CppWebBrowser заполняется актуальным отчетом и нужно чтобы раскрылась форма предварительного просмотра на весь монитор. Ваша команда в этом случае не срабатывает. Похоже ей надо чтобы форма с отчетом была видна.
PM MAIL   Вверх
artsb
Дата 14.6.2011, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

Это сообщение отредактировал(а) artsb - 14.6.2011, 17:40


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZVano
Дата 14.6.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(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;
}






--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Нитонисе
Дата 15.6.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

Это сообщение отредактировал(а) Нитонисе - 15.6.2011, 13:25
PM MAIL   Вверх
artsb
Дата 16.6.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 19.6.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

Да, так все работает, но есть неудобство связанное с тем, что окно предварительного просмотра имеет размеры формы моего приложения. У меня приложение не полноэкранное, соответственно и форма предпросмотра маленькая. А хотелось бы ее развернуть на весь монитор. Как это сделать? Стандартной системной кнопки в этом окне нет.
PM MAIL   Вверх
artsb
Дата 19.6.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 20.6.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

А где вы такой компонент нашли?
PM MAIL   Вверх
artsb
Дата 20.6.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 20.6.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

А у меня нет такого компонента. У меня билдер 6, а у вас?
PM MAIL   Вверх
artsb
Дата 20.6.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



У меня RAD Studio XE.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 20.6.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



А можно как-то ваш компонент установить на билдер?
PM MAIL   Вверх
artsb
Дата 20.6.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 20.6.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Чем вручную это делать - мне наверное будет проще установить эту среду разработки с тем чтобы использовать более удобный компонент  smile 

Это сообщение отредактировал(а) Нитонисе - 20.6.2011, 13:27
PM MAIL   Вверх
artsb
Дата 20.6.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 20.6.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Я имел ввиду не то, что это много кода, а то, что я не знаю как это делать. А в билдере 6 такого компонента точно нет... А RAD Studio XE - получше шестерки, или на любителя?
PM MAIL   Вверх
artsb
Дата 20.6.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZVano
Дата 21.6.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



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

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

Это сообщение отредактировал(а) ZVano - 21.6.2011, 09:08


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Нитонисе
Дата 21.6.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Улучшения интерфейса мне менее важны. А вот уменьшение глюков IDE и наличие новых компонентов - приветствуется  smile 
PM MAIL   Вверх
ZVano
Дата 21.6.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



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

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

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

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


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Нитонисе
Дата 21.6.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

Хотелось бы, чтоб они были выполнены профессионально и хорошо документированы.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.