Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Button soll sich merken, wie oft er gedrückt wurde (https://www.delphipraxis.net/188507-button-soll-sich-merken-wie-oft-er-gedrueckt-wurde.html)

Dilip 10. Mär 2016 16:07

Button soll sich merken, wie oft er gedrückt wurde
 
Hey ich habe vor Wer wird Millionär zu programmieren und habe das problem, dass ich ja nur 4 Buttons habe, auf denen die Antwortmöglichkeit stehen, ein Label auf der die Frage steht

Ich würde gern wissen, wie der Button sich merken kann, dass er beim ersten mal drücken etwas macht, beim 2. mal drücken etwas anderes ( mal steht auf dem Button die richtige antwort und es muss weiter gehen und mal die falsche und das Spiel wäre vorbei..


Ich könnte zwar auch mit 15*4 = 60 Buttons arbeiten und 54 davon unsichtbar machen, ist aber seeehr umständlich ( weil man ja jedes mal eingeben muss button1.visible := false; ... oder kann man mehrere Buttons aufzählen?

stahli 10. Mär 2016 16:18

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Du solltest mit 2 Ebenen arbeiten:

Eine Datenliste (z.B. Datenbank oder Text-Datei), in der jeweils die Fragen und zugehörigen 4 möglichen Antworten stehen und die Nr. der richtigen Antwort.

Das Formular benutzt denn einen Zähler und zeigt die erste Frage an.
Beim Drücken eines Buttons wird dann geprüft, ob die Button-Nr. zur richtigen Antwort passt.

Dann wird der Zähler erhöht und die zweite Frage angezeigt.

So kannst Du leicht die Fragen austauschen und erweitern, ohne das Programm neu erzeugen zu müssen.

Jumpy 10. Mär 2016 16:24

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Dies geht leider nicht, ist aber auch nicht nötig denke ich. Du musst dir (gerne mit unserer Hilfe) in dem anderen Thread zum gleichen Thema (WWM) eine vernünftige Struktur für das Programm überlegen. Dann wirst du sehen, dass nicht der Button sich merk, wie oft er gedrückt wurde, sondern das sich dein Programm in entsprechenden Variablen merken muss bei welcher Frage er gerade ist, welcher Button der richtige Antwort entspricht usw.

mm1256 10. Mär 2016 16:27

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Zitat:

Zitat von Dilip (Beitrag 1332599)
Ich würde gern wissen, wie der Button sich merken kann, dass er beim ersten mal drücken etwas macht, beim 2. mal drücken etwas anderes ( mal steht auf dem Button die richtige antwort und es muss weiter gehen und mal die falsche und das Spiel wäre vorbei..

Schau dir mal die Property "Tag" des Buttons an. Die könnte dein Freund sein. Der Button mit der richtigen Antwort bekommt z.B. beim Laden einer Frage das Tag "1" und die anderen Buttons das Tag "0". Somit weiß jeder der Buttons, ob er eine Frage richtig oder falsch beantwortet, und du weißt was beim Button.Click zu tun ist :thumb:

Dilip 13. Mär 2016 13:10

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Hey, ich hab jetzt einfach selber versucht etwas hinzubekommen und für mich klappt es schon sehr gut ( auch wenn der Quelltext wahrscheinlich viel zu viel ist und wesentlich leichter realisierbar wäre ^^ )
Ich habe es jetzt geschafft, dass ich 15 Fragen habe, bei richtiger Antwort gehts weiter, bei falscher hört es auf.. Alles super soweit


Jetzt möchte ich gern, da es sonst langweilig wird, Zufallsfragen haben ich habe es wiefolgt versucht

procedure Frage1(i:longint);
begin
randomize;
i := random(3)+1;
if i = 1 then
Form1.Label2.Caption := '"Andere Länder, andere ...?"'; //1. Frage
Form1.Button1.Caption := 'Fritten';
Form1.Button2.Caption := 'Schlitten';
Form1.Button3.Caption := 'Sitten';
Form1.Button4.Caption := 'Oberweiten';

if i = 2 then
Form1.Label2.Caption := '"Was ist 2+2?"'; //1. Frage
Form1.Button1.Caption := '2';
Form1.Button2.Caption := '3';
Form1.Button3.Caption := '4';
Form1.Button4.Caption := '5';

if i = 3 then
Form1.Label2.Caption := '"Blablabla'; //1. Frage
Form1.Button1.Caption := 'Falsch';
Form1.Button2.Caption := 'Falsch';
Form1.Button3.Caption := 'Richtig';
Form1.Button4.Caption := 'Falsch';
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var i:longint;
begin
Button1.Tag := 0;
Button2.Tag := 0;
Button3.Tag := 0;
Button4.Tag := 0;
Frage1(i);
end;



Bei Klick auf den BitBtn wird die Procedure Frage1 aufgerufe
In dieser soll eine von den 3 Fragen zufällig ausgewählt werden
Ich habe das Problem, dass sich nur die Fragen ändern, die Antwortmöglichkeiten aber immer die selben ( Amöglichkeiten sind immer die, aus i = 3) sind und nicht zur Frage passen..
Wo habe ich da einen Fehler gemacht?
Das Programm startet auch, aber es steht da 'i' does not seem to be initialized

Monday 13. Mär 2016 13:33

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Zwei Sachen:

1. If Abfragen sollten so aussehen: if .. then BEGIN ... END; Begin/End fehlt bei dir

2. Random + i gehört eher hier hin

procedure TForm1.BitBtn1Click(Sender: TObject);
var i:longint;
begin
randomize;
i := random(3)+1;
[...]
Frage1(i)=> was ist "i"? ( Das Programm startet auch, aber es steht da 'i' does not seem to be initialized ).



Für die weitere Bearbeitung: Der Block mit den Button1.Tag := 0; was soll mit denen geschehen?

Dilip 13. Mär 2016 14:12

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Ja, das begin und end hab ich noch reingemacht, ist mir dann auch aufgefallen..
Ich hab es jetzt in die Klickprocedure geschrieben aber es geht immernoch nicht

Es sieht aber so aus als ob sich die Antwortmöglichkeiten für gefühlt 0,0001Sekunde ändern, aber dann sind sie wieder bei Falsch Falsch Richtig Falsch
Ich hab es mal mit Label statt buttons versucht, ging aber auch nicht

Monday 13. Mär 2016 14:32

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Hast du auch überall Begin und End vervollständigt? Falls nicht, rattert er sonst durch und nimmt dann eben die letzten Antworten.

(Wenn du das begin/end bei if weglässt, berücksichtigt er genau nur den nächsten Befehl für die Abfrage. Den rest sieht er wieder als normalen Ablauf an, was hier nicht sein sollte)

Delphi-Quellcode:

procedure Frage1(i:longint);
begin

if i = 1 then begin
Form1.Label2.Caption := '"Andere Länder, andere ...?"'; //1. Frage
Form1.Button1.Caption := 'Fritten';
Form1.Button2.Caption := 'Schlitten';
Form1.Button3.Caption := 'Sitten';
Form1.Button4.Caption := 'Oberweiten';end;

if i = 2 then begin
Form1.Label2.Caption := '"Was ist 2+2?"'; //1. Frage
Form1.Button1.Caption := '2';
Form1.Button2.Caption := '3';
Form1.Button3.Caption := '4';
Form1.Button4.Caption := '5'; end;

if i = 3 then begin
Form1.Label2.Caption := '"Blablabla'; //1. Frage
Form1.Button1.Caption := 'Falsch';
Form1.Button2.Caption := 'Falsch';
Form1.Button3.Caption := 'Richtig';
Form1.Button4.Caption := 'Falsch';end;
end;

procedure TForm1.Button5Click(Sender: TObject);
var i:longint;
begin
randomize;
i := random(3)+1;

Button1.Tag := 0;
Button2.Tag := 0;
Button3.Tag := 0;
Button4.Tag := 0;
Frage1(i);
end;

Jens Hartmann 13. Mär 2016 14:51

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Hallo Dilip,

ich glaube, dass Du Grundlegend das Problem anders angehen solltest. "Sieh die nochmal die antwort von Stahli an".

Ich würde folgendes Vorschlagen.

Erstell Dir eine Art Fragenkatalog. Das könntest Du z.B. als Textdatei, DB oder ähnliches machen. Beim Programmstart, könntest Du verschiedenen Abfragen machen um festzulegen, welche Variante der Spieler spielen möchte (Zusatz Jocker etc.) Dann kannst Du per Zufall 16 aus den vorhanden Fragen auslesen und diese in z.B. ein Record schreiben...

Delphi-Quellcode:
type
  TFragen = record
    Frage : string;
    Antwort_1: string;
    Antwort_2: string;
    Antwort_3: string;
    Antwort_4: string;
    Richtig : integer;
  end;
Da Du ja 16 Fragen brauchst, kannst Du das ganze Record in ein array packen...

so z.B.

Delphi-Quellcode:
  Fragenkatalog : array[1..16] of TFragen;
Jetzt kannst Du aus dem Array Deine Fragen etc. auslesen.

markus5766h 13. Mär 2016 14:56

AW: Button soll sich merken, wie oft er gedrückt wurde
 
Zitat:

Zitat von Monday (Beitrag 1332820)
Zwei Sachen:
...
2. Random + i gehört eher hier hin

procedure TForm1.BitBtn1Click(Sender: TObject);
var i:longint;
begin
randomize;
i := random(3)+1;
[...

Randomize sollte nur ein mal aufgerufen werden, z.B. im OnCreate- oder OnShow-Ereignis des Formulars

und . . . irgendeine Struktur für das Programm solltest Du schon haben (siehe Post #2), sonst tippts Du Dir 'nen Wolf . . .


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
Seite 1 von 2  1 2      

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