Телефон: +7 (926) 245-03-63

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

Следующая статья: Простой пример работы с базой данных из DLL.

Решение 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;

Решение 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;

Решение 3

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

SendMessage(GetFocus, WM_CUT, 0, 0);
SendMessage(GetFocus, WM_COPY, 0, 0);
SendMessage(GetFocus, WM_PASTE, 0, 0);

Решение 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, необходимо перейти в режим редактирования и после манипуляций с данными буфера обмена сохранить измененные данные.