![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
richedit
9899100 © (2008-05-06 15:47:00)Подскажите плииз, почему не работает поиск в RichEdit если текс набран русскими буквами???
st='привет';
...
sn:=RichEdit1(st,0,Length(RichEdit1.Text),[stWholeWord]);
в итоге sn=-1 , хотя реально это слово есть в тексте :(
Если буквы и текс латинница, то находит все на ура!!
han_malign (2008-05-15 14:24:00) [1]
TMimeSearchType = set of TMimeSearchTypes;
забыл...
han_malign (2008-05-15 14:23:00) [2]это работает при любой раскладке
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;{}
9899100 (2008-05-14 13:52:00) [3]Только только нашел ответ на свой вопрос, оказывается
поиск по русски будет работать правильно только в том случае если на момоент поиска включена РУССКАЯ раскладка клавиатуры!!!!!
о как!!
9899100 (2008-05-06 17:23:00) [4]людиии помогииите, я уже просто в шоке :(
и голова скоро расколется
ишет но только не из ворда :(
файл сохранен в ворде в RTF формате
и загружен в RichEdit
все, поиск возвращает -1 :(
9899100 (2008-05-06 17:06:00) [5]бред какойто :(
если просто набрать текст в RichEdit
то находит
если скопировать текст в RichEdit из например WordPad то тоже находит
а если скопировать текст из Word
то нифига не находит :(
Knight (2008-05-06 16:55:00) [6]Удалено модератором
Примечание: Флудить завязываем
9899100 (2008-05-06 16:54:00) [7]Удалено модератором
Knight (2008-05-06 16:51:00) [8]Просто в указанном выше коде набрал на поиск "Привет" - нашло.. "привет" - не нашло...
9899100 (2008-05-06 16:48:00) [9]в тексте RichEdit , в Lines .... ну как еще объяснить....
создаем в врде документ набираем текст "Привет волку" сохраняем его в RTF формате
загружаем его в richEdit при помощи LoadFromFile
потом пытаемся найти там строку "Привет" при помощи метода FindText класса TRichEdit
в итоге
получаем -1
в тоже самое время если в загружаемом фале такс набран латинницей и ИЩЕМ мы латинницу то млин все классно работает
так понятно ??
Knight (2008-05-06 16:43:00) [10]А если в тексте "Привет волку" искать "Привет"?
9899100 (2008-05-06 16:36:00) [11]Удалено модератором
9899100 (2008-05-06 16:34:00) [12]если в RichEdit текст
"Привет волку"
то Position в предыдущем посте = -1
если в RichEdit текст
"Привет Some text волку"
то функция прекрасно находит и выделяет этот текст
Knight (2008-05-06 16:31:00) [13]Удалено модератором
Knight (2008-05-06 16:26:00) [14]Это не ищет?
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;
9899100 (2008-05-06 16:07:00) [15]Удалено модератором
Примечание: Создание пустых сообщений