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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.034 c
4-1133439814
Tor
2005-12-01 15:23
2006.02.12
Получение координат иконки в sys tray


15-1138081406
wHammer
2006-01-24 08:43
2006.02.12
Большие целые числа (Delphi 5)


2-1137870230
Dead.MorozZ
2006-01-21 22:03
2006.02.12
Бегущая строка


15-1137613460
DiamondShark
2006-01-18 22:44
2006.02.12
Вопрос москвичам или питерцам


2-1138222274
ANB
2006-01-25 23:51
2006.02.12
Как настроить работу ораклового апача через modplsql ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский