Текущий архив: 2006.02.12;
Скачать: CL | DM;
ВнизRichEdit style fsBold Найти похожие ветки
← →
Сайбель Алексей © (2006-01-22 22:23) [0]Приветствую вас.
Мне нужно в тексте RichEdit"a находить различные подстроки и выделять их жирным стилем.
Я накидал процедуру:procedure TFMain.RichEditSetBoldText(RichEdit: TRichEdit;
StringArray: array of String);
var
i: Integer;
begin
with RichEdit do
begin
for i:=0 to Length(StringArray) do
begin
SelStart:=FindText(StringArray[i], 0, Length(Text), [stMatchCase]);
SelLength:=length(StringArray[i]);
SelAttributes.Style:=[fsBold];
end;
end;
end;
Если текст введен вручную то никаких проблем не возникает,
он находить все слова из StringArray и выделяет.
Однако если текст вставлен из буфера, то равным счетом ничего не происходит,
но если добавить к концу текста вручную русские(!) буквы - снова все отлично.
Может кто сталкивался с подобной проблемой?
← →
Сайбель Алексей © (2006-01-22 22:38) [1]Ах да, эта проблема возникает с поиском подстрок именно на русском языке.
← →
Сайбель Алексей © (2006-01-23 10:04) [2]Попробовал с различными RichEdit"ми, таже беда :"(
У меня нет возможности пока попробовать на другом компьютере.
Что происходит в RichEdit"e когда печатаешь там символы кириллицы и почему это решает проблему?
← →
Сайбель Алексей © (2006-01-23 21:09) [3]К сожалению, проблема все еще актуальна
Допустить в RichEdit"e у нас такой текст:
Я с удовольствием думал, что познакомлюсь с Лолитиными подругами, но в общем они не оправдали ожидания. Перечислю Опаль Икс, Линду Голль, Авис Чапман, Еву Розен и Мону Даль - (все эти фамилии, за исключением одной, -
лишь приближения к настоящим).
Опаль, застенчивое, мешковатое, прыщавое создание в очках, души не чаяла в Долли, которая цукала ее. С Линдой Голль, лучшей теннисисткой в школе, Долли играла сингли не меньше двух раз в неделю: у меня есть подозрение, что Линда была настоящей нимфеткой, но почему-то она у нас не бывала (может быть, ей не позволялось бывать); она мне запомнилась только как вспышка самородного солнца на прямоугольнике крытого корта.
Вызываем процедуру:RichEditSetBoldText(RichEdit1, ["Авис", "нимфеткой, н", "лишь ", "сингли"])
Если этот текст был бы вбит вручную, то проблем бы не возникло. Если скопировать из буфера или присвоить RichEdit1.Text, то она ровным счетом ничего не сделает.
Однако, если дописАть символ из кириллицы, будет полный ok.
Somebody pls подтвердите хоть мои утверждения, что такой баг существует здесь. А то чувствую себя параноиком :O)
Заранее благодарю
← →
begin...end © (2006-01-23 21:26) [4]> Сайбель Алексей © (23.01.06 21:09) [3]
D7, WinXP. Работает.
← →
Сайбель Алексей © (2006-01-23 22:46) [5]2 begin...end © [4]
Спасибо
Тот же набор: D7, WinXP SP2
Получается глюк в винде..
Завтра попробую на другом компе также.
[offtop]
Поздравляю Вас с новым статусом
)
[/offtop]
← →
sniknik © (2006-01-23 23:04) [6]> Получается глюк в винде..
> Завтра попробую на другом компе также.
D7, w2k SP4, глюк есть, не совсем то что описано но похоже. (возможно у вас не совсем точно описано)
глюк
не работает сам поиск
> SelStart:=FindText(StringArray[i], 0, Length(Text), [stMatchCase]);
(возврашает -1) если у приложения включен английский язык (!), можно вставить текст (Ctrl+C) и ничего не добавляя в конце (русских букв) просто переключить расскладку на русский (или просто удостоверится что она руская, если стоит по умолчанию) и искать
> RichEditSetBoldText(RichEdit1, ["Авис", "нимфеткой, н", "лишь ", "сингли"])
найдет. а вот с установленной английской нет. (почему х.з. пока)
← →
Сайбель Алексей © (2006-01-23 23:16) [7]Точно, достаточно просто переключение раскладки на русский язык. У меня по умолчанию англ. стоит.
Но SelStart при английской возвращает у меня не -1, а номер последнего символа текста, несмотря на то что в тексте имеются слова для замены стиля.
← →
sniknik © (2006-01-23 23:35) [8]судя по всему это изза
используемого
Result := SendMessage(Handle, EM_FINDTEXT, Flags, LongInt(@Find));
в функции FindText
а надо бы
EM_FINDTEXTEX
(но править генофонд все одно неохота, попробуй включи весь модуль к себе в проеки там поправь. изменилось чтонибудь?)
← →
sniknik © (2006-01-23 23:43) [9]не не меняется ничего... ;(
там еще передаваемую структуру править надо, иначе глюк. вот с изменениямиfunction TRichEdit.FindText(const SearchStr: string;
StartPos, Length: Integer; Options: TSearchTypes): Integer;
type
TCharRange = record
cpMin : Longint;
cpMax : LongInt;
end;
TFindTextExA = record
chrg: TCharRange;
lpstrText: PAnsiChar;
chrgText: TCharRange;
end;
var
Find: TFindTextExA;
Flags: Integer;
begin
with Find.chrg do
begin
cpMin := StartPos;
cpMax := cpMin + Length;
end;
Flags := 0;
if stWholeWord in Options then Flags := Flags or FT_WHOLEWORD;
if stMatchCase in Options then Flags := Flags or FT_MATCHCASE;
Find.lpstrText := PChar(SearchStr);
Result := SendMessage(Handle, EM_FINDTEXTEX, Flags, LongInt(@Find));
end;
но все одно не помогло...
придется тебе FindText переписывать, делать стандартным Pos - ом к примеру... ну да сам справишся.
← →
Сайбель Алексей © (2006-01-24 09:10) [10]Я ручками и хотел с самого начала, но увидел что реализовано и не стал делать работу, которую сделали за меня..
Спасибо за помощь, sniknik
← →
begin...end © (2006-01-24 09:22) [11]> Сайбель Алексей © (23.01.06 23:16) [7]
В код [0] добавьте:uses
RichEdit;
const
EM_FINDTEXTW = WM_USER + 123;
var
FT: FINDTEXTW;
а строку
> SelStart:=FindText(StringArray[i], 0, Length(Text), [stMatchCase]);
замените на такой код:FT.chrg.cpMin := 0;
FT.chrg.cpMax := -1;
FT.lpstrText := PWideChar(WideString(StringArray[i]));
SelStart := Perform(EM_FINDTEXTW, FT_MATCHCASE, Integer(@FT));
Думаю, после этого раскладку переключать не придётся...
:о)
← →
Сайбель Алексей © (2006-01-24 11:02) [12]О_о
Мысль пользователям переключать раскладку я откинул сразу, думаю это им бы не очень понравилось =))
Работает, спасибо. Не могли бы немного прокомментировать код?
← →
sniknik © (2006-01-24 11:51) [13]это та же реализация FindText только для юникода, сравни.
если Perform смущает, то это тоже самое что
SendMessage(RichEdit.Handle, EM_FINDTEXTW, FT_MATCHCASE, LongInt(@FT));
(RichEdit добавлено для явного указания, чтобы от with не зависело, Perform его берет от того же обьекта от которого вызван т.е. RichEdit.Perform)
кстати у тебя глюк в [0]
надо добавить
for i:=0 to Length(StringArray)-1 do
...
← →
begin...end © (2006-01-24 11:59) [14]> Сайбель Алексей © (24.01.06 11:02) [12]
> О_о
Что это означает? Надеюсь, ничего плохого?
:о)
> Не могли бы немного прокомментировать код?
Код ищет текст в формате unicode (EM_FINDTEXTW), в отличие от стандартного FindText (который посылает EM_FINDTEXT). Однако я сомневаюсь, что этот код будет работать в Win9x.
← →
Сайбель Алексей © (2006-01-24 16:46) [15]
>кстати у тебя глюк в [0]
>надо добавить
>for i:=0 to Length(StringArray)-1 do
> ...
Случайно выскочила ошибка заборных столбов :O)
http://dolphinsbay.narod.ru/Reefs.html#1
>> О_о
>
>Что это означает? Надеюсь, ничего плохого?
> :о)
Это всего лишь мои глаза )))
Страницы: 1 вся ветка
Текущий архив: 2006.02.12;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.039 c