![]() |
frage zu while schleife
Liste der Anhänge anzeigen (Anzahl: 1)
Falls diese frage zu diesem Thema schon einmal gestellt wurde, dann tut es mir leid, aber die suchfunktion hat nicht das erhoffte gebracht und das ganze Forum zu durchforsten mit meinem Analog anschluss dauert entschieden zu lange.
Ich habe folgendes Problem: Ich will ein programm erstellen welches zufällig nacheinander 12 mal eine Frage auswählt und Stellt und das 5 mal. Dabei soll es auswerten ob die Antwort (aus 3 möglichen radio Buttons) richtig oder falsch ist. (nur einfachantworten möglich). Nachdem man die antwort zu der frage ausgewählt hat soll man auf start/weiter Button clicken und die nächste frage erscheint. Ob die Antwort Richtig oder Falsch war kann man danach in einer Auswertungs Tabelle welche aus 12 X 5 Textfeldern besteht ablesen. Ich bin jetzt bei dem schritt dem Programm klar zu machen das es die fragen zuällig auswählen soll und das solange bis die Textfelder gefüllt sind und nicht mehr leer. Zum besseren verständniss hier der Quellcode der Unit ( nicht windern ich habe den ganzen spass hier erst mal nur mit 2 Fragen getestet:
Delphi-Quellcode:
Ich hoffe ihr könnt mir weiterhelfen, Danke.
unit Ufisch;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TFRMfischer = class(TForm) Panel1: TPanel; BSFLantwort: TButton; BSFlneu: TButton; BSFLende: TButton; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; fallg1: TEdit; fallg2: TEdit; fallg3: TEdit; fallg4: TEdit; fallg5: TEdit; fallg6: TEdit; fallg7: TEdit; fallg8: TEdit; fallg9: TEdit; fallg10: TEdit; fallg11: TEdit; fallg12: TEdit; spez1: TEdit; spez2: TEdit; spez3: TEdit; spez4: TEdit; spez5: TEdit; spez6: TEdit; spez7: TEdit; spez8: TEdit; spez9: TEdit; spez10: TEdit; spez11: TEdit; spez12: TEdit; gew1: TEdit; gew2: TEdit; gew3: TEdit; gew4: TEdit; gew5: TEdit; gew6: TEdit; gew7: TEdit; gew8: TEdit; gew9: TEdit; gew10: TEdit; gew11: TEdit; gew12: TEdit; ges1: TEdit; ges2: TEdit; ges3: TEdit; ges4: TEdit; ges5: TEdit; ges6: TEdit; ges7: TEdit; ges8: TEdit; ges9: TEdit; ges10: TEdit; ges11: TEdit; ges12: TEdit; ger1: TEdit; ger2: TEdit; ger3: TEdit; ger4: TEdit; ger5: TEdit; ger6: TEdit; ger7: TEdit; ger8: TEdit; ger9: TEdit; ger10: TEdit; ger11: TEdit; ger12: TEdit; BSFLstart: TButton; auswahla: TRadioButton; auswahlb: TRadioButton; auswahlc: TRadioButton; fragen: TPanel; procedure BSFLendeClick(Sender: TObject); procedure BSFLstartClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FRMfischer: TFRMfischer; implementation {$R *.dfm} procedure TFRMfischer.BSFLendeClick(Sender: TObject); begin close; end; procedure TFRMfischer.BSFLstartClick(Sender: TObject); var Frage1, Frage2, F1, F2 : string; zu:double; procedure Frage1allg; begin fragen.caption := 'TestF1'; auswahla.caption := 'TestantwortF1.1'; auswahlb.Caption := 'TestantwortF1.2'; auswahlc.Caption := 'TestantwortF1.3'; if auswahla.Checked = True then fallg1.text := 'Richtig!' else fallg1.text := 'Falsch!'; end; procedure Frage2allg; begin fragen.Caption := 'testF2'; auswahla.Caption := 'testantwort2.1'; auswahlb.Caption := 'teatantwort2.2'; auswahlc.Caption := 'sdögh2.3'; if auswahlc.checked =True then fallg2.Text := 'richtig' else fallg2.Text := 'falsch'; end; begin while fallg1.text = '' and fallg2.text = '' do randomize; zu := random(2); if zu =1 then Frage1allg; if zu =2 then Frage2allg; end; end. |
Re: frage zu while schleife
Hi!
Ich sehe hier mehrere Probleme in dem Quellcode. Ich gehe sie mal der Reihe nach durch: 1. Deine Unterproceduren Frage1allg und Frage2allg weisen die Frage dem Label zu und fragen sofort ab, ob die richtige Antwort getroffen wurde. Wo soll denn dort der User reagieren können? Er müsste innerhalb von Millisekunden reagieren und die richtige Entscheidung treffen. Mit anderen Worten: Anzeigen der Frage und Antwortmöglichkeiten muss zeitlich bzw. event-basierend von einander getrennt werden. 2. While verhält sich wie IF und führt standardmässig nur die nachfolgende Anweisung aus, ausser es werden mehrere Anweisungen in einem Begin/End Block zusammen gefasst. Daher würde deine While Schleife nur ständig Randomize aufrufen. 3. Randomize braucht und sollte nur einmalig aufgerufen werden. Rufe diese Funktion z.B. im OnCreate der Form auf und dann reicht das vollkommen. 4. Die VCL ist event-driven, d.h. du bekommst Bescheid, wenn etwas zu tun ist. Das bedeutet: Wenn der Benutzer den "WEITER" Button drückt, dann erledige die notwendigen Aktionen im OnClick des Buttons (z.B. Überprüfung der Antworten auf Richtigkeit, etc). Wenn in einer Behandlungsroutine bist, wie z.B. das OnClick des BSFLstart, dann ist der Rechner damit beschäftigt und kann keine anderen Aktionen aufnehmen bzw. verarbeiten, da die VCL darauf wartet, dass du mit der Behandlungsroutine fertig wirst. Mit anderen Worten: innerhalb dieser BSFLstartClick() Methode kannst du so lange Schleifen laufen wie du willst, aber eine CheckBox oder RadioBox wirst du als Nutzer nicht setzen können. Somit kann sich das Edit Feld schlecht innerhalb der While Bedingung ändern. Du musst hier umdenken und die Aktionen machen, wenn ein entsprechendes Ereignis eingetreten ist. Z.B. das Anzeigen des Formulars (OnShow), ein Click auf einen Button, etc. 5. Auch wenn zu 4. nun andere kommen und Lösungen mit Application.ProcessMessages anbieten, so ist dies in diesem Falle überhaupt nicht nötig und kann komplett ohne solche Verbiegungen gelöst werden. 6. Mit dem Projektfile können wir nichts anfangen, wenn das Formular und die Unit fehlen... |
Re: frage zu while schleife
Danke erst mal für deine Ausführliche Antworten
zu 1. - 5. )Auch wenn ich jetzt weis wo die fehler liegen, kann ich das allerdings nicht in den Quellcode umsetzten, es wäre also nett wenn ich ein Beispiel hätte. zu 6. ich dachte es wäre hilfreich zu dem Unit Text, aber anscheinend kann ich das auch weglassen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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