如何在delphi中获取焦点/选定对象?

时间:2018-02-13 11:59:05

标签: delphi delphi-7

我有一个PageControl对象,在不同的标签页中有几个页面。 每个标签都包含许多对象,例如TEditsTComboBoxes。 让我们说我在"标签A"在TEdit中输入文本,然后将软件更改标签输入到"标签B"然后回到"标签A"。然后不再选择TEdit,因此我需要再次选择它才能继续写作。

现在我的问题: 如何在更改选项卡之前保存/获取/存储所选对象,以便在返回上一个选项卡时可以返回到同一对象?

谢谢!

2018年2月15日 更新:

谢谢@ExDev!

Screen.ActiveControl是我在寻找的地方!我这样解决了:

var 
  FocusObject : TWinControl;
begin
  // Save selected object  
  FocusObject:= Screen.ActiveControl;

  // Restore selected object  
  FocusObject.SetFocus;
end;

1 个答案:

答案 0 :(得分:1)

您可以使用TPageControl.OnChanging事件存储焦点控件,然后再更改活动标签页和TPageControl.OnChange事件以恢复其焦点状态。

示例:

TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
  private
    FActiveControls : array of TWinControl;
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(FActiveControls, PageControl1.PageCount);
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if(FActiveControls[TPageControl(Sender).ActivePageIndex] <> nil)
  then FActiveControls[TPageControl(Sender).ActivePageIndex].SetFocus();
end;

procedure TForm1.PageControl1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
  FActiveControls[TPageControl(Sender).ActivePageIndex] := Screen.ActiveControl;
end;

注意:

如果您在代码中更改活动页面,则不会调用这两个事件,例如,通过设置TPageControl.ActivePage的值。