TRichEdit misbehavior

12 отговора 217 прегледа
#1

TRichEdit misbehavior

Hi all. Запънах на поредния малоумен проблем (след "Ъх че досадно..." преди време :-) ).
Имаме форма с TRichEdit (reDoc) и TEdit (edtKey). Попълваме reDoc с текста 'Това е тест'; Следва опростен пример за илюстрация:

{some code here}
edtKey.Text := 'тест';
reDoc.SetFocus();
reDoc.SelStart := reDoc.FindText('тест', 0, Length(reDoc.Text), []); -> SelStart = -1, не го намира
reDoc.SelStart := reDoc.FindText(edtKey.Text, 0, Length(reDoc.Text), []); -> SelStart = -1, не го намира

{заменям на ръка в edtKey коя да е буква със същата - просто фиктивна промяна}
reDoc.SelStart := reDoc.FindText(edtKey.Text, 0, Length(reDoc.Text), []); -> SelStart = 7, OK
reDoc.SelStart := reDoc.FindText('тест', 0, Length(reDoc.Text), []); -> SelStart = 7, пак OK

btw, тоя номер го прави само за кирилския текст :-)

Преди време правих нещо аналогично и не помня да е имало подобен проблем. Говорим за Delphi 6 и в двата случая.

Редактирано от bass на

Отговор
в отговор на bass #2

Re: TRichEdit misbehavior

Bi sledvalo problema da ne e v RichEdit-a , a v :

> edtKey.Text := 'тест'

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #3

Re: TRichEdit misbehavior

Кое не ти харесва тук? Имаш предвид грешно изписване и/или интервали и/или други спец. символи? Както казах, това е силно опростен пример. В програмата ключовите думи се взимат даже от самия reDoc :-))
Това
reDoc.SelStart := 0; reDoc.SelLength := 4;
edtKey.Text := reDoc.SelText;
reDoc.SelStart := reDoc.FindText(edtKey.Text, 0, Length(reDoc.Lines.Text), []);
пак връща -1.
Напиша ли нещо на ръка и го пусна за търсене, винаги го намира и след това всичко тръгва ок :-\\

Отговор
в отговор на bass #4

Re: TRichEdit misbehavior

Ами така е, има някакъв проблем с EM_FINDTEXT. Хубаво е се провери как се държи под Windows 9x/ME. С удоволствие бих писал в newgroups на MS за проблема, но искам да видя дали не е нещо свързано с Unicode...

При мен връща дължината на текста (отива накрая).

-- след още малко тестове ми се вижда да е нещо свързано с Unicode

by Waz Gaa
[email protected]

Редактирано от Waz Gaa на

Отговор
в отговор на Waz Gaa #5

Re: TRichEdit misbehavior

А, за отиването накрая - и при мен е така, но като погледна SelStart, стойността му е -1. Според мен просто така са приели да се отработва SelStart := -1.
И сега, за да е пълна лудницата: Изкопах приложението, ползващо подобна техника, за което споменах. То си върви коректно. Гледах ред по ред това, което съм направил там и в новото App, копирах основната част от кода - пак не ще :-((.
Лошото е, че вече ми се изчерпаха и идеите за тестове :-\\
Сега ще пробвам директно с WinAPI да видя кво ще стане...

Отговор
в отговор на bass #6

Re: TRichEdit misbehavior

Ами аз пробвах директно EM_FINDTEXT, все тая (то си е преведено към интерфейса на RichEdit-a)

Ти с какъв Windows, Delphi пробваш ? Аз съм с 7-цата под XP

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #7

Re: TRichEdit misbehavior

Delphi 6/WinXP.
След малко ще пробвам под 98.
BTW, ей това, както и ти си забелязал, се държи по същия начин:

{uText is FINDTEXTA}
uText.chrg.cpMin := 0;
uText.chrg.cpMax := Length(DocText.Lines.Text);
uText.lpstrText := PChar('тест');
doctext.SelStart := DocText.Perform(EM_FINDTEXT, 0, LPARAM(@uText));

Редактирано от bass на

Отговор
в отговор на bass #8

В Win98...

...също не ще.
Освен това:
1. Оказа се, че "работещото" приложение спира да работи, когато заредя някакъв текст с DocText.Lines.LoadFromFile() или DocText.Lines.Text := 'something' вместо да го въвеждам на ръка;
2. Разгледах RTF-а, генериран от DocText (и ползван вътрешно от контрола) и ми направи впечатление, че използваната кодова таблица е 1252, а не 1251 (при DEFAULT_CHARSET. RegionalSettings на Win-а са Bulgarian без външна кирилица).

Редактирано от bass на

Отговор
в отговор на bass #9

Re: В Win98...

При мен всичко изглежда ОК:

\ansicpg1251

Когато си пиша ръчно текста ми слага и смените на езика:

\lang1033\f1 erereredfdfdfd\lang1026\f2\'e0\'ee\'e0\'ee\'e0

Под ХР нагласен ли ти е "Language for non-Unicode applications" на български ?

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #10

Re: В Win98...

За Language for non-Unicode applications - Да.
Сега пробвах с една чисто нова форма експорта към RTF и (изненада!) - 1251!
Разликата с основното приложение е, че в него сетвам в рънтайм друг шрифт (Arial) на TRichEdit-a. Гледам, че се е ориентирал кой сет от шрифта да ползва (Arial Cyrillic), но ще погледна дали не е от това...
Както и да е, и тестовото приложение с правилната кодова таблица се държи по същия странен начин.

Редактирано от bass на

Отговор
в отговор на Waz Gaa #11

Още едно наблюдение :-))

Без някое от текстовите полета да има входния фокус (застанал съм на един CheckBox), минавам на кирилица и праскам няколко клавиша - няма видими промени. Обаче търсенето върви :-)))

Отговор
в отговор на Waz Gaa #12

Ииии, още едно наблюдение :-))

Даже не се налага да въвеждам каквото и да било - просто минавам на кирилица и всико върви!
Това обяснява и явлението от първия пост - работата не е във въвеждането на текста на ръка, ами на минаването в кирилица преди това :-)))
Ся остава и да измисля как да избегна тази необходимост...

Отговор
в отговор на bass #13

Обобщение на проблема и решение

Поствам това за справка, ако на някой друг някога му дотрябва.
Проблемът:
TRichEdit.FindText не намира кирилски текст, ако в момента на търсене не е включена кирилица (BDS, PHONETIC, разни руски истории, etc. )
Решението (първото, което тръгна, най-схематично):

GetKeyboardLayoutName(szLayout); -> Запазваме текущия режим
LoadKeyboardLayout('00000402', KLF_ACTIVATE); -> Включваме някаква кирилска подредба (402, 419 и др. )
{TRichEdit.FindText}
LoadKeyboardLayout(szLayout, KLF_ACTIVATE); -> Връщаме режима, включен преди търсенето

Notes:
1. При работа с фонетичната кирилица на FlexType 3.1 нещо се шашка (за всеобща изненада :-)) ) - не връща режима във Phonetic, а сменя на латиница;
2. Смяната на режима невинаги се отразява от индикацията в таскбара, още не знам защо.

Отговор