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".