AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

frage zu while schleife

Ein Thema von midnight Ghost · begonnen am 26. Nov 2006 · letzter Beitrag vom 26. Nov 2006
Antwort Antwort
midnight Ghost

Registriert seit: 26. Nov 2006
Ort: Coswig
2 Beiträge
 
#1

frage zu while schleife

  Alt 26. Nov 2006, 12:58
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:
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.
Ich hoffe ihr könnt mir weiterhelfen, Danke.
Angehängte Dateien
Dateityp: dpr pfisch_144.dpr (203 Bytes, 0x aufgerufen)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: frage zu while schleife

  Alt 26. Nov 2006, 13:25
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...
  Mit Zitat antworten Zitat
midnight Ghost

Registriert seit: 26. Nov 2006
Ort: Coswig
2 Beiträge
 
#3

Re: frage zu while schleife

  Alt 26. Nov 2006, 13:50
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.
  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 11:36 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