Поддержка команд Cut, Copy, Paste

Решение 1
Предлагаем следующие процедуры. Вызывайте их при выборе соответствующих пунктов меню. Это будет работать со всеми «редактируемыми» элементами управления. Но для TTree нужно использовать специальные сообщения редактирования.

procedure TForm1.CopyClick(Sender: TObject);
var
  Mes: TWMCopy;
begin
  Mes.Msg := WM_COPY;
  Screen.ActiveControl.Dispatch(Mes);
end;

procedure TForm1.CutClick(Sender: TObject);
var
  Mes: TWMCut;
begin
  Mes.Msg := WM_CUT;
  Screen.ActiveControl.Dispatch(Mes);
end;

procedure TForm1.PasteClick(Sender: TObject);
var
  Mes: TWMPaste;
begin
  Mes.Msg := WM_PASTE;
  Screen.ActiveControl.Dispatch(Mes);
end;

procedure TForm1.UndoClick(Sender: TObject);
var
  Mes: TWMUndo;
begin
  Mes.Msg := WM_UNDO;
  Screen.ActiveControl.Dispatch(Mes);
end;
[Shejchenko Andrij]

Решение 2
Свойство формы ActiveControl позволяет получить ссылку на активный в данный момент элемент управления. Но не все элементы управления могут работать с буфером обмена. Если хотите работать только с компонентами Edit и Memo, то самый простой метод для CopyToClipboard:

ActiveControl.Perform(WM_COPY, 0, 0);
Для PasteFromClipboard:
ActiveControl.Perform(WM_PASTE, 0, 0);
Если элемент управления «не понимает» посланных сообщений, то это никак не скажется на его работе, он просто проигнорирует их.

Другим способом является проверка типа во время выполнения приложения:

if ActiveControl is TCustomEdit then
  TCustomEdit(ActiveControl).CopyToClipboard;
[News Group]

Решение 3
Реализация команд Cut, Copy и Paste средствами WinAPI:

SendMessage(GetFocus, WM_CUT, 0, 0);
SendMessage(GetFocus, WM_COPY, 0, 0);
SendMessage(GetFocus, WM_PASTE, 0, 0);
[News Group]

Решение 4
Есть два шага, положенных в основу работы с буфером обмена . Во-первых, нужно знать, какие пункты меню Правка должны быть в данный момент активизированы. Во-вторых, необходимо работать с тем элементом управления, который в данный момент выбран.

procedure TForm1.Edit1Click(Sender: TObject);
begin
  if ActiveControl is TCustomEdit then begin
    with TCustomEdit(ActiveControl) do begin
      Cut1.Enabled := SelLength > 0;
      Copy1.Enabled := SelLength > 0;
      Paste1.Enabled := ClipBoard.HasFormat(CF_TEXT);
    end;
  end else begin
    Cut1.Enabled := False;
    Copy1.Enabled := False;
    Paste1.Enabled := False;
  end;
end;

procedure TForm1.Cut1Click(Sender: TObject);
begin
  if ActiveControl is TDBEdit then
    with TDBEdit(ActiveControl).DataSource.DataSet do Edit;
  TCustomEdit(ActiveControl).CutToClipboard;
  if ActiveControl is TDBEdit then
    with TDBEdit(ActiveControl).DataSource.DataSet do Post;
end;

procedure TForm1.Copy1Click(Sender: TObject);
begin
  TCustomEdit(ActiveControl).CopyToClipboard;
end;

procedure TForm1.Paste1Click(Sender: TObject);
begin
  if ActiveControl is TDBEdit then
    with TDBEdit(ActiveControl).DataSource.DataSet do Edit;
  TCustomEdit(ActiveControl).PasteFromClipboard;
  if ActiveControl is TDBEdit then
    with TDBEdit(ActiveControl).DataSource.DataSet do Post;
end;
Edit1 – меню редактирования верхнего уровня. Если по нему щелкают, то прежде чем меню «вывалится» вниз, необходимо проверить, принадлежит ли текущий активный элемент управления некоторым типам редактирования. Если это условие выполняется, активизируются пункты меню Вырезать и Копировать и, если есть текст в буфере обмена, то и пункт Вставить. Если нет, то все три пункта будут недоступны.

Для копирования содержимого элемента редактирования достаточно просто вызвать CopyToClipboard; это не проблема. Для вырезания и вставки необходимо «изменить» содержимое активного элемента редактирования – если это DBEdit, необходимо перейти в режим редактирования и после манипуляций с данными буфера обмена сохранить измененные данные.

[News Group]