Frage

Ich bin mit Delpho 2006. Das Szenario:

Auf dem Datenmodul habe ich eine Action. Eine der Aktionen hat eine Tastenkombination Strg + F4 und ich möchte eine sekundäre Kombination Strg + W haben. Ich habe versucht, alle folgenden:

Hinzufügen von Strg + W, um die Aktionen SecondaryShortcut Liste in der IDE.

Hinzufügen es im DataModuleCreate Verfahren entweder mit

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

oder

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

beide Methoden verwenden im Erstellen oder Technologieformulare Prozedur des Formulars, wo es verwendet wird.

Die primäre Verknüpfung immer funktioniert, aber nicht die sekundäre.

Wenn ich die Action auf dem Hauptformular setzen anstelle des Datenmoduls, funktioniert es einfach nur mit Strg + W in der IDE. Was ich falsch gemacht?

War es hilfreich?

Lösung

Die eleganteste Lösung gefunden, so weit ist diese:

Auf dem Formular möchten Sie die SecondaryShortCut behandeln, fügen Sie diese zum OnShortCut Ereignis:

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

Alternative:

(Dies ist keine wirkliche Lösung, aber eine Behelfslösung.)

Setzen Sie eine Aktionsliste auf dem Formular, das eine identische Aktion mit dem auf dem Datenmodul hat. In seiner ausführen und aktualisieren, um Ereignisse nur leitet die Ereignisse an das Datenmodul Aktion. Die Menüs auf dem Formular die lokale Aktion verwenden.

In diesem Fall genügt es, Strg + hinzufügen W zur SecondaryShortCuts Eigenschaft der IDE.

Natürlich, wenn die Wirkung auf den Datenmodul Änderungen, ich habe auch alle lokalen Aktionen zu ändern.

Andere Tipps

Nicht eine echte Lösung, aber wenn Sie das Datenmodul aus dem Inneren der Hauptform schaffen es funktioniert:

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;

Ich denke, die Verknüpfungen durch die Form behandelt werden, die den aktuellen Fokus hat. So wird yo wahrscheinlich die gleichen Probleme, wenn man sich in einer anderen Form verwenden.

Kurze Antwort:. Aktionen Short-Cuts nicht automatisch Feuer über Formen und Daten-Module

Wenn Sie die Anweisungen in der Frage folgen, werden Sie feststellen, dass nicht einmal die primären Kurzschnitt Brände. Dies liegt daran, ein wichtiger Schritt ist aus den Anweisungen gelassen worden. Eines, das dazu dienen wird, zu erklären, warum OP die primären Abkürzungs Brennen und nicht die sekundären.

erfahren

Wenn Sie umfassen die zusätzlichen Schritte:

  • Fügen Sie ein Menü in das Formular.
  • und verknüpft einen Menü-Punkt auf die Aktion.

Dann wird der primäre Kurzschnitt wird in der Lage sein, um die Aktion zu schießen. Dies liegt daran, die Aktionskomponente seine Einstellungen auf den Menüpunkt schiebt (einschließlich der ShortCut Eigenschaft). Allerdings ist TMenuItem nicht das Konzept des sekundären Short-Cuts implementieren. Welches ist, warum man arbeitet und das andere nicht.


Pause eine Anwendung mit vielen Formen und Daten-Module zu berücksichtigen; und die Implikation, wenn Aktion abkürzen könnten alle von ihnen feuern über. Es sollte ganz klar sein, dass sie nicht in der Lage sein sollten automatisch Feuer ohne expliziten Code es zu ermöglichen. Sie würden nicht einen Hintergrund bilden dabei ein paar Dinge wollen, weil seine Short-Cut-Tasten konfiguriert passieren im Zusammenhang mit anderen unabhängigen Arbeit gedrückt werden.

Die Dokumentation den Vorteil weist darauf hin, der auf Daten Aktionslisten setzen -Module. Aber scheint keine Erklärung zu bieten, wie Aktionen verwenden mit Short-Cuts auf einem Datenmodul richtig . Sicherlich wird nichts in den erwarteten Stellen erwähnt, und zwar: ShortCut und SecondaryShortcuts . (Ich enttäuscht sein würde, aber meine Erwartungen an anständige Dokumentation wurden ziemlich niedrig gezogen.)

So ...

Was sollte getan werden, um Aktionen zu bekommen mit Abkürzungen arbeiten über Formen und Daten-Module?

Ich habe ein bisschen Untersuchung gemacht und ein paar Optionen gefunden. Wie immer bewertet den Trade-off des relativ zu dem, was Sie erreichen wollen.

  • Wenn Sie eine Aktionsliste auf einer (nicht-main) Form fallen, werden alle Short-Cuts wie erwartet. Dies ist die häufigste Szenario und wird angewendet, wenn die Aktionen sind lokale und spezifische bilden.

  • Wenn Sie eine Aktionsliste auf dem Hauptformular fallen, all diese Abkürzungen werden von jeder anderen Form feuern können. Dies ist für die anwendungsweiten Short-Cuts wie andere Formen zu öffnen.

Hinweis: Es gibt eine Priorisierung Sequenz, wo ein Kurzschnitt zuerst geprüft wird. Also, wenn die aktive Form einen Kurzschnitt hat man auf der Hauptform übereinstimmt, der Short-Cut lokal verarbeitet werden. Und die wichtigste Form wird verständlicherweise nicht bekommen.

  • Wenn ein Formular zu sehen, wird geprüft, ob es einen Short-Cut-Griffe, die alle geordneten Komponenten werden ebenfalls geprüft. (Dies ist in der Tat, warum die ersten beiden oben genannten Arbeiten.) Das bedeutet einfach, dass die Owner Ihrer Daten-Modul Einstellung wird entsprechend seiner Short-Cuts erlauben, Ihre gewählte Form anzuwenden.

d. Statt:

Application.CreateForm(TDataModule1, DataModule1);

Sie können das folgende:

DataModule1 := TDataModule1.Create(LocalForm);

Da jedoch jede Instanz eines Daten-Modul nur einen Eigentümer haben können: Sie müssten mehrere Instanzen erstellen mehrere Formen teilen sich die Short-Cuts zu lassen. Ob dies eine Option hängt von Ihren persönlichen Umständen. Allerdings könnte man auch das Hauptformular der Eigentümer Ihrer Daten-Modul, das auf die zweite Option etwas entsprechen würde oben.

  • Die letzte Option, die die größte Kontrolle bietet, ist eigene Antwort des OP. D. h Jede Form, die „externe Short-Cuts“ unterstützen muss die OnShortCut Veranstaltung mit dem folg Griffgeschuldet Code:

Wie in dem Codebeispiel zu sehen Sie mehrere Aktionslisten in verschiedenen Orten entsprechend der Priorität delegieren Sie wählen können.

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;

Die Aktion wird durch die Form geschluckt zu werden ... Wenn Sie eine sekundäre Form / Rahmen wollen / Datenmodul die Aktion zu behandeln ... Sie müssen die Aktionsliste von den primären deaktivieren ...

Form1.ActionList1.State: = asSuspended;

DataModule1.ActionList1.State: = asNormal;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top