Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Buttons "synchronisieren" (https://www.delphipraxis.net/8502-buttons-synchronisieren.html)

Gereon 6. Sep 2003 10:18


Buttons "synchronisieren"
 
Hallo Experten,

ich möchte in einem Programm verhindern, dass die ClickProcedure eines Buttons aufgerufen wird, während die eines anderen noch abgearbeitet wird.

Ich vermute, dass das Problem gar nicht auftreten würde, wenn ich nicht in jeder dieser Prozeduren eine Warteschleife hätte (die Application.Processmesages enthält).

Meine eigene Lösung sieht so aus: Ich führe eine Synchronisationsvariable ein (ActionAbgeschlossen : boolean) und ergänze jeweils in ....ButtonxyzClick....

Delphi-Quellcode:
 if ActionAbgeschlossen then begin
    ActionAbgeschlossen:=false;

      { hier kommt der eigentlich Code der Procedure }

    ActionAbgeschlossen:=true;
  end
Das klappt auch. Ich frage mich nur, ob sowas nicht eleganter mit Delphi-Bordmitteln funktioniert. Der Code wird dadurch ja nicht kürzer oder übersichtlicher, dass ich sowas in jede ButtonClick-Procedure einfüge ...

Für Tipps dankbar.
Gereon

axelf98 6. Sep 2003 11:04

Re: Buttons "synchronisieren"
 
Kann man nicht einfach die Knöpfe, die nicht benutzt werden sollen, auf enabled := false setzen? Wenn die Prozedur fertig ist, werden sie wieder aktiviert...

Gereon 6. Sep 2003 12:55

Re: Buttons "synchronisieren"
 
Hallo,

die Buttons auszuschalten erscheint mir kaum eleganter, zumal man dann ja pro Button individuell die jeweils anderen Buttons ausschalten muss. Mir wäre eher daran gelegen Application.Processmessages dazu zu kriegen nur auf einen bestimmten Button (ein Weiter-Button für die Pause) zu reagieren und den Rest zu ignorieren.
Vielleicht kann man auch was mit Threads machen. Da kenne ich mich aber nicht aus und die Frage ist, ob das dann nicht noch komplizierter wird ...

Gereon

Christian Seehase 6. Sep 2003 13:02

Re: Buttons "synchronisieren"
 
Moin Gereon,

also ich für meinen Teil finde Programme nicht so schön, bei denen man Funktionen anwählen kann, die im jeweiligen Moment nicht funktionieren.
So gesehen lasse ich Menüpunkte, Button o.ä. gar nicht erst zu die man gerade nicht verwenden kann.

Einen Button klickbar darzustellen, der nicht benutzt werden kann halte ich also für ziemlich sinnlos.

Wenn Du es aber trotzdem so haben willst, kannst Du, statt den Button zu disabeln auch die jeweilige OnClick Routine abklemmen.
Dazu brauchst Du nur eine Variable vom Typ TNotifyEvent, der die OnClick Routine zugewiesen wird. Dann wird OnClick des zu deaktivierenden Button auf nil gesetzt. Ist die Routine abgelaufen, wird dann der Variableninhalt wieder OnClick des Buttons zugewiesen.
Und nicht vergessen das ganze in einem try/finally Block unterzubringen, damit die OnClick Routine auch garantiert wieder zugewiesen wird.

Gereon 7. Sep 2003 15:30

Re: Buttons "synchronisieren"
 
Hi,
ok, ich gebe mich geschlagen ... äh ... zeige mich einsichtig. Ich werde die Buttons disablen.

Gereon
[WarumEinfachWennsAuchKompliziertGeht ...]

Christian Seehase 7. Sep 2003 16:04

Re: Buttons "synchronisieren"
 
Moin Gereon,

Zitat:

Zitat von Gereon
WarumEinfachWennsAuchKompliziertGeht

ich finde, dass man da unterscheiden muss für wen es einfach, und für wen es kompliziert ist.
Wenn es sich der Entwickler einfach macht, wird's i.d.R. für den Anwender kompliziert und umgekehrt. ;-)

Wer hat Vorrang? ;-)

Sharky 7. Sep 2003 17:14

Re: Buttons "synchronisieren"
 
Zitat:

Zitat von Gereon
....[WarumEinfachWennsAuchKompliziertGeht ...]

Kompliziert muss es ja nicht sein.

Schreibe dir zwei Proceduren.

Die erste Disabled alle Button und die zweite Enables sie.
Jetzt einfach in der ersten und letzten Zeile deiner Button-OnClicks diese einfügen -> Fertig.

Ausserdem würde ich den Cursor noch anpassen. Dann weiss der Anwender das dein Programm etwas arbeitet und nicht einfach alles Disabled hat.

Gereon 7. Sep 2003 19:01

Re: Buttons "synchronisieren"
 
Die 2 Prozeduren hab ich schon geschrieben. Die Bemerkung war mehr darauf gemünzt, dass ich nicht gleich die Buttons disabled habe. Das mit dem Cursor ist noch ein brauchbare Hinweis.

Danke,
Gereon


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr.

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