Читать «Виртуальная библиотека Delphi» онлайн - страница 100

Unknown

  Label1.Caption := 'Line ' + IntToStr(LineNum + 1)

  Lebel2.Caption := 'Position ' + IntToStr(Memo1.SelStart - CharsBeforeLine + 1);

end;

14. Постранична прокрутка TMemo, реализация Undo и определение строки курсора.

Как прокрутить содержимое компонента TMemo?

Приведенная ниже процедура предполагает, что фокус находится на Edit1 и осуществляет прокрутку в соответствии с нажатыми клавишами.

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;

Если определено всплывающее (popup) меню для TMemo,и заданы клавиши для операций Cut, Copy, Paste, то я могу обрабатывать эти события, вызывая методы CutToClipboard, CopyToClipboard, и т.д. Однако, если я поместили пункт Undo в меню (обычно Ctrl+Z), то как дать знать TMemo, что нужно выполнить Undo?

Если встроенного Undo достаточно, то это очень просто:

Memo1.Perform(EM_UNDO, 0, 0);

Для переключения свойства Enabled пункта меню Undo1:

Undo1.Enabled := Memo1.Perform(EM_CANUNDO, 0, 0) <> 0;

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

Весь фокус в сообщении EM_LINEFROMCHAR. Попробуйте:

procedure TMyForm.BitBtn1Click(Sender: TObject);

var

  ILine: Integer;

begin

  ILine := Memo1.Perform(EM_LINEFROMCHAR, $FFFF, 0);

{ Внимание: номера строк начинаются с нуля }

  MessageDlg('Line Number: ' + IntToStr(ILine), mtInformation, [mbOK], 0);

end;

15. Как поместить BLOB Memo в компонент TMemo?

Попробуйте так:

procedure TForm1.Button1Click(Sender: TObject);

var

  S: TBlobStream;

begin

  S := TBlobStream.Create(Table1BBBMemo, bmRead);

  Memo1.Lines.LoadFromStream(S);

  S.Free;

end;

где:

1. Table1BBBMemo — имя поля BLOB Memo (TMemoField).

2. Memo1 — имя компонента TMemo. Естественно, что этим же способом можно обмениваться информацией с BLOB-полями произвольного типа.

16. Как показать содержимое Memo поля в TDBGrid?

Используйте следующий код для обработки события OnDrawDataCell у TDBGrid. (Перед запуском программы создайте объект TMemoField для memo поля в Fields Editor).

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);

var

  P: array [0..1023] of Char; { MemoField buffer }