![]() |
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:
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 ...
if ActionAbgeschlossen then begin
ActionAbgeschlossen:=false; { hier kommt der eigentlich Code der Procedure } ActionAbgeschlossen:=true; end Für Tipps dankbar. Gereon |
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...
|
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 |
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. |
Re: Buttons "synchronisieren"
Hi,
ok, ich gebe mich geschlagen ... äh ... zeige mich einsichtig. Ich werde die Buttons disablen. Gereon [WarumEinfachWennsAuchKompliziertGeht ...] |
Re: Buttons "synchronisieren"
Moin Gereon,
Zitat:
Wenn es sich der Entwickler einfach macht, wird's i.d.R. für den Anwender kompliziert und umgekehrt. ;-) Wer hat Vorrang? ;-) |
Re: Buttons "synchronisieren"
Zitat:
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. |
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 12:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz