delphi 撷取编辑控件中的Select和Deselect事件

ar7v8xwq  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(182)

我有一个表单,其中有一个TMemo控件,您可以在其中输入文字,还有另一个TEdit控件,当使用者选取Memo中的文字时,我希望它会自动显示在Edit中。有没有办法不使用计时器就能做到这一点?(实际上,有没有办法可以撷取选取或取消Memo控件中的文字时所发生的事件?)
我知道可以使用OnMouseUpOnKeyUp事件,但这样,Edit将仅在用户完成选择后更新,而不是在选择时更新。

bgtovc5b

bgtovc5b1#

这是我的尝试,在大多数情况下都很有效。也许你可以根据自己的喜好调整它。

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
    mouseselectionstarted: boolean;
    procedure FillText;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  System.UITypes;

{$R *.dfm}

procedure TForm1.FillText;
begin
  Edit1.Text := Memo1.SelText;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  mouseselectionstarted := false;
end;

procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssShift in Shift) and (Key in [vkLeft, vkUp, vkRight, vkDown]) then
    FillText;
end;

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Button = mbLeft) then
    mouseselectionstarted := true;
end;

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if mouseselectionstarted then
    FillText;
end;

procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  mouseselectionstarted := false;
end;

相关问题