Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно свойство у своего компонента вставить в, контекстное меню(типа NewButton ToolBar 
:(
    Опции темы
SerK
Дата 2.6.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день, друзья!

Кто создавал свои компоненты, может знает, как сделать так , чтобы у моего компонента отображалась какое-либо свойство в PopurMenu как у ToolBar - NewButton или у PageControl (в процессе разработки).  Думаю создать свой PageControl, чтобы улучшить графику у этого компонента.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
SABROG
Дата 2.6.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Попробуй обработать событие OnContextPopup, возьми указатель на Sender и добавь свои итемы.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Vyacheslav
Дата 3.6.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(SABROG @  2.6.2008,  13:10 Найти цитируемый пост)
Попробуй обработать событие OnContextPopup, возьми указатель на Sender и добавь свои итемы. 

 Он не о том спрашивает smile



Счас попытаюсь вспомнить smile
Создаем свой ComponentEditor

Декларация:
Код

ifndef RasDialEditorH
#define RasDialEditorH
//---------------------------------------------------------------------------
#if __BORLANDC__== 0x0550
        #include <dsgnintf.hpp>
#elif __BORLANDC__ == 0x0560
        #include  <designeditors.hpp>
#endif

namespace RasDialWrapper
{
class TRasDialEditor : public TComponentEditor
{
        typedef TComponentEditor inherited;
public:
        virtual AnsiString __fastcall GetVerb(int Index);
#if __BORLANDC__== 0x0550
        virtual void __fastcall PrepareItem(int Index,
                                             const Menus::TMenuItem* AItem);

#elif __BORLANDC__ == 0x0560
/*
        virtual void __fastcall PrepareItem(int Index,
                                             const Designmenus::_di_IMenuItem AItem);
*/
#endif





        virtual void __fastcall ExecuteVerb(int Index);

#pragma option push -w-inl
       // у нас будет 4 дополнительных пункта меню
        virtual int _fastcall GetVerbCount(void){return 4;}
        inline __fastcall virtual
                   TRasDialEditor(Classes::TComponent* AComponent,
                                    _di_IDesigner ADesigner):
                                    TComponentEditor(AComponent, ADesigner){};
        inline __fastcall virtual ~TRasDialEditor(){};
#pragma option pop
};
}
using namespace RasDialWrapper;
#endif



Реализация

Код


#include <vcl.h>

#pragma hdrstop
#include <memory>

#include "RasDial.h"
#include "RasDialEditor.h"
#include "DialingDialog.h"

#define  VERSION  " 1.0"

//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
AnsiString __fastcall TRasDialEditor::GetVerb(int nIndex)
{
        switch (nIndex)
        {
          case 0:
          return "&Dialing...";
          case 1: return "Version "VERSION;
          case 2: return "© 2001 V.Yermolayev";
          case 3: return "-";
          default: return "";
        }
}
//---------------------------------------------------------------------------
#if __BORLANDC__== 0x0550
void __fastcall TRasDialEditor::PrepareItem(int nIndex,
                                             const Menus::TMenuItem* AItem)

{
    if (nIndex == 0)
    {
       TMenuItem* MenuItem = const_cast<TMenuItem*>(AItem);
       MenuItem->Bitmap->LoadFromResourceName(reinterpret_cast<int>(HInstance),
         "MENUBITMAP");
    }
}
#elif __BORLANDC__ == 0x0560
/*
void __fastcall TRasDialEditor::PrepareItem(int nIndex,
                                              const Designmenus::_di_IMenuItem AItem)

{
    if (nIndex == 0)
    {
       //Designmenus::_di_IMenuItem AItem MenuItem =
       //            const_cast< const Designmenus::_di_IMenuItem AItem>(AItem);
       AItem->Bitmap->LoadFromResourceName(reinterpret_cast<int>(HInstance),
         "MENUBITMAP");
    }
}
*/
#endif
//---------------------------------------------------------------------------
void __fastcall TRasDialEditor::ExecuteVerb(int nIndex)
{
        switch (nIndex)
        {
          case 0:
          {
            std::auto_ptr<TDialingForm> Dlg(new TDialingForm(NULL,Component));
            Dlg->ShowModal();
          }
          break;
          case 1: ;
          break;
          case 2: ;
          break;
          case 3: ;
          break;
          default: break;
        }
}
//---------------------------------------------------------------------------








Регистрация 
Код

                RegisterComponentEditor(__classid(TRasDial),
                                        __classid(TRasDialEditor));



Добавлено @ 11:58
В результате появятся четыре пункта меню, включая разделитель.  На первый пункт будет вызываться окно с дозвоном, на три других ничего происходить не будет.   Они просто носят информационный и декоративный характер

Dialing...
Version 1
© 2001 V.Yermolayev 
----------------------------------------------


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
SerK
Дата 6.6.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav 

Огромное спасибо, еще не пробывал, но это то о чем я спрашивал.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
SerK
Дата 7.8.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Давно не было возможности посетить форум, но вопросы по этой теме остались.

Есть у меня книга Шамиса, по ней пытаюсь прописать в своем компонента редактор свойств TStringProperty. Работает во время проектирования, но при компиляции выдается сообщение об ошибке:

Код

[Linker Error] Unresolved external '__tpdsc__ Designeditors::TStringProperty' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\LIB\PROBAEDITPROPP.LIB|E:\Мои проекты-С++\Компоненты\ ProbaEditProp\ProbaEditProp.cpp
  [Linker Error] Unresolved external 'Designeditors::TStringProperty::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\LIB\PROBAEDITPROPP.LIB|E:\Мои проекты-С++\Компоненты \ProbaEditProp\ProbaEditProp.cpp


Уже три дня бьюсь на этой проблемой, пересмотрел все справки, примеры в Борланде, не могу найти ошибку. 

Вячеслав, спасибо за помощь, ваш совет как прописать PropertyList, действует, но тоже до компиляции. В чем тут дело? Уже голова пухнет.

Вот код компонента (чисто пробный пример, он реализует одно только свойство - строковый редактор для Caption):

Код

//Файл Н:
//---------------------------------------------------------------------------
#ifndef ProbaEditPropH
#define ProbaEditPropH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <DesignIntf.hpp>
#include <DesignEditors.hpp>
//---------------------------------------------------------------------------
class PACKAGE TProbaEditProp : public TGraphicControl
{
private:
        String FCaption;
protected:
        
public:
        __fastcall TProbaEditProp(TComponent* Owner);
        __fastcall virtual ~TProbaEditProp(void);
__published:
        __property String Caption={read=FCaption,write=FCaption};
};
//---------------------------------------------------------------------------
class TMyPropertyEditor : public TStringProperty
{
public:
        TPropertyAttributes __fastcall GetAttributes();
        void __fastcall GetValues(TGetStrProc StrVal);
        void __fastcall Edit();
        void __fastcall CreateFormDialog();

};
//---------------------------------------------------------------------------
#endif


//Файл СРР:
#include <vcl.h>
#pragma hdrstop

#include "ProbaEditProp.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
static inline void ValidCtrCheck(TProbaEditProp *)
{
            new TProbaEditProp(NULL);
}
//---------------------------------------------------------------------------
__fastcall TProbaEditProp::TProbaEditProp(TComponent* Owner)
            : TGraphicControl(Owner)
{
}
//---------------------------------------------------------------------------
TPropertyAttributes __fastcall TMyPropertyEditor::GetAttributes()
{
 return  TPropertyAttributes()<<paDialog;
}
//---------------------------------------------------------------------------
void __fastcall TMyPropertyEditor::GetValues(TGetStrProc StrVal)
{

}
//---------------------------------------------------------------------------
void __fastcall TMyPropertyEditor::Edit()
{
 CreateFormDialog();
}
//---------------------------------------------------------------------------
namespace Probaeditprop
{
       void __fastcall PACKAGE Register()
       {
        TComponentClass classes[1] = {__classid(TProbaEditProp)};
        RegisterComponents("MySamples", classes, 0);
        PTypeInfo  typeinfo=*GetPropInfo(__typeinfo(TProbaEditProp),
                 "Caption")->PropType;
        RegisterPropertyEditor(typeinfo,__classid(TProbaEditProp),
                 "Caption",__classid(TMyPropertyEditor));
       }
}
//---------------------------------------------------------------------------
__fastcall TProbaEditProp::~TProbaEditProp(void)
{
Destroying();
}
void __fastcall TMyPropertyEditor::CreateFormDialog()
{
TForm *formStrDialog=new TForm(Application);
 formStrDialog->Left=200;
 formStrDialog->Top=Screen->DesktopHeight/3;
 formStrDialog->BorderStyle=bsDialog;
 formStrDialog->Caption="Вставить текст";

 TMemo *memo=new TMemo(formStrDialog);
 memo->Parent=formStrDialog;
 memo->Left=7;
 memo->Top=7;
 memo->Width=formStrDialog->ClientWidth-14;
 memo->Height=formStrDialog->ClientHeight-45;

 TButton *buttNo=new  TButton(formStrDialog);
 buttNo->Parent=formStrDialog;
 buttNo->Left=memo->Left+memo->Width-buttNo->Width;
 buttNo->Top=memo->Top+memo->Height+7;
 buttNo->Caption="Нет";
 buttNo->ModalResult=mrCancel;

 TButton *buttYes=new  TButton(formStrDialog);
 buttYes->Parent=formStrDialog;
 buttYes->Left=buttNo->Left-buttYes->Width-5;
 buttYes->Top=buttNo->Top;
 buttYes->Caption="Да";
 buttYes->ModalResult=mrOk;
 buttYes->TabOrder=1;

 formStrDialog->ShowModal();
 if(formStrDialog->ModalResult==mrOk)
  {SetValue(memo->Text);}
 else {formStrDialog->Close();}
 
 delete formStrDialog;
}



Кстати, этот компонент можно установить и опробовать.
Может у кого есть готовый отлаженный пример, буду очень благодарен, вышлю исходный код компонента типа TListView, где заголовки, ячейки закрашиваются градиентом, разными цветами, используется разноцветные надписи и тд.
 
Приблизительный будущий вид компонента (это не фотошоп) в присоединенном файле:




Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  Untitled_1.jpg 304,33 Kb


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
xvr
Дата 8.8.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SerK @ 7.8.2008,  20:14)
Давно не было возможности посетить форум, но вопросы по этой теме остались.

Есть у меня книга Шамиса, по ней пытаюсь прописать в своем компонента редактор свойств TStringProperty. Работает во время проектирования, но при компиляции выдается сообщение об ошибке:

Код

[Linker Error] Unresolved external '__tpdsc__ Designeditors::TStringProperty' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\LIB\PROBAEDITPROPP.LIB|E:\Мои проекты-С++\Компоненты\ ProbaEditProp\ProbaEditProp.cpp
  [Linker Error] Unresolved external 'Designeditors::TStringProperty::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\LIB\PROBAEDITPROPP.LIB|E:\Мои проекты-С++\Компоненты \ProbaEditProp\ProbaEditProp.cpp


Уже три дня бьюсь на этой проблемой, пересмотрел все справки, примеры в Борланде, не могу найти ошибку. 

Вячеслав, спасибо за помощь, ваш совет как прописать PropertyList, действует, но тоже до компиляции. В чем тут дело? Уже голова пухнет.

Вот код компонента (чисто пробный пример, он реализует одно только свойство - строковый редактор для Caption):

Код

//Файл Н:
//---------------------------------------------------------------------------
#ifndef ProbaEditPropH
#define ProbaEditPropH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <DesignIntf.hpp>
#include <DesignEditors.hpp>
//---------------------------------------------------------------------------
class PACKAGE TProbaEditProp : public TGraphicControl
{
private:
        String FCaption;
protected:
        
public:
        __fastcall TProbaEditProp(TComponent* Owner);
        __fastcall virtual ~TProbaEditProp(void);
__published:
        __property String Caption={read=FCaption,write=FCaption};
};
//---------------------------------------------------------------------------
class TMyPropertyEditor : public TStringProperty
{
public:
        TPropertyAttributes __fastcall GetAttributes();
        void __fastcall GetValues(TGetStrProc StrVal);
        void __fastcall Edit();
        void __fastcall CreateFormDialog();

};
//---------------------------------------------------------------------------
#endif


//Файл СРР:
#include <vcl.h>
#pragma hdrstop

#include "ProbaEditProp.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
static inline void ValidCtrCheck(TProbaEditProp *)
{
            new TProbaEditProp(NULL);
}
//---------------------------------------------------------------------------
__fastcall TProbaEditProp::TProbaEditProp(TComponent* Owner)
            : TGraphicControl(Owner)
{
}
//---------------------------------------------------------------------------
TPropertyAttributes __fastcall TMyPropertyEditor::GetAttributes()
{
 return  TPropertyAttributes()<<paDialog;
}
//---------------------------------------------------------------------------
void __fastcall TMyPropertyEditor::GetValues(TGetStrProc StrVal)
{

}
//---------------------------------------------------------------------------
void __fastcall TMyPropertyEditor::Edit()
{
 CreateFormDialog();
}
//---------------------------------------------------------------------------
namespace Probaeditprop
{
       void __fastcall PACKAGE Register()
       {
        TComponentClass classes[1] = {__classid(TProbaEditProp)};
        RegisterComponents("MySamples", classes, 0);
        PTypeInfo  typeinfo=*GetPropInfo(__typeinfo(TProbaEditProp),
                 "Caption")->PropType;
        RegisterPropertyEditor(typeinfo,__classid(TProbaEditProp),
                 "Caption",__classid(TMyPropertyEditor));
       }
}
//---------------------------------------------------------------------------
__fastcall TProbaEditProp::~TProbaEditProp(void)
{
Destroying();
}
void __fastcall TMyPropertyEditor::CreateFormDialog()
{
TForm *formStrDialog=new TForm(Application);
 formStrDialog->Left=200;
 formStrDialog->Top=Screen->DesktopHeight/3;
 formStrDialog->BorderStyle=bsDialog;
 formStrDialog->Caption="Вставить текст";

 TMemo *memo=new TMemo(formStrDialog);
 memo->Parent=formStrDialog;
 memo->Left=7;
 memo->Top=7;
 memo->Width=formStrDialog->ClientWidth-14;
 memo->Height=formStrDialog->ClientHeight-45;

 TButton *buttNo=new  TButton(formStrDialog);
 buttNo->Parent=formStrDialog;
 buttNo->Left=memo->Left+memo->Width-buttNo->Width;
 buttNo->Top=memo->Top+memo->Height+7;
 buttNo->Caption="Нет";
 buttNo->ModalResult=mrCancel;

 TButton *buttYes=new  TButton(formStrDialog);
 buttYes->Parent=formStrDialog;
 buttYes->Left=buttNo->Left-buttYes->Width-5;
 buttYes->Top=buttNo->Top;
 buttYes->Caption="Да";
 buttYes->ModalResult=mrOk;
 buttYes->TabOrder=1;

 formStrDialog->ShowModal();
 if(formStrDialog->ModalResult==mrOk)
  {SetValue(memo->Text);}
 else {formStrDialog->Close();}
 
 delete formStrDialog;
}



Кстати, этот компонент можно установить и опробовать.
Может у кого есть готовый отлаженный пример, буду очень благодарен, вышлю исходный код компонента типа TListView, где заголовки, ячейки закрашиваются градиентом, разными цветами, используется разноцветные надписи и тд.
 
Приблизительный будущий вид компонента (это не фотошоп) в присоединенном файле:

Добавь в проект run-time package designide.bpi
А вообще лучше выделять у компонента все редакторы и пр. design time прибамбахи в отдельную dll (пакет) и грузить ее динамически (через LoadPackage), иначе придется вместе с приложением таскать все редакторы компонентов и кусок самого Builder IDE  smile 
PM MAIL   Вверх
SerK
Дата 8.8.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr

Цитата

Добавь в проект run-time package designide.bpi
 

Этот файл у меня есть. Без него даже во время проектирования приложения при добавлении компонента выскакивает подобная ошибка. Кстати, файл  подредактированный, как записанно в книге.
Делал я также одтельный файл с редактором свойств, результат тотже. 
Кто занимается созданием компонентов, есть ли у вас подобная проблема?
Может скинете готовый действующий пример наипростейшего компонента с пакетом (.bpk), а я уж сам попробую разобраться, если нет времени копаться с моим вопросом?


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
Vyacheslav
Дата 8.8.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(SerK @  8.8.2008,  15:17 Найти цитируемый пост)
Этот файл у меня есть. Без него даже во время проектирования приложения при добавлении компонента выскакивает подобная ошибка. Кстати, файл  подредактированный, как записанно в книге.

Он говорит Вам не о designide.hpp
а о designide.bpi, который вы должны добавить в папку Requires в менеджере проекта



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
SerK
Дата 8.8.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav

Я тоже говорю о designide.bpi. Я его подключил из Борландовской библиотеки, то есть сделал по всем правилам, но увы. Выдает компилятор сообщение об ошибке.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
Vyacheslav
Дата 12.8.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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





Цитата(SerK @  8.8.2008,  17:04 Найти цитируемый пост)
Я тоже говорю о designide.bpi. Я его подключил из Борландовской библиотеки, то есть сделал по всем правилам, но увы. Выдает компилятор сообщение об ошибке.


Тогда что это такое,
Цитата(SerK @  8.8.2008,  15:17 Найти цитируемый пост)
Кстати, файл  подредактированный, как записанно в книге.

Что Вы редактировали в bpi-файле?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
SerK
Дата 13.8.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav 

Похоже я нашел причину, дело в том, что мешало тире в названии папки: E:\Мои проекты-С++. Изменил на E:\Мои проекты С++ и все заработало.
А Шамис пишет, что нужно в designide.bpi  редактировать строку <PFLAGS= >, нет Борланда на этом компьютере, поэтому не  могу точно привести код, не помню.
Кстати, редактировать этот файл не надо, все работает и так. Вообще, у этого автора куча ошибок (скорее всего умышленных) и недописок.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
xvr
Дата 14.8.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SerK @ 13.8.2008,  22:01)
Vyacheslav 

Похоже я нашел причину, дело в том, что мешало тире в названии папки: E:\Мои проекты-С++. Изменил на E:\Мои проекты С++ и все заработало.

Это уже можно заносить в FAQ - Bulder не любит минусов в путях, у его линкера сносит крышу - он начинает считать, что все после знака '-' это опции, где бы он этот '-' не нашел  smile 
Цитата

А Шамис пишет, что нужно в designide.bpi  редактировать строку <PFLAGS= >, 
 Где где нужно редактировать ?!!!  smile designide.bpi  бинарный файл (статическая библиотека), не надо его редактировать (да и не получится)  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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