Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   User klicken unterbinden während Querry läuft (https://www.delphipraxis.net/156638-user-klicken-unterbinden-waehrend-querry-laeuft.html)

Jumpy 9. Dez 2010 11:56

User klicken unterbinden während Querry läuft
 
Hallo zusammen,

ich habe ein Form wo in einem Memofeld ein SQL-Statement geschrieben werden kann, und das dann auf Knopfdruck ausgeführt wird indem es an eine TADOQuerry übergeben wird. Die Daten werden dann in einem DBGrid angezeigt. Funktioniert alles soweit ganz gut.

Es gibt aber Selects, die ganz schön lange laufen, unter Umständen Minuten. Ich möchte verhindern, dass der User in der Zeit wild auf dem Form rumklickt.

Z.Zt. ist es so, dass der User auf irgendwelche Buttons klicken kann, aber nichts passiert, während die Querry läuft. Aber danach werden alle diese Klicks mit Verspätung ausgeführt. Das möchte ich aber so nicht. Es soll auf keinen Klick reagiert werden, der geschieht, während die Querry läuft.

Ich hab schon versucht die ActionList auf asSuspended zu setzen und später dann auf asNormal zurück aber das Hilft nicht. Vllt. hab ich es aber auch an falscher Stelle getan?

Quelle ist die TADOQuerry:
Code:
Quelle.SQL.Clear;
Quelle.SQL.Text:= Memo1.Lines.Text;
  try
    ActionList1.State:= asSuspendedEnabled;
    Quelle.Open;
    Application.ProcessMessages;
    ActionList1.State:= asNormal;
Hat wer eine Idee, warum das nicht klappt?

Danke,
Jumpy

gsh 9. Dez 2010 12:03

AW: User klicken unterbinden während Querry läuft
 
Form1.Enabled := false;
und danach wieder auf true

GHorn 9. Dez 2010 12:39

AW: User klicken unterbinden während Querry läuft
 
... und dazu dann noch den Cursor auf crSQLWait oder crHourGlass setzen und anschließend wieder zurück.
Dann sieht der Anwender gleich, dass er warten soll.

Luckie 9. Dez 2010 12:57

AW: User klicken unterbinden während Querry läuft
 
Ich würde nicht das ganze Form deakivieren, sondern nur die Schaltfläche.

Jumpy 9. Dez 2010 13:07

AW: User klicken unterbinden während Querry läuft
 
Danke erstmal. Das Problem ist halt, dass es massig andere Buttons auf dem Form gibt, und ich nicht 20 mal ButtonXY.Enabled im Code haben will. Daher mein versuch über die ActionList. Versuch jetzt mal den Vorschlag mit dem Form.Enabled.

Jumpy

Luckie 9. Dez 2010 13:13

AW: User klicken unterbinden während Querry läuft
 
Das dürfte aber dazu führen, dass die Form nicht mehr reagiert und der Benutzer denkt das Programm wäre abgestürzt.

Jumpy 9. Dez 2010 13:30

AW: User klicken unterbinden während Querry läuft
 
Nee das hat schon gepasst, da ich hinterher ja Enabled wieder auf true setze. Aber es hat nix gebracht. Wie zuvor kann man wild auf Buttons klicken, ohne das zunächst was passiert, aber wenn die Querry dann fertig geöffnet ist und ein Ergebnis zurückgebracht hat, passiert alles, was nach drücken der Buttons geschehen sollte.

Was den Eindruck des Absturzes angeht, so ist das ja genrell ein Problem, da ja wie geschildert nix passiert, während die Querry läuft und jeder Knopfdruck scheinbar ignoriert wird, so dass ein User denken könnte, das Prog. wäre abgestürzt. Aber damit muss man bei langen Abfragen halt leben. Was halt nur stört ist, das evtl. Buttonklicks während der "Todzeit" des Progs trotzdem irgendwie registriert und dann anschließend ausgeführt werden.

Weitere Ideen gerne willkommen. Vllt. ist ja wirklich der Zeitpunkt bzw. das Ereignis wichtig, bei dem alles wieder aktiviert wird.

Jumpy

DeddyH 9. Dez 2010 13:35

AW: User klicken unterbinden während Querry läuft
 
Erst disablen, dann Abfrage ausführen, dann wieder enablen. Sonst laufen die Clicks und sonstigen Aktionen in der Botschaftswarteschlange auf.

Luckie 9. Dez 2010 13:36

AW: User klicken unterbinden während Querry läuft
 
Und so lange Operationen verlagert man üblicherweise in einen Thread.

RWarnecke 9. Dez 2010 13:39

AW: User klicken unterbinden während Querry läuft
 
Du kannst auch die Buttons über eine Schleife mit FindComponents abfragen und entsprechend das Enabled auf true oder false setzen.

Edit:
Oder im OnMouseClick - Event die Maustasten abfragen, wenn die Eigenschaft Active von der Query auf True ist, die Mausklicks ins leere laufen lassen. Wenn Active gleich False ist, dann die Mausklicks ausführen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz