• 9899100 (06.05.08 15:47) [0]
    Подскажите плииз, почему не работает поиск в RichEdit если текс набран русскими буквами???

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

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

    Если буквы и текс латинница, то находит все на ура!!
  • 9899100 (06.05.08 16:07) [1]
    Удалено модератором
    Примечание: Создание пустых сообщений
  • Knight © (06.05.08 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 © (06.05.08 16:31) [3]
    Удалено модератором
  • 9899100 (06.05.08 16:34) [4]
    если в RichEdit текст
    "Привет волку"
    то Position в предыдущем посте = -1

    если в RichEdit текст
    "Привет Some text волку"
    то функция прекрасно находит и выделяет этот текст
  • 9899100 (06.05.08 16:36) [5]
    Удалено модератором
  • Knight © (06.05.08 16:43) [6]
    А если в тексте "Привет волку" искать "Привет"?
  • 9899100 (06.05.08 16:48) [7]
    в тексте RichEdit , в Lines .... ну как еще объяснить....
    создаем в врде документ набираем текст "Привет волку" сохраняем его в RTF формате
    загружаем его в richEdit при помощи LoadFromFile

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

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

    так понятно ??
  • Knight © (06.05.08 16:51) [8]
    Просто в указанном выше коде набрал на поиск "Привет" - нашло.. "привет" - не нашло...
  • 9899100 (06.05.08 16:54) [9]
    Удалено модератором
  • Knight © (06.05.08 16:55) [10]
    Удалено модератором
    Примечание: Флудить завязываем
  • 9899100 (06.05.08 17:06) [11]
    бред какойто :(
    если просто набрать текст в RichEdit
    то находит
    если скопировать текст в RichEdit из например WordPad то тоже находит
    а если скопировать текст из Word
    то нифига не находит :(
  • 9899100 (06.05.08 17:23) [12]
    людиии помогииите, я уже просто в шоке :(
    и голова скоро расколется
    ишет но только не из ворда :(
    файл сохранен в ворде в RTF формате
    и загружен в RichEdit
    все, поиск возвращает -1 :(
  • 9899100 (14.05.08 13:52) [13]
    Только только нашел ответ на свой вопрос, оказывается
    поиск по русски будет работать правильно только в том случае если на момоент поиска включена РУССКАЯ раскладка клавиатуры!!!!!
    о как!!
  • han_malign © (15.05.08 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 © (15.05.08 14:24) [15]
    TMimeSearchType = set of TMimeSearchTypes;


    забыл...
Есть новые Нет новых   [134491   +8][b:0][p:0.005]