AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Umsetzung einer Art von EIngabeaufforderung
Thema durchsuchen
Ansicht
Themen-Optionen

Umsetzung einer Art von EIngabeaufforderung

Ein Thema von Nightfighter88 · begonnen am 24. Dez 2007 · letzter Beitrag vom 24. Dez 2007
Antwort Antwort
Nightfighter88

Registriert seit: 24. Dez 2007
Ort: Dinslaken
2 Beiträge
 
#1

Umsetzung einer Art von EIngabeaufforderung

  Alt 24. Dez 2007, 12:14
Hallo,
erst einmal Frohe Weihnachten.

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?

http://www.nightf.plane.hl-users.com/gitarrenproggi.jpg

Gruß Basti
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Umsetzung einer Art von EIngabeaufforderung

  Alt 24. Dez 2007, 12:23
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Nightfighter88

Registriert seit: 24. Dez 2007
Ort: Dinslaken
2 Beiträge
 
#3

Re: Umsetzung einer Art von EIngabeaufforderung

  Alt 24. Dez 2007, 12:26
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
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Umsetzung einer Art von EIngabeaufforderung

  Alt 24. Dez 2007, 12:30
Hi,

hier gehts doch nicht um Umgehen von ganz normalen Programmstrukturen
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Umsetzung einer Art von EIngabeaufforderung

  Alt 24. Dez 2007, 12:42
Hi und erstmal frohe Weihnachten, sowie Herzlich Willkommen in der 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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