Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

WordWrap в RichEdit   Найти похожие ветки 

 
4kusNick ©   (2004-04-13 19:11) [0]

Я хотел бы узнать побольше о проблеме WordWrap. В особенности, почему эта возможность RichEdit была отключина в KOL, в отличии от VCL?


 
4kusNick ©   (2004-04-13 19:12) [1]

Отключена, грамотей. И не отключена вообще, а всего - навсего "только для чтения" - прим.авт :-)


 
Delphi5.01 ©   (2004-04-14 08:26) [2]

U mena pohoji vopros! Tolko dla VCL, do sih por ni kto ne smog otvetiti. Pochemu otkluchili (specialno pisali kod) podderjku Forn.Color u Button-a. Tak kak u BitBtn i SpeedButton eta opcia rabotaet.
Esli danni komponent ne bil v sostoianii izmenit cvet Caption-a to pochemu ne otkluchili v dialoge vibor cveta?
Voprosov mnogo a otvetov malo :-(
P.S. izvenaus za latinicu, vremeni malo!


 
Gandalf ©   (2004-04-14 14:22) [3]

1) Проблем с WordWrap - нет!
2) WordWrap - свойтво только для чтения - потому как без recreate контрола этот стиль приладить нельзя.
3) WordWrap работает ТОЛЬКО для Static (Label)
4) Для WordWrap в понимании VCL необходимо применять свойство - опцию - [eo_NoHScroll]
5) Она только для чтения, почему смотри 2)
6) Можно наворотить свой WordWrap -  для этого надо сделать свой callback. Какой конкретно зависит от версии richedit, от наличия юникода и потребностей - можно типо того...



const
 WB_CLASS_WHITESPACE=0;
 WB_CLASS_LINEBREAK=1;
 WB_CLASS_DELIMITER=2;
 WB_CLASS_NORMALCHAR=3;

 WBF_ISWHITE=0;
 WBF_BREAKAFTER=1;
 WBF_BREAKLINE=2;

WB_CLASSIFY=3;
WB_MOVEWORDLEFT=4;
WB_MOVEWORDRIGHT=5;
WB_LEFTBREAK=6;
WB_RIGHTBREAK=7;
WB_MOVEWORDPREV=4;
WB_MOVEWORDNEXT=5;
WB_PREVBREAK=6;
WB_NEXTBREAK=7;
WBF_WORDWRAP=16;
WBF_WORDBREAK=32;
WBF_OVERFLOW=64;
WBF_LEVEL1=128;
WBF_LEVEL2=256;
WBF_CUSTOM=512;

EM_GETWORDBREAKPROCEX=(WM_USER+80);
EM_SETWORDBREAKPROCEX=(WM_USER+81);

whitespace=" "#9;
linebreakers=#13#10;
delimiters="[]();:,.\"";

function isInDelimiterList(c:WideChar):Boolean;
begin
 Result:=pos(c,delimiters)>0;
end;

function EditWordBreakProcEx(pchText:PWideChar; ichCurrent, cch, code:Integer):Integer; stdcall;
var
 return:Integer;
 lRet:Integer;
 i:Integer;
 found:Boolean;
 initial_pos:Integer;
begin
 lRet:= 0 ;
 i:=0 ;
 found:= FALSE ;
 initial_pos:= ichCurrent ;

 case (code) of

 WB_LEFT:
   begin//Finds the beginning of a word to the left of the specified position.
     while (not isInDelimiterList(pchText[ichCurrent])) and ( ichCurrent>0) do
       Dec(ichCurrent);
     if(ichCurrent>0) then
        lRet:= ichCurrent +1
     else
        lRet:= -1 ;
   end;

 WB_RIGHT:
   begin
     //Finds the beginning of a word to the right of the specified position.
     while (not isInDelimiterList(pchText[ichCurrent])) and ( ichCurrent<cch) do
       ichCurrent:=ichCurrent+1 ;
     if(ichCurrent>0) then
        lRet:= ichCurrent -1
     else
        lRet:= -1 ;
   end;
 WB_ISDELIMITER:
   begin//Checks whether the character at the specified position is a delimiter.
     if( pos(pchText[0],delimiters) >0) then
     begin
       lRet:=Integer(TRUE);
     end;
   end;
  WB_CLASSIFY:
   begin //Retrieves the character class and word break flags of the character at the specified position.
     if(pos(pchText[0],whitespace)>0) then
     begin
       lRet:= WBF_ISWHITE or WB_CLASS_WHITESPACE ;
     end
     else
     if(pos(pchText[0],delimiters)>0) then
     begin
       lRet:= WBF_BREAKAFTER or WB_CLASS_DELIMITER ;
     end
     else if(pos(pchText[0],linebreakers)>0) then
     begin
       lRet:= WBF_BREAKLINE or WB_CLASS_DELIMITER ;
     end
     else
     begin
       lRet:= WB_CLASS_NORMALCHAR ;
     end;
   end ;
 WB_MOVEWORDLEFT:
   // Finds the next character that begins a word before the specified position.
   begin
     Dec(ichCurrent);
     while(isInDelimiterList(pchText[ichCurrent])) do
       Dec(ichCurrent);
     while((ichCurrent<cch) and  (not found) and (ichCurrent>=0)) do
     begin
        found:= isInDelimiterList(pchText[ichCurrent]) ;
        if found and (ichCurrent>=0) then
        begin
           lRet:= ichCurrent+1;
        end
        else
        begin
           lRet:= -1 ;//This ensures failure unless something is found.                           //Thus, if the supplied string, is exhausted,
                      //we will be called with the next bunch                                    //of characters.
           Dec(ichCurrent);
        end;
     end;
     return:=lRet;
     Result:=return;
     exit;
   end ;
 WB_MOVEWORDRIGHT:
   //Finds the next character that begins a word after the specified position.
  begin
     if( not isInDelimiterList(pchText[ichCurrent])) then
        while( (not isInDelimiterList(pchText[ichCurrent])) and (ichCurrent <cch)) do
          Inc(ichCurrent);

     while(isInDelimiterList(pchText[ichCurrent]) and (ichCurrent <cch)) do
       Inc(ichCurrent);
     if(ichCurrent<cch) then
        lRet:= ichCurrent +1
     else
        lRet:= -1 ;
     return:=lRet;
     Result:=return;
     exit;
   end;
 WB_LEFTBREAK:
   //Finds the end-of-word delimiter to the left of the specified position.
   begin
     while( not isInDelimiterList(pchText[ichCurrent])) and (ichCurrent>0) do
       Dec(ichCurrent);
     if(ichCurrent>0) then
        lRet:= ichCurrent
     else
        lRet:= -1 ;
   end;
 WB_RIGHTBREAK:
   begin//Finds the end-of-word delimiter to the left of the specified position.
     while( not isInDelimiterList(pchText[ichCurrent])) and  (ichCurrent<cch) do
       ichCurrent:=ichCurrent+1;
     if(ichCurrent>0) then
        lRet:= ichCurrent
     else
        lRet:= -1 ;
   end;
 end;
 return:=lRet;
 Result:=return;
end;

procedure TForm1.Button1Click(Sender: PObj);
begin
//  RichEdit1.Perform(EM_SETWORDBREAKPROCEX,0,Integer(@EditWordBreakProcEx));
 RichEdit1.Perform(EM_SETWORDBREAKPROC,0,Integer(@EditWordBreakPr
ocEx));
end;


-----

#) Ну нельзя менять у кнопки цвет текста - таков API. VCL *Button - сами себя рисуют - так можно.
#) А в MCK вообще у контролов не нало - левых свойств - так получилось, нет времени желания и большой необходимости - но если ты хочешь поменять - нет проблем.

ЗЫ: Еще есть умные вопросы?

ЗЗЫ: Учите мат часть...


 
4kusNick ©   (2004-04-17 19:24) [4]

2 Gandalf попробую реализовать идею.


 
4kusNick ©   (2004-04-19 21:08) [5]

Всем спасибо. Все понял.


 
4kusNick ©   (2004-04-19 21:08) [6]

Всем спасибо. Все понял.



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.314 c
3-1096970244
funtik123
2004-10-05 13:57
2004.10.31
Количсетво записей


4-1096020727
Чебуратор
2004-09-24 14:12
2004.10.31
Как програмно изменить переменную PATH для всех пользователей ?


3-1096693515
DelphiN!
2004-10-02 09:05
2004.10.31
Перевод базы данных в HTML


6-1092818854
Klopan
2004-08-18 12:47
2004.10.31
TServerSocket


14-1097322651
GanibalLector
2004-10-09 15:50
2004.10.31
ДУША за 30 ЕВРО





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский