Чтобы понять, где мы сейчас находимся, используйте SelStart, например, так:
var
Lpos, Cpos : Integer;
Lpos := SendMessage(memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);
Cpos := SendMessage(memo1.Handle, EM_LINEINDEX, Lpos, 0);
CPos := Memo1.SelStart-CPos;
Ответ: поскольку vk_? имеет целочисленный тип, то это будет работать:
caseKey of
VK_DELETE :
begin
Key := 0; {этим мы не позволяем сообщению keydown передаваться дальше,
например, форме или компонентам}
выполняем нужный код;
end;
VK_BACK:
begin
Key := 0; {этим мы не позволяем сообщению keydown передаваться дальше,
например, форме или компонентам}
выполняем нужный код;
end;
end;
Вставка текста в TMemo II
Используйте сообщение Windows API EM_REPLACESEL:
EM_REPLACESEL
wParam = 0; /* не используется, должен быть ноль */
lParam = (LPARAM) (LPCSTR) lpszReplace; /* адрес новой строки */
Для замены текущего выбранного текста в поле редактирования, приложение должно послать сообщение EM_REPLACESEL, где параметр lpszReplace содержит новый текст.
Параметр |
Описание |
lpszReplace |
Значение lParam. Указатель на терминированную нулем строку, содержащую замещающий текст. { Указатель на строку } |
Возвращаемое значение
Данное сообщение значение не возвращает.
Комментарии
Используйте сообщение EM_REPLACESEL, если вы хотите изменять только часть текста поля редактирования. Если вам нужно заменить весь текст, используйте сообщение WM_SETTEXT.
В случае отсутствия выбранного текста, замещающий текст вставляется в текущую позицию курсора.
(из справки по Windows API)
Сделайте список с вашими стандартными фразами, и используйте события "OnClick" или "OnMouseDown" в комбинации с "Alt", "Shift" или "Ctrl". Пример: Когда пользователь нажимает клавишу "Alt" в комбинации с правой кнопкой мыши, выводится список заранее подготовленных фраз и выбранная вставляется в ваш TMemo-компонент.
Для вставки строки в Memo:
procedureTForm1.Button1Click(Sender: TObject);
begin
withMemo1 do begin
SelStart:=10;
SelLength:=0;
SelText:='Эта строка включается в Memo, начиная с 10-й позиции ';
end;
end;
Для вставки строки и замены некоторого существующего текста:
procedureTForm1.Button1Click(Sender: TObject);
begin
withMemo1 do begin
SelStart:=10;
SelLength:=20;
SelText:='Эта строка включается в Мемо, начиная с 10-й позиции и замещает собой 20 символов ';
end;
end;
Поместите текст, который вы хотите вставить, в переменную PChar, затем вставьте текст в Memo, используя команду SetSelTextBuf, где SelStart устанавливается в позицию курсора TMemo. Это классно работает.
Другая полезность: вы можете обхойти предел TMemo в 32K в случае, если вы загружаете в него текст, пользуясь методом/командой Lines.LoadfromFile. Компонент имеет внутренний предел в 32K. Если вы загружаете нужный файл в указатель, и используете команду/метод SetTexBuf, то в этом случае в TMemo можно загрузить текста вплоть до 64K.
Включение/Выключение закладки Notebook II
В обработчике события OnChange вашего TTabbedNotebook разместите код примерно такого содержания:
if(NewTab = 0) and(IWantToDisableTab0) thenAllowChange := False;
if(NewTab = 1) and(IWantToDisableTab1) thenAllowChange := False;
…
Да, можно использовать конструкцию Case, но If в данном случае я посчитал удобнее.
Раскрытие пути к элементу TOutline по его индексу
Когда я писал этот код, у меня была цель по индексу TOutlineNode (который являлся результатом поиска) раскрыть его путь (т.е. раскрыть дочерние узлы, ведующие к нему), не затрагивая при это остальные узлы.
Следующая процедура в качестве параметра принимает индекс, после чего раскрывает путь к элементу с этим индексом.
Процедура подразумевает работу с объектом TOutline, имеющим имя Outline.
varOutline: TOutline;
procedureTSearchDlg.ExpandPathToFoundItem( constFoundItemIndex: Longint);
{------------------------------------------------------------------------------
Открываем путь к данному элементу (элемент определяется номером индекса).
До корневого элемента необходимо раскрывать только родителей.
Читать дальше