четверг, 23 апреля 2009 г.

Интерфейс для работы с TOM (C++ Builder)

Написал на досуге интерфейс для работы с ТОМ. ТОМ это быстрый доступ к параметрам текста в RichEdit. Также возможность подчеркивания текста волнистой линией, задания защиты, видимости текста и прочего. Также можно работать с MS Word и другими приложениями поддерживающими ТОМ. Интерфейс простой.

Использование.
Вместо знака больше я буду писать %.
//Создание. Передаем хендл окна редактора
TOM_INTERFACE TOMI=TOM_INTERFACE(RichEdit1-%Handle);
TOMI.SelStart=RichEdit1-%SelStart;
TOMI.SelLen=RichEdit1-%SelLength;
TOMI.SelFont.Bold=true;
TOM.SelFont.Underline = TOM.SelFont.CalcUL(ULC_RED,ULT_WAVE);

Таким образом мы подчеркиваем, текст выделеный в ричэдит1 жирным и подчеркнули его красной волной.
Всего есть около 20 параметров.
TOMI-%Freeze=true; - замораживает обновления текста и запись UNDO.
Чтобы подсветка не моргала.
TOMI-%Freeze=false; - отмораживает обновления текста и запись UNDO.
Я выложу исходник. Только он будет калично отображаться. Нажмите посмотреть исходный текст в страницы в браузере и оттуда скопируйте.

#include
#include
#include

enum TOMI_INTERFACE_ERROR
{
TIE_NOERRROR,
TIE_CANT_GET_OLE_INTERFACE,
TIE_QUERY_iUNK_To_iDOC_ERROR
};

//ЕСЛИ компилер не билдер заменить на прокси
#define NULLr(X){if(X!=NULL &&AutoRelease){X->Release();}X=NULL;}
#define NULL_ALL(){NULLr(pDoc);NULLr(pRange);NULLr(pFont);TEMP_SelStart=0;TEMP_SelLen=0;TEMP_SelEnd=0;}
#define PROPERTY_FUN_SET(X,Y) void __fastcall Set##Y(X Value);
#define PROPERTY_FUN_GET(X,Y) X __fastcall Get##Y(){return TEMP_##Y;};
#define PROPERTY_FUN(X,Y) protected: PROPERTY_FUN_GET(X,Y) PROPERTY_FUN_SET(X,Y)
#define PROPERTY_INIT(X,Y) public: __property X Y={read= Get##Y, write = Set##Y};
#define PROPERTY(X,Y) private: X TEMP_##Y; PROPERTY_FUN(X,Y) PROPERTY_INIT(X,Y)

//;X __fastcall Get##Y();}

class TOMI_FONT;
class TOM_INTERFACE
{
friend TOMI_FONT;
protected://PROPERTIES
PROPERTY(long,SelStart)// НЕ НАВОДИТЕ СЮДА МЫШЬ в BCB лиюо отключите InsideCOde Parsing опции
PROPERTY(long,SelLen)// БИЛДЕР может зависнуть
PROPERTY(long,SelEnd)
PROPERTY(bool,Freeze)

private:
ITextDocument * pDoc;
ITextRange * pRange;
ITextFont * pFont;
long DontRefreshSels;

long LastQueryInterfaceRes;
TOMI_INTERFACE_ERROR LAST_ERROR;
long LastMessageReturn;

void * RE_HANDLE;
long FreezeCount;
long GetILen(){GETTEXTLENGTHEX tl = { GTL_NUMCHARS, 1200};
return SendMessage(RE_HANDLE, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0);}
public:
TOMI_FONT * SelFont;
bool AutoRelease;// Освобождение памяти.
bool OneFreeze;// Только один фриз. Окно неиспользуеться другими объекстами

void TOMI_GET_LAST_ERROR(TOMI_INTERFACE_ERROR & ERR, long & QueryIntRes, long & LastMessReturn)
{
ERR=LAST_ERROR; QueryIntRes=LastQueryInterfaceRes; LastMessReturn=LastMessageReturn;
}
TOM_INTERFACE(void * inRE_HANDLE);
~TOM_INTERFACE()
{
delete SelFont;
NULL_ALL();
}
ITextDocument * GetIDoc(bool Refresh=false)
{
if (Refresh)
NULL_ALL();
if (pDoc!=NULL)
return pDoc;
IUnknown *pUnk = NULL;
LastMessageReturn=SendMessage(RE_HANDLE, EM_GETOLEINTERFACE, 0, (LPARAM)&pUnk);
if(pUnk==NULL)
{
NULL_ALL();
LAST_ERROR=TIE_CANT_GET_OLE_INTERFACE;
return NULL;
}
LastQueryInterfaceRes = pUnk->QueryInterface(__uuidof(ITextDocument),(void **) &pDoc);
if(LastQueryInterfaceRes == NOERROR)
return pDoc;
else
{
LAST_ERROR=TIE_QUERY_iUNK_To_iDOC_ERROR;
NULL_ALL();
return NULL;
}
}
void SelectAll(){GetIRange();}
void SelectToEnd(Start=-1){
if (Start==-1)
Start=SelStart;
GetIRange(Start);
}

ITextRange * GetIRange(long Start=0,long End=-1)
{
if (Start==-1 && End==-1 && pRange!=NULL)
return pRange;
NULLr(pRange);
NULLr(pFont);
GetIDoc();
if (pDoc==NULL)
return NULL;
if (End==-1)
End=GetILen();
if (End<=-1000)//длина END=-1000-Len
{
End+=1000;
End=abs(End)+Start;
}

DontRefreshSels++;
SelStart=Start;
SelEnd=End;
SelLen=Start-End;
DontRefreshSels--;

pDoc->Range(Start,End,& pRange);
return pRange;
}
ITextRange * GetIRangeByLen(long Start=0,long Len=-1)
{
if (Len!=-1)
Len=-1000-Len;
return GetIRange(Start,Len);
}
ITextFont * GetIFont(long Start=0,long End=-1)
{
if (Start==-1 && End==-1 && pFont!=NULL)
return pFont;
NULLr(pFont);
GetIRange(Start,End);
if(pRange==NULL)
return NULL;
pRange->GetFont(&pFont);
return pFont;
}
ITextFont * GetIFontByLen(long Start=0,long Len=-1)
{
if (Len!=-1)
Len=-1000-Len;
return GetIFont(Start,Len);
}
};

#define SetTomBool0() long lValue=tomFalse; if (Value) lValue=tomTrue;
#define SetTomBool1(X) SetTomBool0(); Parent->pFont->Set##X(lValue);
#define SetTomBool(X) void __fastcall Set##X(bool Value){SetTomBool1(X)};
#define GetTomBool(X) bool __fastcall Get##X(){long lValue=0;Parent->pFont->Get##X(&lValue);return (lValue==-1);}
#define TomBoolFun(X) protected: SetTomBool(X) GetTomBool(X)
#define PROPERTY_TOM_BOOL(X) TomBoolFun(X) PROPERTY_INIT(bool,X)

#define SetTom_N(T,X) void __fastcall Set##X(T Value){Parent->pFont->Set##X(Value);};
#define GetTom_N(T,X) T __fastcall Get##X(){T lValue=0;Parent->pFont->Get##X(&lValue);return lValue;}
#define TomFun_N(T,X) protected: SetTom_N(T,X) GetTom_N(T,X)
#define PROPERTY_TOM_N(T,X) TomFun_N(T,X) PROPERTY_INIT(T,X)

#define PROPERTY_TOM_LONG(X) PROPERTY_TOM_N(long,X)
#define PROPERTY_TOM_FLOAT(X) PROPERTY_TOM_N(float,X)

enum UL_COLOR//ЦВЕТ ПОДЧЕРКИВАНИЯ
{
ULC_BLACK =0, ULC_BLUE =1,
ULC_SKY_BLUE =2, ULC_GREEN =3,
ULC_FIOLET =4, ULC_RED =5,
ULC_YELLOW =6, ULC_WHITE =7,
ULC_BLACK2 =8, ULC_DARK_GREEN =9,
ULC_DARK_GREEN2 =10, ULC_DARK_RED =11,
ULC_DARK_RED2 =12, ULC_DARK_GREY =13,
ULC_DARK_GREY2 =14, ULC_GREY =15
};
enum UL_TYPE //ТИП ПОДЧЕРКИВАНИЯ
{
ULT_NONE =0, // Нет
ULT_NORMAL =1, // прямая линия ____
ULT_DOTTED =4, // точки ...
ULT_DASH =5, // черточки _ _ _
ULT_DASHDOT =6, // черточка точка .-.-.-.
ULT_DASHDOTDOT =7, // черточка точка точка -..-..-..-
ULT_WAVE =8, // волнистая ~~~~~
ULT_THICK =9 // жирная
};
long TOMI_CALC_UL(UL_COLOR Color,UL_TYPE Type)
{ // возвращает значение почекивания. Которое можно загнать в SETUNDERLINE либо в TOMI_FONT::Underline=TOMI_CALC_UL (color,type)
return 16 *Color + Type;
}
class TOMI_FONT
{

private:
TOM_INTERFACE * Parent;
public:
TOMI_FONT(TOM_INTERFACE * inParent)
{
Parent=inParent;
}
protected:
PROPERTY_TOM_BOOL(Bold)
PROPERTY_TOM_BOOL(Italic) //НЕ НАВОДИТЕ СБДА МЫШЬЮ В 6ом билдере. ЛИбо отключите Инсайд парсинг
PROPERTY_TOM_BOOL(Emboss)
PROPERTY_TOM_BOOL(Engrave)
PROPERTY_TOM_BOOL(Hidden)
PROPERTY_TOM_BOOL(Outline)
PROPERTY_TOM_BOOL(Protected)
PROPERTY_TOM_BOOL(Shadow)
PROPERTY_TOM_BOOL(SmallCaps)
PROPERTY_TOM_BOOL(StrikeThrough)
PROPERTY_TOM_BOOL(Subscript)
PROPERTY_TOM_BOOL(Superscript)

PROPERTY_TOM_LONG(BackColor)
PROPERTY_TOM_LONG(ForeColor)
PROPERTY_TOM_LONG(LanguageID)
PROPERTY_TOM_LONG(Underline)
PROPERTY_TOM_LONG(Weight)

PROPERTY_TOM_FLOAT(Kerning)
PROPERTY_TOM_FLOAT(Size)
PROPERTY_TOM_FLOAT(Spacing)

PROPERTY_TOM_N(wchar_t *,Name)

public:
long CalcUL(UL_COLOR Color,UL_TYPE Type){return TOMI_CALC_UL(Color,Type);}

};
TOM_INTERFACE::TOM_INTERFACE(void * inRE_HANDLE)
{
RE_HANDLE=inRE_HANDLE;
pDoc=NULL;
pRange=NULL;
pFont=NULL;

DontRefreshSels=1;
TEMP_SelStart=0;
TEMP_SelLen=0;
TEMP_SelEnd=0;
TEMP_Freeze=false;
DontRefreshSels=0;

LastQueryInterfaceRes=NOERROR;
LAST_ERROR=TIE_NOERRROR;
LastMessageReturn=0;
AutoRelease=true;
GetIDoc();
SelFont=new TOMI_FONT(this);
OneFreeze=true;
}

void __fastcall TOM_INTERFACE::SetFreeze(bool Value=true)
{
if(OneFreeze && Value==TEMP_Freeze)
return;
GetIDoc();
if (pDoc==NULL)
return;
if (Value)
{
pDoc->Freeze(&FreezeCount);
pDoc->Undo(tomSuspend,NULL);
}
else
{
pDoc->Unfreeze(& FreezeCount);
pDoc->Undo(tomResume,NULL);
}
TEMP_Freeze=Value;
}
void __fastcall TOM_INTERFACE::SetSelStart(long Value)
{
if(DontRefreshSels==0)
{
DontRefreshSels++;
long Start=Value;
long End=SelEnd;
this->GetIFont(Start,End);
DontRefreshSels--;
}
else
TEMP_SelStart=Value;
}
void __fastcall TOM_INTERFACE::SetSelEnd(long Value)
{
if(DontRefreshSels==0)
{
DontRefreshSels++;
long Start=SelStart;
long End=Value;
this->GetIFont(Start,End);
DontRefreshSels--;
}
else
TEMP_SelEnd=Value;
}
void __fastcall TOM_INTERFACE::SetSelLen(long Value)
{
if(DontRefreshSels==0)
{
DontRefreshSels++;
long Start=SelStart;
long Len=Value;
this->GetIFontByLen(Start,Len);
DontRefreshSels--;
}
else
TEMP_SelLen=Value;
}




скачать бесплатно aztec gold