// Пример вставки фрагмента.
// Если имеется выделение, оно будет заменено фрагментом текста,
// если выделение отсутствует, фрагмент будет добавлен к концу текста.
int selFirst = 0, selLast = 0;
SendDlgItemMessage ( hDlg, IDC_EDIT1, EM_GETSEL,
(WPARAM) &selFirst, (LPARAM) &selLast );
if(selFirst == selLast)
{
// Получим длину текста для многострочного окна редактирования
selFirst = selLast = lstrlen(
*(char**) SendDlgItemMessage (
hDlg, IDC_EDIT1,
EM_GETHANDLE, 0, 0 ) );
}
SendDlgItemMessage ( hDlg, IDC_EDIT1, EM_SETSEL, selFirst, selLast );
SendDlgItemMessage ( hDlg, IDC_EDIT1, EM_REPLACESEL, TRUE, (LONG)szReplace );
Преобразование кода С++ на Delphi
Нужно вставить текст в поле ввода другого приложения. Нагуглил следующий код на С++:
Код:
У меня получилось:
Код:
var
setFirst, setLast: Integer;
str: Pwidechar;
ch: WideString;
int: integer;
begin
setFirst := 0;
setLast := 0;
SendDlgItemMessage(Handle, Memo12.Handle, EM_GETSEL, wparam(@setFirst), lparam(@setLast));
if setFirst = setLast then begin
ch := WideString(SendDlgItemMessage(Handle, Memo12.Handle, EM_GETHANDLE, 0, 0));
setFirst := lstrlen(@ch);
setLast := setFirst;
end;
SendDlgItemMessage(Handle, Memo12.Handle, EM_SETSEL, setFirst, setLast);
str := Pwidechar('Вставляемый текст');
SendDlgItemMessage(Handle, Memo12.Handle, EM_REPLACESEL, 0, integer(str));
end;
setFirst, setLast: Integer;
str: Pwidechar;
ch: WideString;
int: integer;
begin
setFirst := 0;
setLast := 0;
SendDlgItemMessage(Handle, Memo12.Handle, EM_GETSEL, wparam(@setFirst), lparam(@setLast));
if setFirst = setLast then begin
ch := WideString(SendDlgItemMessage(Handle, Memo12.Handle, EM_GETHANDLE, 0, 0));
setFirst := lstrlen(@ch);
setLast := setFirst;
end;
SendDlgItemMessage(Handle, Memo12.Handle, EM_SETSEL, setFirst, setLast);
str := Pwidechar('Вставляемый текст');
SendDlgItemMessage(Handle, Memo12.Handle, EM_REPLACESEL, 0, integer(str));
end;
Замена выделенного текста на мой работает как часы. Проблема в случае, когда выделения нет. Скорее всего я неправильно привожу типы и/или работаю с указателями... Пожалуйста помогите разобраться!
2. Версия Delphi? (и настройка Unicode для >=2009)?
1. А почему не верно? Что нужно передавать в место хандла?
2. Delphi XE
Мне кажется проблема в *(char**). Я не очень хорошо разбираюсь в С++, но на сколько понимаю это указатель на 2-мерный массив чаров. Не совсем понимаю как это должно описываться на паскале.
2. Настройка юникода все же?
char** это указатель на указатель. Что там лежит - вопрос реализации.
*(char **) = char*. Почему в C коде написано не так... видимо тот еще кодер?