Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.19;
Скачать: CL | DM;

Вниз

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

 
9899100   (2008-05-06 15:47) [0]

Подскажите плииз, почему не работает поиск в RichEdit если текс набран русскими буквами???

st="привет";
...
sn:=RichEdit1(st,0,Length(RichEdit1.Text),[stWholeWord]);

в итоге sn=-1 , хотя реально это слово есть в тексте :(

Если буквы и текс латинница, то находит все на ура!!


 
9899100   (2008-05-06 16:07) [1]

Удалено модератором
Примечание: Создание пустых сообщений


 
Knight ©   (2008-05-06 16:26) [2]

Это не ищет?

function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
 StartPos, Position, Endpos: Integer;
begin
 StartPos := 0;
 with RichEdit do
 begin
   Endpos := Length(RichEdit.Text);
   Lines.BeginUpdate;
   while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
   begin
     Endpos   := Length(RichEdit.Text) - startpos;
     Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
     Inc(StartPos, Length(SearchText));
     SetFocus;
     SelStart  := Position;
     SelLength := Length(SearchText);
   end;
   Lines.EndUpdate;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SearchForText_AndSelect(RichEdit1, "Some Text");
end;


 
Knight ©   (2008-05-06 16:31) [3]

Удалено модератором


 
9899100   (2008-05-06 16:34) [4]

если в RichEdit текст
"Привет волку"
то Position в предыдущем посте = -1

если в RichEdit текст
"Привет Some text волку"
то функция прекрасно находит и выделяет этот текст


 
9899100   (2008-05-06 16:36) [5]

Удалено модератором


 
Knight ©   (2008-05-06 16:43) [6]

А если в тексте "Привет волку" искать "Привет"?


 
9899100   (2008-05-06 16:48) [7]

в тексте RichEdit , в Lines .... ну как еще объяснить....
создаем в врде документ набираем текст "Привет волку" сохраняем его в RTF формате
загружаем его в richEdit при помощи LoadFromFile

потом пытаемся найти там строку "Привет" при помощи метода FindText класса TRichEdit
в итоге
получаем -1

в тоже самое время если в загружаемом фале такс набран латинницей и ИЩЕМ мы латинницу то млин все классно работает

так понятно ??


 
Knight ©   (2008-05-06 16:51) [8]

Просто в указанном выше коде набрал на поиск "Привет" - нашло.. "привет" - не нашло...


 
9899100   (2008-05-06 16:54) [9]

Удалено модератором


 
Knight ©   (2008-05-06 16:55) [10]

Удалено модератором
Примечание: Флудить завязываем


 
9899100   (2008-05-06 17:06) [11]

бред какойто :(
если просто набрать текст в RichEdit
то находит
если скопировать текст в RichEdit из например WordPad то тоже находит
а если скопировать текст из Word
то нифига не находит :(


 
9899100   (2008-05-06 17:23) [12]

людиии помогииите, я уже просто в шоке :(
и голова скоро расколется
ишет но только не из ворда :(
файл сохранен в ворде в RTF формате
и загружен в RichEdit
все, поиск возвращает -1 :(


 
9899100   (2008-05-14 13:52) [13]

Только только нашел ответ на свой вопрос, оказывается
поиск по русски будет работать правильно только в том случае если на момоент поиска включена РУССКАЯ раскладка клавиатуры!!!!!
о как!!


 
han_malign ©   (2008-05-15 14:23) [14]

это работает при любой раскладке
type TSearchTypes = (mstWholeWord, mstMatchCase, mstReverse, mstAdjustSelection);

function RtfSearch(pRtf: TRichEdit; from: integer; const text: string; mst: TSearchType; var HaveNext: boolean): integer;
var mn, wlen: integer;
   _ftew: TFindTextExW;
   _ftf: integer;
   ws: WideString;
begin
  Result:= -1;
  haveNext:= false;
  if(pRtf <> nil)then begin
     wlen:= SendMessage(pRtf.Handle, WM_GETTEXTLENGTH, 0, 0);
     if(wlen <= 0)then
        exit;

     SendMessage(pRtf.Handle, EM_GETSEL, Longint(@_ftew.chrg.cpMin), Longint(@_ftew.chrg.cpMax));
     if(from >= 0)then begin
        if(text = "")then begin//reset selection
           SendMessage(pRtf.Handle, EM_SETSEL, from, from);
           exit;
        end else begin
           if((from = 0)and(mstReverse in mst) or (from > wlen))then from:= wlen;
           _ftew.chrg.cpMin:= from;
           _ftew.chrg.cpMax:= from;
        end;
     end else begin
        if(text = "")then begin
           if(mstReverse in mst)then
              SendMessage(pRtf.Handle, EM_SETSEL, _ftew.chrg.cpMin, _ftew.chrg.cpMin)
           else
              SendMessage(pRtf.Handle, EM_SETSEL, _ftew.chrg.cpMax, _ftew.chrg.cpMax);
           exit;
        end;
     end;
     ws:= text;
     _ftew.lpstrText:= PWideChar(ws);

     _ftf:= FR_DOWN;
     if(mstMatchCase in mst)then _ftf:= _ftf or FT_WHOLEWORD;
     if(mstWholeWord in mst)then _ftf:= _ftf or FT_MATCHCASE;

     with _ftew.chrg do
     if(mstReverse in mst)then begin
        if(cpMin < 0 )then cpMin:= wlen;

        //RichEdit with version older 4.1 don"t search back
        (*if( not( pRtf is TRichEdit50) or
            (TRichEdit50(pRtf).Version < rvRichEdit4)
        )then begin
*)
           cpMax:= cpMin;
           cpMin:= 0;
           while(DWORD(cpMin) < DWORD(cpMax))do begin
              mn:= SendMessage(pRtf.Handle, EM_FINDTEXTEXW, _ftf, Longint(@_ftew));
              if(mn >= 0)then begin
                 HaveNext:= Result >= 0;
                 Result:= mn;
                 cpMin:= _ftew.chrgText.cpMax;
              end else
                 break;
           end;
           if(Result < 0)then
              exit;
           //restore chrgText after last error
           _ftew.chrgText.cpMin:= Result;
           _ftew.chrgText.cpMax:= cpMin;
        (*end else begin
           _ftf:= _ftf and not FR_DOWN;
           cpMax:= 0;
        end;
*)
     end else begin
        cpMin:= cpMax;
        if(cpMin < 0 )then cpMin:= 0;
        cpMax:= wlen;
     end;

     if(Result < 0)then begin
        Result:= SendMessage(pRtf.Handle, EM_FINDTEXTEXW, _ftf, Longint(@_ftew));
        if(Result >= 0)then begin
           if(mstReverse in mst)then begin
              _ftew.chrg.cpMin:= _ftew.chrgText.cpMin;
              HaveNext:= SendMessage(pRtf.Handle, EM_FINDTEXTW, _ftf, Longint(@_ftew)) < Result;
           end else begin
              _ftew.chrg.cpMin:= _ftew.chrgText.cpMax;
              HaveNext:= SendMessage(pRtf.Handle, EM_FINDTEXTW, _ftf, Longint(@_ftew)) > Result;
           end;
        end;
     end;

     if((Result >= 0)and(mstAdjustSelection in mst))then begin
        SendMessage(pRtf.Handle, EM_EXSETSEL, 0, longint(@_ftew.chrgText));
     end;
  end;
end;{}


 
han_malign ©   (2008-05-15 14:24) [15]

TMimeSearchType = set of TMimeSearchTypes;
забыл...



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

Текущий архив: 2009.04.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
15-1234596212
Palladin
2009-02-14 10:23
2009.04.19
Декларирование указателя в Си


2-1236178765
Artem
2009-03-04 17:59
2009.04.19
EhLib, OnKeyDown


15-1232824237
Unknown user
2009-01-24 22:10
2009.04.19
Работа с потоками в Delphi


2-1235991728
ZiZiTop
2009-03-02 14:02
2009.04.19
Немного о звуке


11-1172928776
Dmitry___
2007-03-03 16:32
2009.04.19
Сохранение контролов в файл