Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

StretchBlt(hDC, rcItem.left, rcItem.top, yMenu, yMenu, MemDC, 0, 0, 24, 23, mtd);

DeleteDC(MemDC);

DeleteObject(BM);

end;

 end{with}

End;{TDNForm.WMDrawItem}

end.
 

Memo 

Получение данных из компонента Memo

Delphi 1

Для получения содержимого буфера используйте метод GetTextBuf,

или воспользуйтесь приведенным ниже кодом (естественно, откорректируйте его под себя).

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

 LineNo : integer;

 ColNo : integer;

begin

 LineNo:=SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);

 ColNo:=Memo1.SelStart;

 if LineNo>0 then begin

While SendMessage(Memo1.Handle, EM_LINEFROMCHAR, ColNo, 0) = LineNo do ColNo:=ColNo-1;

ColNo:=Memo1.SelStart-ColNo-1;

 end else ColNo:=Memo1.SelStart;

 Panel1.Caption:='Строка '+IntToStr(LineNo)+' ; Колонка '+IntToStr(ColNo);

 {Здесь вы можете получить текст через Memo1.Lines[LineNo].Text[ColNo] …}

end;

Предупреждение! Данный код был написан в среде WinNT/D2 с использованием элемента управления richedit. Я тестировал то же самое, но с компонентом Memo и в D1, но этот код я забыл дома. Код выше написан по памяти и не тестировался, но я думаю он должен работать. Если вы переберетесь на D2, измените вызов sendmessage на следующий:

SendMessage(Memo1.Handle, EM_EXLINEFROMCHAR, 0, ColNo)

Изменение поведения Delete в компоненте Memo

Delphi 1

Просто меняю обработчик Memo OnKeyDown следующим образом:

if Key = VK_DELETE then begin

 здесь делайте все, что вы хотите

end;

if Key = VK_BACK then begin

 аналогично

end;

Вероятно, лучшим решением было бы использование конструкции CASE, но я не уверен, что она поймет как нужно VK_??. Возможно, после обработки нужно вызвать унаследованный обработчик, т.е. дать поработать обработчику верхнего уровня, у которого мы стырили управление. Не хотите подумать над этим?

Чтобы понять, где мы сейчас находимся, используйте 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_? имеет целочисленный тип, то это будет работать:

case Key of

VK_DELETE :

 begin

Key := 0; {этим мы не позволяем сообщению keydown передаваться дальше,

например, форме или компонентам}

выполняем нужный код;

 end;

VK_BACK:

 begin

Key := 0; {этим
мы не позволяем сообщению keydown передаваться дальше,

например, форме или компонентам}

выполняем нужный код;

 end;

end;

Вставка текста в TMemo II

Delphi 1

Используйте сообщение 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:

procedure TForm1.Button1Click(Sender: TObject);

begin

 with Memo1 do begin

SelStart:=10;

SelLength:=0;

SelText:='Эта строка включается в Memo, начиная с 10-й позиции ';

 end;

end;

Для вставки строки и замены некоторого существующего текста:

procedure TForm1.Button1Click(Sender: TObject);

begin

 with Memo1 do begin

SelStart:=10;

SelLength:=20;

SelText:='Эта строка включается в Мемо, начиная с 10-й позиции и замещает собой 20 символов ';

 end;

end;

Поместите текст, который вы хотите вставить, в переменную PChar, затем вставьте текст в Memo, используя команду SetSelTextBuf, где SelStart устанавливается в позицию курсора TMemo. Это классно работает.

Другая полезность: вы можете обхойти предел TMemo в 32K в случае, если вы загружаете в него текст, пользуясь методом/командой Lines.LoadfromFile. Компонент имеет внутренний предел в 32K. Если вы загружаете нужный файл в указатель, и используете команду/метод SetTexBuf, то в этом случае в TMemo можно загрузить текста вплоть до 64K. 

Поделиться с друзьями: