Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема при использовании WM_GETTEXT c RichEdit


Автор: guranvir 7.6.2010, 21:15
Требуется получить текст из контрола следующего класса(имеется в виду оконный класс в смысле WinAPI) TInfuRichViewEdit.UnicodeClass Однако в описании этого сообщении стоит что unicode не поддерживается. Однако все же пошарив по инету убедился что народ как то решает сию проблему, а вот как непонятно. Проблема в том, что у меня не выводится текст из контрола, а появляется одиночный символ, который никак не связан с текстом в контроле.Как справится с проблемой? вот код, который у меня есть:
Код:
Код

GetClassName(h,s,256);
   if s='TInfuRichViewEdit.UnicodeClass' then
    begin
   SendMessage(h, wm_gettext ,100, lparam( @s[ 1 ]));
   captionw:=WideCharToString(s);
  Form1.Memo2.Lines.Add(captionw);
    end;

S объявлена как s:array[0..256] of WideChar;

Автор: dvamaster 8.6.2010, 12:18
Именно про этот компонет TInfuRichViewEdit не скажу, но можно попробовать

SendMessageW

Автор: guranvir 8.6.2010, 12:29
Не помогает к сожалению(

Автор: dvamaster 8.6.2010, 13:12
Посмотри исходный код класса TRichEditStrings он находиться в ComCtrls.

Добавлено через 1 минуту и 1 секунду
у меня матерится на WM_GETTEXT, этот контрол его не понимает  smile 

Автор: guranvir 8.6.2010, 13:23
Кстати по ходу исследований  интересней факт появился:
добавил строку r:=SendMessage(h,WM_GETTEXTLENGTH,0,0); И она выдает в переменную r значение 0. 
Однако в MSDN сказано 
Замечания

Для элементов редактирования, текст, который будет скопирован - содержание элементов редактирования. Для комбинированного блока, текст - содержание элементов редактирования (или статический текст) часть комбинированного блока. Для кнопки, текст - имя кнопки. Для других окон, текст - заголовок окна. Чтобы определять длину элемента в окне списка, прикладная программа может использовать сообщение LB_GETTEXTLEN. 
При известных условиях, функция DefWindowProc возвращает значение, которое является большим, чем фактическая длина текста. Это происходит с некоторыми смесями ANSI и Уникода, и из-за операционной системы, которая учитывает возможное существование символов DBCS внутри текста. Возвращаемое значение, однако, будет всегда, по крайней мере, такого размера, как факти-ческая длина текста; Вы можете, таким образом, всегда использовать его, чтобы определить распре-деление в буфере. Это поведение может случаться тогда, когда прикладная программа использует и функции ANSI и общие диалоги, которые используют Уникод. LB_GETTEXT, или CB_GETLBTEXT, или функцию GetWindowText. 
//////////////////////////////////////////////////////////////////////////////////// 
Содержимое точно есть, остается предположить то реакция на сообщение переопределлена  

Автор: dvamaster 8.6.2010, 13:54
Цитата(guranvir @  8.6.2010,  16:23 Найти цитируемый пост)
Содержимое точно есть, остается предположить то реакция на сообщение переопределлена  


Причем в DLL

для вытягивания текста можно воспользоваться этим

Код

function TRichEditStrings.Get(Index: Integer): string;
var
  Text: array[0..4095] of Char;
  L: Integer;
begin
  Word((@Text)^) := SizeOf(Text);
  L := SendMessage(RichEdit.Handle, EM_GETLINE, Index, Longint(@Text));
  if (Text[L - 2] = #13) and (Text[L - 1] = #10) then Dec(L, 2);
  SetString(Result, Text, L);
end;


Добавлено через 1 минуту
Index - номер строки

Автор: guranvir 8.6.2010, 14:37
И все бы хорошо но прога чужая и исходнички закрыты ))

Автор: dvamaster 9.6.2010, 05:15
Тогда просто по хенделу использовать
Код

SendMessage(RichEdit.Handle, EM_GETLINE, Index, Longint(@Text))

Автор: guranvir 11.6.2010, 13:46
Извините а можете пояснить зачем эта строчка
Код

 Word((@Text)^) := SizeOf(Text); 

Автор: dvamaster 21.6.2010, 12:22
Цитата(guranvir @  11.6.2010,  16:46 Найти цитируемый пост)
Word((@Text)^) := SizeOf(Text); 


формат строки в делфи

Код

1 байт: длинна строки (хотя в квоте на 2 тянет)
n: символы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)