Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.01 c
15-1149234197
Loginov Dmitry
2006-06-02 11:43
2006.06.25
Вопрос по Visual C 6.0


6-1140019622
Хинт
2006-02-15 19:07
2006.06.25
Отправить сообщение серверу и получить ответ


1-1147975944
anton773
2006-05-18 22:12
2006.06.25
Преобразование типов


9-1131391662
JUS
2005-11-07 22:27
2006.06.25
Художество 2д спрайтов (подскажите софт)


15-1148894966
ольга
2006-05-29 13:29
2006.06.25
Delphi+AutoCad





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