Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit Quizprogramm (https://www.delphipraxis.net/108931-probleme-mit-quizprogramm.html)

Fantasy 21. Feb 2008 11:29


Probleme mit Quizprogramm
 
Ich arbeite an einem Programm, welches dem User eine Frage stellt und dann 4 Antwortmöglichkeiten bietet.
Dabei habe ich vor, viele verschiedene Frage zu stellen, aber dabei muss ich viele Buttons verwenden und die Fragen kommen in einer festgelegte Reihenfolge (siehe Quelltext).

Gibt es einen Möglichkeit, weniger Buttons zu verwenden, weil wenn z.B. ich 50 Fragen stelle, muss ich auch etwa 50 Buttons verwenden.

Ich will aber, dass die Fragen zufällig auftretten und die beantworteten Fragen sollen nicht wieder erscheinen.

Außerdem sollten Fragen in einer bestimmten Zeit beantwortet werden, wenn nicht, dann gilt das als falsch und die nächste Frage soll kommen.

Ich weiß aber leider nicht, wie ich das hinbekomme. :gruebel:
Ich würde mich freuen, wenn ihr mir so schnell wie möglich helfen könntet.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject); // Programm startet
begin
panel1.Caption:='Wo liegt Deutschland?';  // Erste Frage
Radiobutton1.Caption:='Asien';
Radiobutton2.Caption:='Europa';
Radiobutton3.Caption:='Afrika';
Radiobutton4.Caption:='Nordamerika';
button2.Visible:=false;
button3.Visible:=false;
end;

procedure TForm1.Button1Click(Sender: TObject); //Nutzung 1. Button
begin
if Radiobutton2.Checked = true then showmessage('richtig')
else showmessage('falsch');
panel1.Caption:='Wo liegt Kongo?';          // 2. Frage
Radiobutton1.Caption:='Australia';
Radiobutton2.Caption:='Europa';
Radiobutton3.Caption:='Afrika';
Radiobutton4.Caption:='Nordamerika';
button2.Visible:=true;                    
end;

procedure TForm1.Button2Click(Sender: TObject);  // Nutzung 2. Button
begin
if Radiobutton3.Checked = true then showmessage('richtig')
else showmessage('falsch');
panel1.Caption:='Wo liegt Rom ?';          // 3. Frage
Radiobutton1.Caption:='Italien';
Radiobutton2.Caption:='Spanien';
Radiobutton3.Caption:='Mexiko';
Radiobutton4.Caption:='Russland';
button3.Visible:=true;                    
end;

procedure TForm1.Button3Click(Sender: TObject); // Nutzung 3. Button
begin
if Radiobutton1.Checked = true then showmessage('richtig')
else showmessage('falsch');
end;

end.

Luckie 21. Feb 2008 11:37

Re: Some questions
 
Bitte gibt deinem Thread eine sinnvolle Überschrift, die etwas über das problem aussagt. Das fällt leichter, wenn man nur eine bzw. nur thematlich zusammenhängende Frage in einem Thread stellt. Du kannst den Titel ändern, in dem du dein erstes Posting editierst.

Matze 21. Feb 2008 11:46

Re: Some questions
 
Hallo,

du kannst dir beispielsweise eine Funktion schreiben, deren Deklaration folgendermaßen aussieht. Diese Funktion vergleicht dann die Parameter mit den angegebenen in der XML-Datei (oder wo die Daten herkommen).

Delphi-Quellcode:
function IsCorrectAnswer(QuestionID: Integer; AnswerID: Integer): Boolean;
QuestionID ist die ID deiner Frage und AnswerID die deiner Antwort (1-4). Für letztere könntest du die Tag-Eigenschaft der Buttons nutzen.

Grüße

Nuclear-Ping 21. Feb 2008 11:50

Re: Some questions
 
Zitat:

Ich will aber, dass die Fragen zufällig auftretten und die beantworteten Fragen sollen nicht wieder erscheinen.
Dazu brauchst du eine Liste, die alle Fragen beinhaltet und jeder Eintrag ein entsprechendes Flag hat, der sagt, ob sie schon erschienen ist oder nicht.
Zum Bleistift:
Delphi-Quellcode:
type
  TQuestion = record
                Id: Integer;           // << Kann nicht schaden, 'ne Id zu haben
                Question: String;      // << Die Frage
                Answers: TStringList;  // << Musst du jedesmal per Answers:= TStringList.Create instanzieren!
                CorrectAnswer: Integer; // << Musst du vorgeben
                AlreadyAsked: Boolean; // << TRUE, wenn schon vorgekommen, FALSE wenn nicht
              end;
  PQuestion = ^TQuestion;

var
  AvailableQuestions: TList;
  Question: PQuestions;
  a: Integer;

begin
  AvailableQuestions := TList.Create;
  try
    New (Question);
    with Question^ do
      begin
        Id := 1; // nächste 2, 3, ... usw
        Question := 'Wo liegt Deutschland?';
        Answers := TStringList.Create;
        Answers.Add ('Asien');
        Answers.Add ('Europa');
        // ...
        CorrectAnswer := 1; // von 0 beginnend
        AlreadyAsked := FALSE;
      end;
    AvailableQuestions.Add (Question);

    New (Question);
    with Question^ do
      begin
        Id := 2; // nächste 3, 4, ... usw
        Question := 'Wie spät ist es?';
        Answers := TStringList.Create;
        Answers.Add ('Fünf vor um');
        Answers.Add ('Immer jetzt');
        // ...
        CorrectAnswer := 1; // von 0 beginnend
        AlreadyAsked := FALSE;
      end;
    AvailableQuestions.Add (Question);

    // ...
end;
Das könnte der Pool deiner verfügbaren Fragen sein. Du weißt die Anzahl der Fragen (AvailableQuestions.Count) und kannst darauf ein Random ausführen, um aus diesem Bereich eine zufällige zu ziehen. Das kannst du auch in eine Schleife packen und mit AlreadyAsked prüfen, ob die Frage schon vorgekommen ist und wenn ja, weitermachen.
Delphi-Quellcode:
var
  RndIdx: Integer;
  Question: PQuestion;
begin
  Randomize;

  while TRUE do
    begin
      RndIdx := Random (AvailableQuestions.Count);
      Question := PQuestion (AvailableQuestions[RndIdx]);
      if Questions.AlreadyAsked then
        Continue
      else Break;
    end;
end;
Und am Ende nicht vergessen, den ganzen Spaß wieder freizugeben! ;)
Delphi-Quellcode:
var
  Idx: Integer;
  Question: PQuestion;
begin
  for Idx := AvailableQuestions.Count - 1 downto 0
    begin
      Question := PQuestion (AvailableQuestions[Idx]);
      FreeAndNil (Question.Answers);
      Dispose (Question);
    end;
  AvailableQuestions.Clear;
  FreeAndNil (AvailableQuestions);
end;

stahli 21. Feb 2008 11:58

Re: Probleme mit Quizprogramm
 
Hi Fantasy,

es ist eigentlich schon alles gesgt, aber Du kannst mal noch hier schauen...

stahli

Fantasy 24. Mär 2008 13:16

Re: Probleme mit Quizprogramm
 
Vielen Dank für eure Antwort.
Ich bin leider ein Anfänger. :(
Deshalb weiß ich nicht wie man die Fragen und Antworten sichtbar machen kann?
Also welchen Tools muss ich auf der Formular hinführen und wie kann ich sie benutzen?

Zitat:

Für letztere könntest du die Tag-Eigenschaft der Buttons nutzen.
Ich habe diese Tag-Eigenschaft der Buttons gefunden, aber weiß nicht wie man sie benutzt. Könnt ihr das erklären?


@stahli
Ich habe das Thema gelesen, leider habe ich keine Erfahrung mit der Datenbank...

mkinzler 24. Mär 2008 13:18

Re: Probleme mit Quizprogramm
 
In ihr kannst du einen Integer ablegen und später Auswerten.

stahli 24. Mär 2008 13:25

Re: Probleme mit Quizprogramm
 
Mit einer Datenbank müsstest Du Dich schon mal beschäftigen...
Auf die Dauer geht es ohne kaum. Aber so schwierig ist das letztlich auch nicht.
Die Daten werden mehr oder weniger in Tabellen gespeichert und daraus wieder abgerufen.
Die BDE, Datenbankoberfläche und DBASE bieten sich dafür ganz gut an (je nachdem, welche Delphi-Version Du hast).

taaktaak 24. Mär 2008 13:34

Re: Probleme mit Quizprogramm
 
@stahli - sehe ich etwas anders! Als absoluter Anfänger sollte es erst einmal ohne Datenbank gehen. Ein "Anfängerprojekt", das eine Datenbank erfordert oder nahelegt, ist m.E. kein Anfängerprojekt mehr. Als Anfänger sollte man sich erst einmal um die vielen anderen "Basics" bemühen und damit eine gewisse Vertrautheit erlangen. Danach ist immer noch Zeit sich mit Datenbanken zu beschäftigen

mkinzler 24. Mär 2008 13:39

Re: Probleme mit Quizprogramm
 
Und wenn schon DB, dann nicht die BDE


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Seite 1 von 2  1 2      

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