Форум: "Начинающим";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизEM_GETSELTEXT или EM_EXGETSEL с EM_GETTEXTRANGE? Найти похожие ветки
← →
Mr tray (2006-06-02 21:57) [0]Нужно получить выделенный текст текстового поля, хэндл которого мне известен. Думаю использовать EM_GETSELTEXT, но там говорится о том, что длина получаемого текста ограничена. Будут ли те же ограничения, если я буду использовать для решения моей задачи EM_EXGETSEL и EM_GETTEXTRANGE?
← →
begin...end © (2006-06-03 07:00) [1]> Mr tray (02.06.06 21:57)
> Нужно получить выделенный текст текстового поля, хэндл которого
> мне известен.
Все перечисленные сообщения -- только для RichEdit.
> Думаю использовать EM_GETSELTEXT, но там говорится о том,
> что длина получаемого текста ограничена.
Где "там"?
← →
Mr tray (2006-06-03 11:22) [2]
> Где "там"?
в хелпе.
> Все перечисленные сообщения -- только для RichEdit.
А для обычных полей совсем никак? Нет ли, случайно, какого-нибудь универсального сообщения для всех полей ввода?
ИЛИ
Я мог бы разграничить действия: то есть, для richedit"ов применять сообщения, предназначенные для richedit"ов, а для обычных полей применять сообщения, прадназначенные для обычных полей. Но это возможно только в том случае, если я смогу четко разграничить richedit"ы и обычные текстовые поля. Это возможно?
← →
begin...end © (2006-06-03 11:36) [3]> Mr tray (03.06.06 11:22) [2]
> в хелпе.
В каком? Где именно?
> А для обычных полей совсем никак?
Что такое "обычные поля"?
← →
Mr tray (2006-06-03 19:23) [4]
> В каком? Где именно?
мм. ну. в текстовом редакторе дельфи выделяешь текст и нажимаешь F1. или ещё Help > Windows SDK.
> Что такое "обычные поля"?
обычные поля - это не richedit :). в моем понимании, это поля, где символы могут быть только одного шрифта, стиля, цвета, размера.
← →
begin...end © (2006-06-03 21:59) [5]> Mr tray (03.06.06 19:23) [4]
> мм. ну. в текстовом редакторе дельфи выделяешь текст и нажимаешь
> F1. или ещё Help > Windows SDK.
ОК, смотрю описание EM_GETSELTEXT в Windows SDK:The EM_GETSELTEXT message retrieves the currently selected text in a rich edit control.
EM_GETSELTEXT
wParam = 0;
lParam = (LPARAM) (LPSTR) lpBuf;
Parameters
lpBuf
Pointer to a buffer that receives the selected text. The calling application must ensure that the buffer is large enough to hold the selected text.
Return Values
Returns the number of characters copied, not including the terminating null character.
ГДЕ здесь сказано о каких-либо ограничениях на возможную длину получаемого текста?
← →
Mr tray (2006-06-04 00:08) [6]ммм. извините.... это было в где то в другом сообщении.... запутался, если честно. так. EM_GETSELTEXT - действует только с richedit. RichEdit - это многострочные текстовые поля с возможностью сожержания символов разных шрифтов, стилей, цветов?
← →
Leonid Troyanovsky © (2006-06-04 10:29) [7]
> Mr tray (04.06.06 00:08) [6]
> .. запутался, если честно. так. EM_GETSELTEXT - действует
> только с richedit.
EM_GETSEL?
--
Regards, LVT.
← →
Mr tray (2006-06-04 13:05) [8]Смотрите, как я делаю: (msg:^charrange; i:integer; txtrang:textrange; wnd:thandle)
sendmessage(wnd,EM_EXGETSEL,0,i);
msg:=pointer(i); {я не знаю, как обойтись без этого. подскажите как}
txtrang.chrg:=msg^;
with txtrang do
getmem(lpstrText,chrg.cpMax-chrg.cpMin+1);
sendmessage(wnd,EM_GETTEXTRANGE,0,integer((@txtrang)^));
Не действует. Что неправильно? И как мне избавиться от лишних преобразований в указатель и из указателя в идентификатор? Без этого выдается ошибка: invalid typecast (если пишу integer(txtrang)) или incompatible types (если пишу в последнем sendmessage на месте integer((@txtrang)^) просто txtrang.
← →
begin...end © (2006-06-04 22:13) [9]> Mr tray (04.06.06 00:08) [6]
> RichEdit - это многострочные текстовые поля с возможностью
> сожержания символов разных шрифтов, стилей, цветов?
Да, RichEdit -- это именно такое текстовое поле. Но совсем необязательно, что любое текстовое поле с такими свойствами будет RichEdit"ом. Это может быть что угодно -- даже неоконный контрол.
> EM_GETSELTEXT - действует только с richedit.
А вот по поводу EM_GETSEL в справке написано что-то не то:In a rich edit control, if the selection is not entirely contained in the first 64K, use the message EM_EXGETSEL
(причём в MSDN такие ограничения уже не упоминаются). Сейчас я попробовал послать EM_GETSEL RichEdit"у, в котором начальная и конечная позиции выделения превышают 65535. SendMessage возвратила -1 (что и неудивительно, т.к. в двойное слово два числа, большие 65535, не помещаются), но в wParam^ и lParam^ (см. описание EM_GETSEL) были помещены правильные значения.
Я проверял только на Win2000, и как себя поведёт RichEdit, например, в Win98, я не знаю. Но если он поведёт себя так же, то тогда универсальное решение будет таким: 1) получить начальную и конечную позиции выделения -- EM_GETSEL; 2) получить весь текст контрола -- WM_GETTEXT (кстати, он тоже нормально получается и из "большого" RichEdit, несмотря на то, что MSDN советует в таких случаях использовать EM_STREAMOUT или EM_GETSELTEXT); 3) извлечь из него символы в диапазоне, полученном в п. 1.
P.S. Кстати, именно таким способом получается выделенный текст для обычных edit"ов (у них, в отличие от RichEdit"а (EM_GETSELTEXT), нет специальных средств для этого) -- см., например, TCustomEdit.GetSelText.
← →
Mr tray (2006-06-05 01:26) [10]
> универсальное решение будет таким: 1) получить начальную
> и конечную позиции выделения -- EM_GETSEL
Но ведь EM_GETSEL ограниченичивает выдаваемые значения.
В хелпе сказано, что нужно использовать EM_EXGETSEL, если есть вероятность того, что начальный или конечный индексы больше 65535. Вот я и использую:var
txtrang:textrange;
wnd:thandle;
begin
...{задаю wnd, wnd - это хендл поля ввода класса TEdit.}
fillchar(txtrang,sizeof(textrange),#0);
sendmessage(wnd,EM_EXGETSEL,0,integer(@txtrang.chrg));
with txtrang do
getmem(txtrang.lpstrText,chrg.cpMax-chrg.cpMin+1);
sendmessage(wnd,EM_GETTEXTRANGE,0,longint(@txtrang));
end
спотыкается ещё на sendmessage(wnd,EM_EXGETSEL,0,integer(@txtrang.chrg)); значения cpmin и cpmax остаются 0.
Этот способ вроде бы единственный (по крайней мере единственный более-мене простой), с помощью которого можно извечь выделенный текст и индексы границ выделения без ограничений значений индексов, ограничений длины выделенного текста и ограничений в применении (т.е. чтоб и для richedit было применимо).
← →
Zeqfreed © (2006-06-05 02:45) [11]Вот код для Rich Edit. Для обычных Edit"ов см. EM_GETSEL.
procedure DoFind(const wnd : HWND);
function RangeSize(cpmin, cpmax : Integer) : Integer;
begin
if cpmax > cpmin then
Result := cpmax - cpmin + 1
else
Result := SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0);
end;
var
TextRange : TTextRangeA;
size : Integer;
begin
ZeroMemory(@TextRange, SizeOf(TTextRangeA));
SendMessage(wnd, EM_EXGETSEL, 0, Integer(@TextRange.chrg));
try
GetMem(TextRange.lpstrText, RangeSize(TextRange.chrg.cpMin, TextRange.chrg.cpMax));
if (TextRange.chrg.cpMin = TextRange.chrg.cpMax) then Exit;
if SendMessage(wnd, EM_GETTEXTRANGE, 0, Integer(@TextRange)) > 0 then
MessageBox(0, PChar(Format("The following text has been selected within range [%d-%d]:"#13#10#13#10"%s", [TextRange.chrg.cpMin, TextRange.chrg.cpMax, TextRange.lpstrText])), "Selection found", MB_OK);
finally
FreeMem(TextRange.lpstrText);
end;
end;
← →
begin...end © (2006-06-05 07:33) [12]> Mr tray (05.06.06 01:26) [10]
> Но ведь EM_GETSEL ограниченичивает выдаваемые значения.
Извините, Вы [9] вообще читали? Я там написал про реальное поведение RichEdit на Win2k, вообще-то.
← →
Mr tray (2006-06-05 16:23) [13]спасибо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c