:: 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?
// Прокрутка до конца текста
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
|
Как перехватить клавишу табуляции (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;
|
Как сделать 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;
|
При использовании материала - ссылка на сайт обязательна
|
|