Standardowe akcje TEditCut, TEditCopym ... i TActionToolBar

0

Moja aplikacja składa się z głównego okna i okien edycyjnych (nie są modalne) które zawierają kontrolkę edytora (SynEdit). Chcę zastosować standardowe akcje TEditCopy, TEditCut, ... Akcje są podłączone do menu oraz przycisków na toolbarze w głównym oknie. W kodzie akcji wymagane jest aby kontrolka edytora miała focus. Menu działa poprawnie ale kliknięcie w toolbar (TActionToolBar) pozbawia kontrolkę focusa i akcje nie działają. Jest na to jakiś patent? Jak sobie z tym poradzić?

Romek

0

Skoro kliknięcie na ToolBar usuwa fokus, to w kodzie obsługi akcji najpierw sfokusuj SynEdit, a następnie wykonaj to co trzeba. Tuż przed kliknięciem na ToolBar kontrolka już miała fokus, więc jego przywrócenie zdaje się być w pełni bezpieczne.

Możesz też przechowywać referencję ostatnio sfokusowanego SynEdit, tak aby zawsze wiedzieć którego edytora ma dotyczyć akcja, jeśli masz tych edytorów wiele. To zdaje się być lepsze, niż bazowanie na fokusie.

0

W TActionMenager zrób zdarzenie OnExecute i tam umieść taki kod (u mnie z TRichEdit ale to nie ważne tam sobie zrób focus dla swojej kontrolki)

procedure TForm1.ActionManager1Execute(Action: TBasicAction;
  var Handled: Boolean);
begin
  if Action.Tag = 1 then
    RichEdit2.SetFocus;
end;

Teraz jeszcze w TActionMenager lub TActionToolBar dla każdej akcji związanej z tym edytorem ustaw Tag na 1 jak masz kilka edytorów to dla akcji mających dotyczyć kolejnego edytora ustaw 2 itd... i dodaj kolejny warunek w zdarzeniu OnExecute.

1

A tak w ogóle to czemu ten ToolBar kradnie fokus?

Zobacz tutaj — https://stackoverflow.com/a/22557996/19103115

0

Zauważyłem że jak jeżeli kontrolka edycyjna znajduje się na 2 oknie to mój poprzedni kod zachowuje się dość spontanicznie, działa jak mu się chce. Tak działa znacznie lepiej:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls,
  Vcl.StdActns, System.Actions, Vcl.ActnList, System.ImageList, Vcl.ImgList,
  Vcl.PlatformDefaultStyleActnCtrls, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    ActionToolBar1: TActionToolBar;
    ActionManager1: TActionManager;
    ImageList1: TImageList;
    EditPaste1: TEditPaste;
    EditCopy1: TEditCopy;
    EditSelectAll1: TEditSelectAll;
    Button1: TButton;
    EditCut1: TEditCut;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
    procedure ActionManager1Execute(Action: TBasicAction; var Handled: Boolean);
    procedure RichEdit1ActionExecute(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.ActionManager1Execute(Action: TBasicAction;
  var Handled: Boolean);
begin
  if (Form2.Visible) then  //dla bezpieczeństwa
  begin
    Form2.SetFocus;
    Form2.RichEdit1.SetFocus;
    Action.ExecuteTarget(Form2.RichEdit1);
  end;
end;

//ta procedura zdarzenia MUSI BYĆ przypisana do OnExecute każdej z tych akcji 
procedure TForm1.RichEdit1ActionExecute(Sender: TObject);
begin
  //empty procedure
end;

end.

Nie wiem dlaczego (i nie chce mi się wnikać) ta pusta procedura tak jak napisałem w komentarzu musi być przypisana do każdej akcji bez tego czasem zadziała a czasem nie.Przynajmniej u mnie tak jest.

0

Zobacz tutaj — https://stackoverflow.com/a/22557996/19103115

Tej informacji potrzebowałem. Teraz akcje działają zgodnie z oczekiwaniem a kontrolka zachowuje fokus.

Dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1