Главная страница
    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.012 c
5-1134112164
Dioman
2005-12-09 10:09
2006.06.25
как получить хэндл текущего активного окна виндов ?


15-1148974453
Иксик
2006-05-30 11:34
2006.06.25
Протесты азербайджанцев в Иране


3-1145967623
Express
2006-04-25 16:20
2006.06.25
TDBGrid - номер текущей записи и всего записей в таблице


2-1149517101
сашки
2006-06-05 18:18
2006.06.25
нетипизированные файлы


2-1149741898
Roman80
2006-06-08 08:44
2006.06.25
RichEdit на последнию строку.





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