![]() |
Umsetzung einer Art von EIngabeaufforderung
Hallo,
erst einmal Frohe Weihnachten. :-D Nun zu meinem kleinen Problem: Ich bin derzeit dabei ein "Übungsprogramm" zum erlernen von Tönen auf der Gitarre zu schreiben. Der Aufbau des Programms: Hinter einer Paintbox liegt eine Abbildung eines Gitarrenhalses. Es ist ein Button vorhanden der einen "Zufallston" generiert und dann z.B. "Wo liegt der Ton G auf der E-Saite". Nun soll der User auf das Griffbrett klicken (Paintbox). Das Problem dabei: Ich bin in der Button.Click Prozedur. Wie bekomme ich es hin dass gewartet wird bis der Anwender auf die Paintbox klickt und die Koordinaten darauf wieder an die Button.Click Prozedur weitergegeben werden? Ist diese Formulierung verständlich? ![]() Gruß Basti |
Re: Umsetzung einer Art von EIngabeaufforderung
Hi,
wieso soll gewartet werden ? Der User klickt auf die Paintbox und das gibt dann wieder ein OnClick Ereignis der Paintbox. Hier überprüftst Du dann ob es korrekt war. Dazu musst Du in der ButtonClick Prozedur natürlich deine Frage quasi zwischenspeichern z.B. in eine Member Variable deines Forms. Frohes Fest :-D |
Re: Umsetzung einer Art von EIngabeaufforderung
Hmmm ok. Die Idee ist gut. Hätte nur gedacht man könnte das mit dem Zwischenspeichern und global speichern umgehen. Aber gut dnan mach ichs so ;)
Vielen Dank Gruß basti |
Re: Umsetzung einer Art von EIngabeaufforderung
Hi,
hier gehts doch nicht um Umgehen von ganz normalen Programmstrukturen :wiejetzt: Dafür gibt es ja schliesslich die Variablen... Es sollte je keine globale Variable sein, sondern eine Member deiner Form. Ein Warten in einem ereignisgesteuerten System ist nicht gerade effizient. :( Gruss |
Re: Umsetzung einer Art von EIngabeaufforderung
Hi und erstmal frohe Weihnachten, sowie Herzlich Willkommen in der DP :dp:
Was Dein Problem angeht, so wurde hier ja schon der Vorschlag mit der globalen Variable gemacht. Ist in der Situation (imho) das einfachste und geeigneste Verfahren, also ruhig so machen! Aber trotzdem möchte ich kurz noch ergänzen, dass auch das Warten an sich möglich ist. Dazu kannst Du auf verschiedene Verfahren zurückgreifen. Das einfachste ist dabei, dass Du in einer Schleife wartest. Die Schleife darf dabei einfach erst verlassen werden, wenn ein bestimmtes Flag gesetzt wurde. Die Variable, die Du hier allerdings von der Paintbox zum OnClick des Button übertragen möchtest müsste auf jeden Fall global sein (also auch ein Flag), da die Signaturen bereits durch Delphi festgelegt sind. An sich hast Du beim Warten in einer Schleife noch das Problem, dass so eine Schleife immer mit 100% CPU-Last ausgeführt wird (die Schleife nimmt alles, was Dein Programm an Rechenzeitbekommt), entsprechend wird das ganze Programm etwas träge weiterlaufen (garantiert nicht erwünscht). Deshalb musst Du in der Schleife dafür sorgen, dass hier das Programm nicht blockiert. Die einfachste Variante stellt die Verwendung von Application.ProcessMessages dar, einfach in die Schleife rein und es wird bei jeder Iteration die Windows-Nachrichtenschleife abgearbeitet (das Fenster kann verschoben, andere Prozeduren gestartet werden). Aber auch hier verschwendet man einfach eine Menge Ressourcen, da man völlig unnötig pollt (also ständig schaut, ob sich der Zustand/das Flag geändert hat). Besser ist es, wenn Du hier Ereignisorientierter Arbeitest. Dazu kannst Du einen Prozess mittels MsgWaitForMultipleObjects schlafen legen. Die genaue Syntax kannst Du dem Windows-API entnehmen, sollte sich aber auch in der DP leicht finden lassen. An sich ist die Verwendung schon etwas komplizierter, aber auch nicht wirklich schwer. An sich erlaubt Dir die Funktion eben, dass Du einen Thread schlafen legst, bestimmte Ereignisse aber noch verarbeitet werden (den Thread wieder aufwecken). Insbesondere kannst Du eben die Interaktion durch den Benutzer (Maus- und Tasturereignisse) zulassen. Der Vorteil ist dabei, dass wirklich nur dann etwas getan wird, wenn etwas passiert. Ansonsten schläft der Thread und verbraucht somit auch keine Ressourcen (erlaubt dann auch einer CPU, dass die sich schlafen legt). Gruß Der Unwissende |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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