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:
actTest
. actTest
zu. Schreiben Sie im OnUpdate
-Ereignis der Aktion actTest
:
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?
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.
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.
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:
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
:
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:
Tags und Links delphi delphi-xe7 tlistview taction