TMemo
Code: |
Function SetCaretPosition(memo:TMemo; x,y:integer); {©Drkb v.3(2007): www.drkb.ru, ®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.} var i:integer; begin i := SendMessage(memo.Handle, EM_LINEINDEX, y, 0) + x; SendMessage(memo1.Handle, EM_SETSEL, i, i); end;
или
type TFake=class(TCustomMemo);
....
TFake(MyMemo).SetCaretPos() |
Code: |
procedure CaretPos(H: THandle; var L,C : Word); begin L := SendMessage(H,EM_LINEFROMCHAR,-1,0); C := LoWord(SendMessage(H,EM_GETSEL,0,0)) - SendMessage(H,EM_LINEINDEX,-1,0); end;
procedure TForm1.Button1Click(Sender: TObject); var LineNum,ColNum : Word; begin CaretPos(Memo1.Handle,LineNum,ColNum); Edit1.Text := IntToStr(LineNum) + ' ' + IntToStr(ColNum); end; |
Code: |
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F8 then SendMessage(Memo1.Handle, { HWND для Memo } WM_VSCROLL, { сообщение Windows } SB_PAGEDOWN, {на страницу вниз } 0) { не используется } else if Key = VK_F7 then SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEUP, 0); end;
|
Наследник TMemo со свойствами row & col:
У меня имеется компонент TMemo, и мне необходимо автоматически "тормозить" программным способом его прокрутку при добавлении новой строки Memo.Lines.Add(Строка).
В Delphi 2.0 простая установка 'SelStart:=0' НЕ срабатывает. Это ошибка в коде VCL. Значения различных частей 'сообщения' windows, используемые для "set selection" (установления выбранной части текста) в WIN32 были изменены (это использовалось для 'автоматической' прокрутки каретки/курсора, но больше не работает).
Code: |
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Memo1.SelStart := LoWord(SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0, MakeLParam(X, Y))); Memo1.SelLength := 0; end; |
Для чтения файла будем использовать TMemoryStream, а затем используем метод SetSelTextBuf() из TMemo, чтобы вставить в него текст:
Этот пример прокручивает на одну строку вниз.
Code: |
memo1.Perform(WM_VScroll, SB_LINEDOWN,0); |
Code: |
procedure LoadUnicodeFile(const filename: string; strings: TStrings);
procedure SwapWideChars(p: PWideChar); begin while p^ <> #0000 do begin p^ := WideChar(Swap(Word(p^))); Inc(p); end; end;
var ms: TMemoryStream; wc: WideChar; pWc: PWideChar; begin ms := TMemoryStream.Create; try ms.LoadFromFile(filename); ms.Seek(0, soFromend); wc := #0000; ms.Write(wc, sizeof(wc)); pWC := ms.Memory; if pWc^ = #$FEFF then {normal byte order mark} Inc(pWc) else if pWc^ = #$FFFE then begin {byte order is big-endian} SwapWideChars(pWc); Inc(pWc); end else ; {no byte order mark} strings.Text := WideChartoString(pWc); finally ms.free; end; end; |
Использовать
LoadUnicodeFile(filename, memo1.lines);
Автор: Xavier Pacheco
Создайте потомок TMemo, перехватывающий сообщения WM_HSCROLL и WM_VSCROLL:
Элементы управления Windows TEdit и TMemo не имеют режима замены. Однако этот режим можно эмулировать установив свойство SelLength edit'а или memo в 1 при обработке события KeyPress. Это заставит его перезаписывать символ в текущей позиции курсора. В примере этот способ используется для TMemo. Режим вставка/замена переключается клавишей "Insert".
Страница 1 из 3