Verschlechtert das TAction.OnUpdate-Ereignis die Leistung?

8

In Delphi XE7 verwende ich diesen Trick, um eine Symbolleistenschaltfläche ("ListView-Element bearbeiten") automatisch zu aktivieren oder zu deaktivieren, je nachdem, ob ein Element in der ListView ausgewählt ist oder nicht, um zu verhindern, dass der Benutzer auf die Schaltfläche klickt ist kein ListView-Objekt ausgewählt:

  • Lege eine TActionList auf ein VCL-Formular.
  • Erstellen Sie in der ActionList eine Aktion actTest .
  • Setzen Sie eine TButton auf das Formular.
  • Ordnen Sie der Schaltfläche die Aktion actTest zu.
  • Setzen Sie eine TListView auf das Formular.
  • Erstellen Sie in der ListView zwei Elemente.
  • Schreiben Sie im OnUpdate -Ereignis der Aktion actTest :

    %Vor%

Nun können Sie sehen, dass die Schaltfläche abhängig davon aktiviert oder deaktiviert wird, ob ein Element in der ListView ausgewählt ist oder nicht, unabhängig davon, ob Sie Elemente mit der Maus oder mit der Tastatur oder programmgesteuert auswählen / abwählen.

Allerdings kann ich im CodeSite Live Viewer sehen, dass das actTestUpdate -Ereignis kontinuierlich und sehr oft ausgelöst wird, sodass die Anweisung actTest.Enabled := ListView1.SelCount > 0; SEHR OFTEN ausgeführt wird.

Meine Frage ist also: Verschlechtert das die Performance? Wenn ja, gibt es einen weiteren Trick, um den obigen Zweck zu erreichen?

    
user1580348 01.03.2015, 10:57
quelle

3 Antworten

6

Wenn Sie viele Aktionen haben (oder planen), sollten Sie Application.ActionUpdateDelay z. 50 Millisekunden. Dies kann die Leistung spürbar verbessern.

Auch, wenn Sie viele Aktionen haben, würde ich vorschlagen, dass Sie versuchen, TForm.UpdateActions zu verwenden, anstatt TAction.OnUpdate für jede Aktion zu definieren. Es macht den Code lesbarer.

    
pyxidata 01.03.2015 21:18
quelle
3

Allgemein

Ja, ein OnUpdate -Ereignishandler braucht Zeit, genau wie jede andere Routine tut es. Mehrere Handler benötigen ein Vielfaches dieser Zeit. Das Gros dieses Codes wird Bedingungen auswerten, die nichts zu tun haben. In diesem Sinne könnten Sie daraus schließen, dass dieser Aktualisierungsmechanismus die Leistung beeinträchtigt. Besonders in Anbetracht dieser Update-Ereignisse treten häufig auf:

  

Tritt auf, wenn die Anwendung inaktiv ist oder wenn die Aktionsliste aktualisiert wird.

Das könnte ein Grund sein, seine Verwendung zu schonen. Aber Sie sollten erkennen, dass die Auswertung eines einzelnen Ausdrucks meist nicht so lange dauert. Beachten Sie außerdem, dass Ihre Anwendung unabhängig von den Aktualisierungsaktionen bei jeder einzelnen Mausbewegung (viel mehr schwere) Berechnungen und Operationen ausführt.

Wenn Sie die Codedauer in Aktion halten, aktualisieren Sie Ereignisse auf ein Minimum, z. keine Passwortüberprüfung über eine Datenbankverbindung, dann wird die Leistung normal erscheinen. Wenn Sie langwierige Vorgänge zum Aktualisieren von Aktionen haben, greifen Sie in diesen speziellen Situationen auf manuelle Aktualisierungen zurück.

Beachten Sie, dass die Leistung leicht gesteigert werden kann, wenn Sie nicht die einzelnen OnUpdate -Ereignisse der Aktionen verwenden, sondern die OnUpdate Ereignis der ActionList stattdessen, die einen Handled -Parameter hat, um die weitere Verarbeitung abzubrechen, mit dem zusätzlichen Vorteil der Zentralisierung und Kategorisierung.

Speziell

Ihr ListView1.SelCount sendet eine WinAPI-Nachricht an das Steuerelement, um die Auswahlanzahl abzurufen. Das ist eine winzige Operation, und ich würde es nicht für nötig halten.

Alternativ können Sie die Aktion im OnSelectItem der ListView aktualisieren Veranstaltung. Dieses Ereignis fängt alle Selektionsänderungen aufgrund von Maus- und Tastaturinteraktionen ein, sowie das Setzen der einzelnen Elemente ' Selected Eigenschaft:

%Vor%

Die ListView und die VCL bieten jedoch nichts, was nur zwischen SelCount = 0 und SelCount > 0 angezeigt werden kann. Sie werden diese Codezeile daher sowieso mehr als unbedingt nötig auswerten.

Wenn MultiSelect wahr ist, können Sie die Selektionsänderungen auch selbst zählen, um den Aufruf von SelCount :

zu vermeiden %Vor%

Oder testen Sie, ob das ausgewählte Element gleich null ist:

%Vor%

Aber andererseits gibt es wirklich keinen Grund, das OnUpdate -Ereignis nicht zu verwenden:

%Vor%     
NGLN 01.03.2015 12:58
quelle
0

Die Action-Update-Ereignisse werden (meistens) in Application.Idle ausgeführt. Solange Sie keine zeitkritischen Dinge innerhalb der Event-Handler tun, sollte es keine merkliche Leistungseinbuße geben.

    
Uwe Raabe 01.03.2015 11:17
quelle