문제

델포 2006을 사용하고 있습니다.시나리오:

데이터 모듈에는 ActionList가 있습니다.작업 중 하나에 단축키 Ctrl+F4가 있고 보조 단축키인 Ctrl+W를 갖고 싶습니다.나는 다음을 모두 시도했습니다.

IDE의 SecondaryShortcut 작업 목록에 Ctrl+W를 추가합니다.

다음 중 하나를 사용하여 DataModuleCreate 프로시저에 추가

ActFileCloseFile.SecondaryShortCuts.Add('Ctrl+W');

또는

ActFileCloseFile.SecondaryShortCuts.AddObject('Ctrl+W',
  TObject(Menus.ShortCut(87, [ssCtrl])));

사용될 양식의 Create 또는 FormShow 프로시저에서 이 두 가지 방법을 모두 사용합니다.

기본 단축키는 항상 작동하지만 보조 단축키는 작동하지 않습니다.

데이터 모듈 대신 기본 폼에 ActionList를 배치하면 IDE에서 Ctrl+W만 추가하면 작동합니다.내가 뭘 잘못한 걸까요?

도움이 되었습니까?

해결책

지금까지 발견 된 가장 우아한 솔루션은 다음과 같습니다.

SecondaryShortCut를 처리하려는 양식에서는 OnShortCut 이벤트에 추가하십시오.

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := dmDataModule.ActionList1.IsShortCut(Msg);
end;

대안:

(이것은 실제 해결책이 아니라 해결 방법입니다.)

데이터 모듈의 것과 동일한 조치가있는 양식에 작업 목록을 넣습니다. 실행 및 업데이트에서 이벤트는 이벤트를 데이터 모듈 작업에 전달합니다. 양식의 메뉴는 로컬 작업을 사용합니다.

이 경우 IDE를 사용하여 SecondaryShortcuts 속성에 Ctrl+W를 추가하는 것으로 충분합니다.

분명히 데이터 모듈에 대한 조치가 변경되면 모든 로컬 작업도 변경해야합니다.

다른 팁

실제 솔루션은 아니지만 메인 형식 내에서 데이터 모드를 작성하면 작동합니다.

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FDataModule := TMyDataModule.Create(self);
  TMyButton.Action := FDataModule.TheAction;
end;


procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
  TheAction.SecondaryShortCuts.Add('Ctrl+W');
end;

바로 가기는 현재 초점이있는 형태로 처리된다고 생각합니다. 그래서 당신이 다른 형태로 그것들을 사용하는 경우 아마도 같은 문제를 겪을 것입니다.

짧은 답변:작업 바로가기는 지원되지 않습니다. 자동으로 양식과 데이터 모듈 전체에서 실행됩니다.

질문의 지침을 따르면 기본 단축키도 실행되지 않는다는 것을 알 수 있습니다.이는 지침에서 주요 단계가 빠졌기 때문입니다.OP가 2차 발사가 아닌 1차 단축 발사를 경험한 이유를 설명하는 역할을 할 것입니다.

추가 단계를 포함하는 경우:

  • 양식에 메뉴를 추가합니다.
  • 그리고 메뉴 항목을 작업에 연결합니다.

그러면 기본 단축키가 해당 작업을 실행할 수 있습니다.이는 Action 구성 요소가 해당 설정을 메뉴 항목(다음 항목 포함)에 푸시하기 때문입니다. ShortCut 재산).하지만, TMenuItem 보조 단축키 개념을 구현하지 않습니다.그렇기 때문에 하나는 작동하고 다른 하나는 작동하지 않습니다.


다양한 양식과 데이터 모듈이 포함된 애플리케이션을 잠시 살펴보겠습니다.그리고 액션 단축키가 모든 액션에 걸쳐 실행될 수 있다는 의미입니다.그들이 할 수 없다는 것은 상당히 명백해야 합니다. 자동으로 이를 허용하는 명시적인 코드 없이 실행합니다.관련 없는 다른 작업의 컨텍스트에서 구성된 단축키가 눌려지기 때문에 백그라운드 양식이 여러 가지 작업을 수행하는 것을 원하지 않을 것입니다.

그만큼 선적 서류 비치 데이터 모듈에 작업 목록을 넣는 것의 이점을 지적합니다.하지만 액션을 사용하는 방법에 대한 설명을 제공하지 않는 것 같습니다. 단축키 포함 데이터 모듈에서 바르게.확실히 예상되는 장소에는 아무 것도 언급되지 않았습니다. 즉: 지름길 그리고 보조 바로가기.(실망스럽겠지만, 괜찮은 문서에 대한 기대는 상당히 낮아졌습니다.)

그래서...

무엇 ~해야 한다 양식과 데이터 모듈 전반에 걸쳐 작동하는 바로 가기를 사용하여 작업을 수행해야 합니까?

나는 약간의 조사를 했고 몇 가지 옵션을 찾았습니다.항상 그렇듯이 달성하려는 목표와 비교하여 절충안을 평가하십시오.

  • (기본이 아닌) 양식에 작업 목록을 놓으면 모든 바로 가기가 예상대로 작동합니다.이는 가장 일반적인 시나리오이며 작업이 로컬이고 특정 형식일 때 적용됩니다.

  • 기본 양식에 작업 목록을 놓으면 모든 바로가기가 다른 양식에서 실행될 수 있습니다.이는 다른 양식을 여는 등 애플리케이션 전반에 걸친 단축키에 적합합니다.

메모: 바로가기가 먼저 테스트되는 위치에 대한 우선순위 순서가 있습니다.따라서 활성 양식에 기본 양식과 일치하는 바로 가기가 있으면 바로 가기가 로컬로 처리됩니다.그리고 기본 양식은 당연히 그것을 얻지 못할 것입니다.

  • 양식이 바로 가기를 처리하는지 확인하기 위해 테스트할 때 모든 소유 구성요소 도 확인됩니다.(사실 이것이 위의 처음 두 가지가 작동하는 이유입니다.) 이는 단순히 Owner 귀하의 데이터 모듈 중 하나를 선택하면 해당 단축키를 선택한 양식에 적절하게 적용할 수 있습니다.

즉.대신에:

Application.CreateForm(TDataModule1, DataModule1);

다음을 사용할 수 있습니다.

DataModule1 := TDataModule1.Create(LocalForm);

그러나 데이터 모듈의 각 인스턴스에는 소유자가 하나만 있을 수 있으므로 다음과 같습니다.여러 양식이 바로 가기를 공유할 수 있도록 하려면 여러 인스턴스를 만들어야 합니다.이것이 옵션인지 여부는 귀하의 상황에 따라 다릅니다.그러나 위의 두 번째 옵션과 어느 정도 동일하게 기본 양식을 데이터 모듈의 소유자로 만들 수도 있습니다.

  • 가장 많은 제어권을 제공하는 마지막 옵션은 OP의 자체 답변입니다.즉."외부 바로 가기"를 지원해야 하는 모든 양식은 다음 코드를 사용하여 OnShortCut 이벤트를 처리할 수 있습니다.

코드 샘플에서 볼 수 있듯이 선택한 우선순위에 따라 다양한 위치에 있는 여러 작업 목록에 위임할 수 있습니다.

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := DataModule1.ActionList3.IsShortCut(Msg);
  Handled := Handled or DataModule2.ActionList1.IsShortCut(Msg);
  Handled := Handled or DataModule1.ActionList1.IsShortCut(Msg);
end;

액션이 양식에 의해 삼켜지고 있습니다 ... 조치를 처리하기 위해 보조 양식/프레임/Datamodule을 원한다면 ... 기본 첫 번째에서 ActionList를 비활성화해야합니다 ...

form1.actionlist1.state : = Assuspended;

DatamoDule1.ActionList1.state : = Asnormal;

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top