Reaktion auf Click() für eine Form unterbinden.
-
Hallo liebe Kollegen,
ich habe wieder mal ein Problem!
Ich habe in meine Sicherungsprogramm einen Info Formular, der während der Sicherung angezeigt wird. Wenn man während der Sicherung in das Formular mit Cursor reingeht wird der Cursor als Sanduhr angezeigt, was fällig in Ordnung ist, aber wenn man auf das Formular klickt wird eine Message von Windows an das Fenster gesendet "Not responding", was auch logisch ist obwohl die Sicherung wird dadurch nie unterbrochen.
Ich möchte gern die Sendung diese Message unterbinden, genau gesagt die Reaktion auf das Klick Event für dies Formular ausschalten.Wie kann ich das machen?
Danke im voraus!
-
aesse schrieb:
Hallo liebe Kollegen,
... Ich möchte gern [...] die Reaktion auf das Klick Event für dies Formular ausschalten.Wie kann ich das machen? ...
Hallo,
ganz einfach indem du die OnClick-Methode aushängst, wenn du deinen Vorgang startest:
FormXYZ->OnClick= NULL;
Wenn der Vorgang beendet ist, ordnest du die Ereignis-Methode wieder dem Form zu:
FormXYZ->OnClick= FormXYZClick;
fertich!
MfG
-
Kolumbus schrieb:
ganz einfach indem du die OnClick-Methode aushängst, wenn du deinen Vorgang startest:
FormXYZ->OnClick= NULL;
Wenn der Vorgang beendet ist, ordnest du die Ereignis-Methode wieder dem Form zu:
FormXYZ->OnClick= FormXYZClick;
Natürlich kommt das aber in ein try/__finally-Konstrukt, damit der Event-Handler nicht unbelegt bleibt, falls der Vorgang mit einer Exception abgebrochen wird
-
Natürlich!
-
Meiner Meinung nach wäre es sinnvoller, dafür zu sorgen, dass das Formular weiterhin die Botschaften verarbeitet...
Gruß
KK
-
Killer-Kobold schrieb:
Meiner Meinung nach wäre es sinnvoller, dafür zu sorgen, dass das Formular weiterhin die Botschaften verarbeitet...
Stimmt. Derartige Aufgaben gehöre eigentlich ohnehin in einen separaten Thread.
-
Killer-Kobold schrieb:
Meiner Meinung nach wäre es sinnvoller, dafür zu sorgen, dass das Formular weiterhin die Botschaften verarbeitet...
Prinzipiell ja. Es ist jedoch in einem gewissen Rahmen eine konzeptionelle Frage. Wenn im FormClick Verarbeitungen laufen, welche während der vom Threadsteller angesprochenen Sicherung sowieso nicht zur Verfügung stehen müssen, kann man die Methode doch auch einfach aushängen!?
Wie sagt ihr eigentlich zu dieser Variante:
FormXYZ->Enabled= false;
?
-
Danke für Eure Antworten.
Ich denke ich werde einiges ausprobieren.
Das Formular ist lediglich ein Info-Fenster mit einem Button "Siecherung abbrechen" und informiert dass die Sicherung noch läuft.Neue Thread ist etwas aufwendiger und vielleicht in diesem Fall nicht nötig oder doch?
-
Ich wünsche Euch allen schöne Ostern!
-
Ebenso, Danke
-
aesse schrieb:
Das Formular ist lediglich ein Info-Fenster mit einem Button "Siecherung abbrechen" und informiert dass die Sicherung noch läuft.
Neue Thread ist etwas aufwendiger und vielleicht in diesem Fall nicht nötig oder doch?
Doch. Gerade wenn du dem Benutzer die Möglichkeit geben willst, den Prozeß zu unterbrechen, müssen UI und Sicherung parallel ablaufen - wie soll das denn sonst funktionieren?
-
Hallo Audacia,
in der Verarbetingsschleife bei der Sicherung wird immer ein Wert der zuständigen Variabelen abgefragt, mit Click auf den Button "Sicherung abbrechen" wird der Wert auf "false" gesetz und die Sicherung somit unterbrochen. Es funktioniert soweit, nur bei der Sicherung von größeren Dateien kommt nach dem Click auf den Button oder bei der Verschiebung des Formulars zu etwas unangenehmen Verzögerungen.
-
aesse schrieb:
in der Verarbetingsschleife bei der Sicherung wird immer ein Wert der zuständigen Variabelen abgefragt, mit Click auf den Button "Sicherung abbrechen" wird der Wert auf "false" gesetz und die Sicherung somit unterbrochen.
Das ist schon richtig so. Es ändert aber nichts daran, daß der Sicherungsprozeß im UI-Thread nichts zu suchen hat.
aesse schrieb:
Es funktioniert soweit, nur bei der Sicherung von größeren Dateien kommt nach dem Click auf den Button oder bei der Verschiebung des Formulars zu etwas unangenehmen Verzögerungen.
Abgesehen davon, daß das äußerst unprofessionell wirkt, kann es dazu führen, daß der Benutzer deiner Anwendung, da diese nicht mehr auf Nachrichten reagiert, von Windows die Meldung "diese Anwendung reagiert nicht mehr" bekommt und versucht ist, sie zu terminieren.
Grundsätzlich gehört alles, was länger als eine halbe Sekunde verzögert, in einen separaten Thread.
-
Ich stimme den anderen zu, was einen separaten Thread angeht. Alternativ kannst du in deine Sicherungsroutine (in die Schleife) das Zeilchen
Application->ProcessMessages();
einfügen. So werden die Messages in der Warteschlange (falls vorhanden) bei jedem Durchlauf abgearbeitet, und es kommt nicht zu den ungewollten Verzögerungen.
Allerdings frag ich mich, wieso du anfangs die OnClick-Methode ausschalten wolltest, obwohl du sie ja eigentlich brauchst (Sicherung abbrechen).
-
WebFritzi schrieb:
Allerdings frag ich mich, wieso du anfangs die OnClick-Methode ausschalten wolltest, obwohl du sie ja eigentlich brauchst (Sicherung abbrechen).
Das habe ich auch nicht verstanden.
WebFritzi schrieb:
So werden die Messages in der Warteschlange (falls vorhanden) bei jedem Durchlauf abgearbeitet, und es kommt nicht zu den ungewollten Verzögerungen.
Höchstens etwas seltener. Siehe hier:
aesse schrieb:
Es funktioniert soweit, nur bei der Sicherung von größeren Dateien kommt nach dem Click auf den Button oder bei der Verschiebung des Formulars zu etwas unangenehmen Verzögerungen.
Während des Bearbeitens größerer Dateien wird er nicht Application->ProcessMessages() aufrufen können.
Im Übrigen ist Application->ProcessMessages() als Scheduling für arme Leute nur bedingt tauglich: es führt unnötige Abhängigkeiten ein (warum muß der Code, der die Sicherung durchführt, wissen, daß er in einer VCL-GUI-Anwendung ausgeführt wird?), die nicht nur die Portierung (Application->ProcessMessages() funktioniert nur in C++Builder-Anwendungen), sondern auch die Wartung und die Wiederverwendung des Codes erschwert (z.B. wäre es überflüssigerweise nötig, den Code zu ändern, wenn die Sicherung zusätzlich noch über ein Kommandozeilenprogramm durchgeführt werden können soll). Zudem wird man damit die Blockade des UI-Threads nicht beseitigen, sondern nur verringern können.
Deshalb: nimm einen separaten Thread. Alles andere ist hier unangemessen.
-
Danke,
Ihr habt mich überzeugt.
Ich werde mit dem Thread versuchen.Schöne Grüße!