Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование кода С++ на Delphi

20K
14 июля 2011 года
HowlingWind
32 / / 13.01.2008
Всем привет!

Нужно вставить текст в поле ввода другого приложения. Нагуглил следующий код на С++:

Код:
// Пример вставки фрагмента.
// Если имеется выделение, оно будет заменено фрагментом текста,
// если выделение отсутствует, фрагмент будет добавлен к концу текста.

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 );


У меня получилось:
Код:
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;


Замена выделенного текста на мой работает как часы. Проблема в случае, когда выделения нет. Скорее всего я неправильно привожу типы и/или работаю с указателями... Пожалуйста помогите разобраться!
14
14 июля 2011 года
Phodopus
3.3K / / 19.06.2008
1. Memo2.Handle - неверно. Везде
2. Версия Delphi? (и настройка Unicode для >=2009)?
20K
16 июля 2011 года
HowlingWind
32 / / 13.01.2008
Спасибо что откликнулись!

1. А почему не верно? Что нужно передавать в место хандла?
2. Delphi XE

Мне кажется проблема в *(char**). Я не очень хорошо разбираюсь в С++, но на сколько понимаю это указатель на 2-мерный массив чаров. Не совсем понимаю как это должно описываться на паскале.
14
17 июля 2011 года
Phodopus
3.3K / / 19.06.2008
1. ID. Имея хендл, можно послать сообщение напрямую, минуя SendDlgItemMessage()
2. Настройка юникода все же?

char** это указатель на указатель. Что там лежит - вопрос реализации.
*(char **) = char*. Почему в C коде написано не так... видимо тот еще кодер?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог