Problem bei Quiz programmieren - RadioButton

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wahlberlinerin
Beiträge: 8
Registriert: Fr 19. Feb 2016, 13:40

Problem bei Quiz programmieren - RadioButton

Beitrag von wahlberlinerin »

Hallo Lazarusprogrammierer! :)

Ich programmiere für meinen Informatikkurs in der Schule ein Quiz, habe allerdings ein Problem mit der Beantwortung der Fragen.
Ich möchte gerne Radiobuttons nutzen.

Code: Alles auswählen

Label1.Caption:='Wie heißt der Palast der englischen'+sLineBreak+'Königsfamilie in London?';
    RadioButton1.Caption:='Hampton Court Palace';
    RadioButton2.Caption:='Tower of London';
    RadioButton3.Caption:='Buckingham Palace';
    RadioButton4.Caption:='Kensington Palace';
    if RadioButton3.Checked=true then smRichtig
    else smFalsch3;   


Das jedoch sorgt dafür, dass Lazarus direkt nach Erscheinen der Frage überprüft, ob ein Radiobutton gedrückt wurde, wo natürlich aber keiner gedrückt worden sein kann, da der Spieler dafür keine Zeit hatte. Sleep funktioniert ebenfalls nicht, da das zwar das Programm warten lässt, das Programm damit aber beschäftigt ist und dem Spieler nur Zeit gibt, die Frage zu lesen, bevor ihm gesagt wird, dass seine Antwort (da er ja nichts drücken konnte) falsch ist.

smRichtig und smFalsch sind ausgelagerte Prozeduren, die dafür sorgen, dass in einem Label angezeigt wird, ob die Antwort richtig oder falsch war.

Hat jemand eine Lösung? Das wäre mir eine sehr große Hilfe, danke! :)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Komoluna »

Erstmal Willkommen im Forum ;-)

Ich vermute mal, der Code, den du gepostet hast steht in FormCreate oder so?
An der Stelle macht es ja keinen Sinn abzufragen, welche Antwort der User ausgewählt hat.
Ich würde einen Button hinzufügen, der dann ausliest, welche Radiobutton ausgewählt ist.

Also einfach einen Button machen, und die letzten beiden Zeilen von deinem Code in das OnClick Event des Buttons auslagern.

Solltest du irgendwas nicht verstehen, oder noch weitere Fragen haben, frag einfach. Wir beißen nicht ;-)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

wahlberlinerin
Beiträge: 8
Registriert: Fr 19. Feb 2016, 13:40

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von wahlberlinerin »

Hallo :)

Erstmal Dankeschön für die Antwort. Ich habe zwar ein FormCreate in meinem Programm, das Stückchen ist aber bei einem Button.
Ich habe 6 Kategorien, von denen sich der Spieler eine aussucht und wenn man die eine Kategorie ausgewählt hat, wird per Random eine von 6 Fragen ausgewählt, wodurch dann die Labels angepasst werden und da hab ich ja auch festgelegt bei welchem Radiobutton richtig und bei welchen falsch kommt.

An einen Extrabutton hatte ich auch gedacht, habe aber dann das Problem, dass ich ihm dann ja pro Frage beibringen muss, welche Antwort richtig und welche falsch ist...

Wie sorge ich dann eigentlich dafür, dass, sobald "Nächste Frage" geklickt wird, nicht durch Random die gleiche Frage nochmal erscheint?

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Marsmännchen »

wahlberlinerin hat geschrieben:An einen Extrabutton hatte ich auch gedacht, habe aber dann das Problem, dass ich ihm dann ja pro Frage beibringen muss, welche Antwort richtig und welche falsch ist...


Hi,
ich bin auch nur Anfänger, aber ich könnte mir vorstellen, die jeweilige Frage nebst Antwortmöglichkeiten nebst Hinweis auf korrekte Antwort in einen Record zu packen. Dann alle Records in ein Array tun, welches ausgelesen wird um a) die Radios zu bestücken und b) dann auch die richtige Antwort zu kennen. In den Record kann man dann auch noch ein Boolean packen (zB namens 'istSchonGefragt') der deinem Prog sagt, ob die Frage schon verwendet wurde.
Man könnte die ganze Funktionalität für diese Fragerecords dann eigentlich auch schon an die Datenstruktur ranpappen, indem man daraus eine Klasse macht.

... sind nur Ideen :oops:

Liebe Grüße
Ich mag Pascal...

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Komoluna »

Alle Komponenten haben eine Eigenschaft namens "Tag" vom Typ PtrInt(eigentlich Integer). Damit kann man in jeder Komponente zusätzliche Daten speichern.
Wenn du die Texte zuweist, könntest du jedem Button den Tag 0 zuweisen. Nur dem mit der richtigen Antwort gibts du den Wert 1.
In deinem Button mit der Abfrage, fragst du einfach ab, ob der Radio Button, der den Tag 1 hat, ausgewählt ist.

Edit: Der Vorschlag von Marsmännchen ist auch gut. Ein bisschen schwerer zu implementieren, aber damit ist es einfacher mehr Fragen hinzuzufügen.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Marsmännchen »

Komoluna hat geschrieben:Edit: Der Vorschlag von Marsmännchen ist auch gut. Ein bisschen schwerer zu implementieren, aber damit ist es einfacher mehr Fragen hinzuzufügen

Puh, wenigstens keinen Dummfug erzählt :mrgreen:
Ich mag Pascal...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Mathias »

Ich würde das Ganze auch mit einer Array und Record lösen.
Das würde dann etwa so aussehen:

Code: Alles auswählen

type
  TFrage = record
    Frage: string;
    Antworten: array[0..3] of string;
    richtige_Antwort: byte;
    schonGefragt: boolean;
  end;
 
  TFragen = array of TFrage;
 
var
  Frage: TFragen;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Add('Wie heisst die Hauptstadt der Schweiz',
    'Zürich',
    'Bern',
    'Luzern',
    'Graubünden', 1);
  Add('Wie heisst die Insel mit der Kirche auf dem Zürichsee',
    'Lützelau',
    'Elba',
    'Insel Rapperswil',
    'Ufenau', 3);
end;
 
procedure TForm1.Add(F, a0, a1, a2, a3: string; ra: byte);
var
  l: integer;
begin
  l := Length(Frage);
  SetLength(Frage, l + 1);
  with Frage[l] do begin
    Frage := F;
    Antworten[0] := a0;
    Antworten[1] := a1;
    Antworten[2] := a2;
    Antworten[3] := a3;
    richtige_Antwort := ra;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Frage[random(2)] do begin
    Label1.Caption := Frage;
    RadioButton1.Caption := Antworten[0];
    RadioButton2.Caption := Antworten[1];
    RadioButton3.Caption := Antworten[2];
    RadioButton4.Caption := Antworten[3];
    schonGefragt:=True;
  end;
end;
Zuletzt geändert von Mathias am Fr 19. Feb 2016, 20:05, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wahlberlinerin
Beiträge: 8
Registriert: Fr 19. Feb 2016, 13:40

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von wahlberlinerin »

Danke, danke, danke :)

Mathias hat geschrieben:

Code: Alles auswählen

 
  l := Length(Frage);
  SetLength(Frage, l + 1);
 



Das sind die einzigen zwei Zeilen, bei denen ich noch nicht ganz weiß, was sie tun und wie ich sie an mein Programm anpasse.
Wie mache ich die Unterteilung in die Kategorien?

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Mathias »

Das sind die einzigen zwei Zeilen, bei denen ich noch nicht ganz weiß, was sie tun

Sie erhöhen die Länge der dynamischen Array um ein Element.
Natürlich könntest auch eine statischen Array nehmen, aber dann bist du nicht mehr so flexibel, wen du zB. mehr als 6 Fragen willst.

Wie mache ich die Unterteilung in die Kategorien?

Du könntest den Record um das Element Kategorie erweitern.
Und beim Random könntest du fragen, wen Kategorie und nicht gelöst ist, dann nehmen, ansonsten neue Frage suchen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wahlberlinerin
Beiträge: 8
Registriert: Fr 19. Feb 2016, 13:40

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von wahlberlinerin »

Ich habe jetzt versucht, das alles umzusetzen, mir wird allerdings ein Fehler angezeigt:

Zu folgender Zeile "unit1.pas(98,29) Error: Operator is not overloaded: "Boolean" and "Byte"":

Code: Alles auswählen

 if schonGefragt=false and Kategorie=1 then 


Unten habe ich mal den gesamten Quelltext, damit das nochmal im Zusammenhang steht:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button2: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    procedure Button11Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
  TFrage = record
    Frage: string;
    Antworten: array [0..3] of string;
    richtige_Antwort: byte;
    schonGefragt: boolean;
    Kategorie: byte;
  end;
  TFragen = array of TFrage;
 
var
  Form1: TForm1;
  Frage: TFragen;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
var a:integer;
 
procedure TForm1.Add(F, a0, a1, a2, a3: string; ra,k: byte);
var l: integer;
begin
  l:= Length(Frage);
  SetLength(Frage,l + 1);
  with Frage[l] do begin
    Frage:= F;
    Antworten[0]:= a0;
    Antworten[1]:= a1;
    Antworten[2]:= a2;
    Antworten[3]:= a3;
    richtige_Antwort := ra;
    Kategorie:= k;
  end;
end;
 
procedure TForm1.Button11Click(Sender: TObject);
begin
  Button11.Enabled:=false;
  Button1.Enabled:=false;
  Button2.Enabled:=false;
end;
 
procedure TForm1.Button5Click(Sender: TObject);        //Allgemeinwissen
begin
  Randomize;
  Button1.Enabled:=true;
  Button2.Enabled:=true;
  Button5.Enabled:=false;
  Button6.Enabled:=false;
  Button7.Enabled:=false;
  Button8.Enabled:=false;
  Button9.Enabled:=false;
  Button10.Enabled:=false;
    with Frage[random(2)] do
    begin
      if schonGefragt=false and Kategorie=1 then
      begin
      Label1.Caption := Frage;
      RadioButton1.Caption := Antworten[0];
      RadioButton2.Caption := Antworten[1];
      RadioButton3.Caption := Antworten[2];
      RadioButton4.Caption := Antworten[3];
      schonGefragt:=True;
      end;
    end;
  end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Add('Wie heißt der Palast der englischen Königsfamilie in London?',
      'Hampton Court Palace','Tower of London','Buckingham Palace',
      'Kensington Palace',3,1);
  Add('Welche der folgenden Stätten ist keins der ursprünglichen sieben Weltwunder?',
      'Die Pyramiden von Gizeh','Die chinesische Mauer','Der Koloss von Rhodos',
      'Die hängenden Gärten von Babylon',2,1);
  Add('Wie nennt man die Bewerbungsunterlage, mit der sich Models bei Agenturen präsentieren?',
      'Setcard','Sedcard','Redcard','Zetcard',2,1);
  Add('Welche Aufgabe musste Sisyphos in der griechischen Mythologie immer wieder erfüllen?',
      'Wasser in einem löchrigen Krug transportieren','Unter Hunger Früchte ernten, wobei er diese nicht essen durfte',
      'Gegen einen unbesiegbaren Stier kämpfen','Einen Felsbrocken einen Hang hinaufrollen',4,1);
  Add('Welches der folgenden deutschen Bauwerke gehört nicht zum UNESCO-Weltkulturerbe?',
      'Zeche Zollverein in Essen','Kölner Dom','Museumsinsel Berlin','Schloss Neuschwanstein in Bayern',4,1);
  Add('Was ist keine Tempoangabe in der Musik?','Allegrettimo','Prestissimo','Allegro','Adagio',1,1);
end;
 
end.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von Mathias »

Code: Alles auswählen

if schonGefragt=false and Kategorie=1 then
// ersetzen durch:
if (schonGefragt=false) and (Kategorie=1) then
// noch besser:
if (not schonGefragt) and (Kategorie=1) then



Dies musst du auch noch ersetzen, ansonsten kommen immer nur die ersten zwei Fragen.

Code: Alles auswählen

with Frage[random(2)] do
// ersetzen durch
with Frage[random(Lenght(Fragen))] do


Habe ich oben auch schon falsch gemacht Sorry. :oops:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wahlberlinerin
Beiträge: 8
Registriert: Fr 19. Feb 2016, 13:40

Re: Problem bei Quiz programmieren - RadioButton

Beitrag von wahlberlinerin »

Dankeschön, jetzt kompiliert es :)

Jetzt muss ich nur noch einbauen, dass er kontrolliert, welcher RadioButton gechecked ist und ob das der richtige Button ist und dass er bei "Nächste Frage" die Kategorie beibehält.
Kann ich denn Daten aus der einen Procedure übernehmen? Also beispielsweise eben welche Frage oder welche Kategorie?

Antworten