Domanda

Sto usando Delpho 2006. Lo scenario:

Sul modulo dati Ho un ActionList. Una delle azioni ha una scorciatoia Ctrl + F4 e voglio avere un collegamento secondario Ctrl + W. Ho provato tutti i seguenti:

L'aggiunta di Ctrl + W alla lista delle azioni SecondaryShortcut nell'IDE.

Aggiunta nella procedura DataModuleCreate utilizzando

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

o

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

Usando entrambi questi metodi nella procedura Creare o FormShow della forma in cui verrà utilizzato.

Il collegamento primario funziona sempre, ma non secondario.

Quando metto l'ActionList nella maschera principale posto del modulo dati, funziona semplicemente aggiungendo Ctrl + W nella IDE. Che cosa ho fatto di sbagliato?

È stato utile?

Soluzione

La soluzione più elegante trovato finora è questo:

Nel modulo che si desidera gestire la SecondaryShortCut, aggiungere questo alla manifestazione OnShortCut:

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

Alternativa:

(Questa non è una vera soluzione, ma una soluzione.)

Mettere una lista di azioni sulla forma che ha un'azione identica a quella del modulo dati. Nelle sue eseguire e aggiornare eventi esso soltanto inoltra gli eventi all'azione modulo dati. I menu del modulo utilizzano l'azione locale.

In questo caso è sufficiente aggiungere Ctrl + W per la proprietà SecondaryShortCuts utilizzando l'IDE.

Ovviamente, quando l'azione sui cambiamenti dei moduli dati, ho bisogno di cambiare tutte le azioni locali troppo.

Altri suggerimenti

Non è una vera e propria soluzione, ma se si crea la datamodule dall'interno della MainForm funziona:

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;

Credo che le scorciatoie sono gestite dal modulo che ha il focus corrente. Così yo sarà probabilmente ottenere gli stessi problemi se li si utilizza in un'altra forma.

Risposta breve:. Azioni scorciatoie non automaticamente fuoco attraverso forme e moduli di dati

Se si seguono le istruzioni della domanda, troverete che nemmeno i fuochi scorciatoia primari. Questo perché un passo fondamentale è stato lasciato fuori delle istruzioni. Uno che servirà a spiegare perché OP sperimentato il tiro scorciatoia primaria e non quello secondario.

Se si includono i passaggi aggiuntivi:

  • Aggiungi un menu al form.
  • e collegare un menu-item all'azione.

Poi la scorciatoia principale sarà in grado di sparare l'azione. Questo perché la componente di azione spinge le impostazioni alla voce di menu (compreso il ShortCut proprietà). Tuttavia, TMenuItem non implementa il concetto di brevi tagli secondari. Quale è il motivo per cui si lavora e non l'altro.


fermo a considerare un'applicazione con molte forme e moduli di dati; e l'implicazione se azione scorciatoie poteva sparare attraverso tutti loro. Dovrebbe essere abbastanza ovvio che non dovrebbero essere in grado automaticamente fuoco senza codice esplicito permesso. Lei non vorrebbe una forma di sfondo facendo un sacco di cose, perché la sua configurato scorciatoia chiavi capita di essere premuto nel contesto di altri lavori indipendenti.

La documentazione href="http://docwiki.embarcadero.com/Libraries/en/Vcl.ActnList.TActionList" rel="nofollow"> sottolinea il vantaggio di mettere liste di azioni sui dati -moduli. Ma non sembra offrire alcuna spiegazione come utilizzare le azioni con scorciatoie su un modulo dati correttamente . Certamente niente è menzionato nei luoghi previsti, vale a dire: ShortCut e SecondaryShortcuts . (Sarei deluso, ma le mie aspettative di documentazione decente sono stati trascinati piuttosto basso.)

...

Cosa dovrebbe essere fatto per ottenere le azioni con scorciatoie di lavoro attraverso forme e moduli di dati?

Ho fatto un po 'di indagini e trovato alcune opzioni. Come sempre, la valutazione relativa del trade-off a ciò che si sta cercando di ottenere.

  • Quando si rilascia un elenco di azioni in un modulo (non principale), tutte le scorciatoie funzionano come previsto. Questo è lo scenario più comune e si applica quando le azioni sono locali e forma specifica.

  • Quando si rilascia una lista di azioni nella maschera principale, tutte quelle scorciatoie saranno in grado di sparare da qualsiasi altra forma. Questo è grande per brevi tagli a livello di applicazione come l'apertura di altre forme.

Nota: C'è una sequenza di priorità quanto a dove una scorciatoia viene testato prima. Quindi, se la forma attiva ha una scorciatoia corrispondenti uno nella maschera principale, la scorciatoia verrà elaborato a livello locale. E la forma principale comprensibilmente non lo otterrà.

  • Quando un modulo è testato per vedere se si gestisce una scorciatoia, tutte le Componenti di proprietà sono anche controllato. (Questo è infatti perché i due primi elementi di lavoro.) Ciò significa che semplicemente impostando il Owner del modulo dati opportunamente permetterà ai scorciatoie da applicare al modulo selezionato.

vale a dire. Invece di:

Application.CreateForm(TDataModule1, DataModule1);

È possibile utilizzare il seguente:

DataModule1 := TDataModule1.Create(LocalForm);

Tuttavia, dal momento che ogni istanza di un modulo dati può avere un solo proprietario: dovreste creare più istanze per lasciare molteplici forme condividono le scorciatoie. Se questa è un'opzione dipende dalle circostanze. Tuttavia, si potrebbe anche fare la forma principale del proprietario del vostro modulo dati che sarebbe in qualche modo equivalente alla seconda opzione di cui sopra.

  • L'ultima opzione che fornisce il massimo controllo è proprio la risposta di OP. Cioè Qualsiasi forma che ha bisogno di sostegno "scorciatoie esterni" in grado di gestire l'evento OnShortCut con il seguente codice:

Come si può vedere nel codice di esempio è possibile delegarea più liste di azione in luoghi diversi in base alla priorità che si sceglie.

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;

L'azione è sempre inghiottito dalla forma ... Se si desidera una secondaria forma / struttura / datamodule per gestire l'azione ... Hai per disabilitare l'ActionList dal primario prima ...

Form1.ActionList1.State: = asSuspended;

DataModule1.ActionList1.State: = asNormal;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top