FAQ.
Компоненты\Memo.

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как определить положение курсора в Memo?

// Способ первый
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  x, y: Integer;
begin
  y := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
  x := Memo1.Perform(EM_LINEINDEX, y, 0);
  Inc(y);
  x := Memo1.SelStart - x + 1;
  Caption := Format('x=%d   y=%d', [x, y]);
end;

// Способ второй
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Caption := Format('Строка:%d   символ:%d',
                    [Memo1.CaretPos.Y, Memo1.CaretPos.X]);
end;


Как узнать, было ли изменено содержимое Memo?

if Memo1.Modified then
  Label1.Caption := 'Содержимое Memo изменено'
else
  Label1.Caption := 'Содержимое Memo неизменено';


Как прокрутить текст в Memo?

// Прокрутка до конца текста
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count-1);

// Прокрутка вниз по одной строке
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, 1);

// Прокрутка вниз по две строки
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, 2);

// Прокрутка вверх по одной строке
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, -1);

// Прокрутка вверх по две строки
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, -2);

// Возможны так же следующие опции:
// SB_BOTTOM
// SB_ENDSCROLL
// SB_LINEDOWN
// SB_LINEUP
// SB_PAGEDOWN
// SB_PAGEUP
// SB_THUMBPOSITION
// SB_THUMBTRACK
// SB_TOP


Как прокрутить текст в Memo (постранично), если фокус находится на другом элементе?

// На одну страницу вниз
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
end;

// На одну страницу вверх
procedure TForm1.Button2Click(Sender: TObject);
begin
  SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEUP, 0);
end;


Как перехватить клавишу табуляции (Tab) в Memo?

// Способ первый
type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    procedure CMDialogKey(Var Msg: TWMKey); message CM_DIALOGKEY;
  end;

{...}

implementation

{...}

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
  if (ActiveControl is TMemo) and (Msg.Charcode = VK_TAB) then
    ShowMessage('Нажата клавиша TAB');
  inherited;
end;

// Способ второй
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;
  end;

{...}

implementation

{...}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_KEYDOWN:
      if (ActiveControl = Memo1) and (Msg.wParam = VK_TAB) then
      begin
        ShowMessage('Нажата клавиша TAB');
        Handled := True;
      end;
  end;
end;


Как сделать отступ в Memo?

// Данная процедура установит отступы
// по краям Memo шириной 20 пикселей
procedure TForm1.Button1Click(Sender: TObject);
var
  Rect: TRect;
begin
  SendMessage(Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect));
  Rect.Left := 20;
  Rect.Right := Memo1.Width - 20;
  SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect));
  Memo1.Refresh;
end;


Как в Memo установить курсор в нужную позицию?

procedure TForm1.Button1Click(Sender: TObject);
var
  p: TPoint;
begin
  p.X := Position; // Позиция курсора в строке
  p.Y := Line;     // Номер строки
  Memo1.CaretPos := p;
  Memo1.SetFocus;
end;


Как получить номер верхней видимой строки в TMemo?

procedure TForm1.Button1Click(Sender: TObject);
var
  FirstVisibleLine: Integer;
begin
  FirstVisibleLine := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
  ShowMessage(IntToStr(FirstVisibleLine));
end;


Как сделать Memo с закруглёнными краями?

procedure TForm1.Button1Click(Sender: TObject);
var
  Rgn: HRGN;
  r: TRect;
begin
  r := Memo1.ClientRect;
  Rgn := CreateRoundRectRgn(r.Left, r.top, r.right, r.bottom, 20, 20);
  Memo1.BorderStyle := bsNone;
  Memo1.Perform(EM_GETRECT, 0, lparam(@r));
  InflateRect(r, -5, -5);
  Memo1.Perform(EM_SETRECTNP, 0, lparam(@r));
  SetWindowRgn(Memo1.Handle, Rgn, True);
end;


Как узнать количество видимых строчек в TMemo?

function LinesVisible( Memo: TMemo ): Integer;
var
  OldFont: HFont;
  Hand: THandle;
  TM: TTextMetric;
  Rect: TRect;
  TempInt: Integer;
begin
  Hand := GetDC(Memo.Handle);
  try
    OldFont := SelectObject(Hand, Memo.Font.Handle);
    try
      GetTextMetrics(Hand, TM);
      Memo.Perform(EM_GETRECT, 0, Longint(@Rect));
      TempInt := (Rect.Bottom - Rect.Top) div (TM.tmHeight + TM.tmExternalLeading);
    finally
      SelectObject(Hand, OldFont);
    end;
  finally
    ReleaseDC(Memo.Handle, Hand);
  end;
  Result := TempInt;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(LinesVisible(Memo1)));
end;

При использовании материала - ссылка на сайт обязательна