![]() |
Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Moin moin liebe Sportsfreunde!
Ich bin gerade dabei ein Spiel zu coden, bei dem der Computer zufällig 4 farbige buttons nacheinander drückt, die der user dann wiederholen muss (manche kennen das spiel unter dem namen "Simon") Ich bin gerade dabei, dass der Computer in Level 1 vier buttons zufällig drücken soll und bekommen die fehlermeldung: [Fehler] Unit1.pas(127): Ausdruckstyp muss BOOLEAN sein ich finde aber einfach den fehler nicht. kann mir jemand helfen? hier mein Text:
Delphi-Quellcode:
:gruebel: :gruebel: :gruebel:
var
Form1: TForm1; delay: Integer = 1; level: Integer = 0; start: boolean = true; implementation procedure TForm1.Timer1Timer(Sender: TObject); var r, help: Integer; begin if start = true then begin INC(level); help:=level + 3; start:=false; end; if if delay = 1 then begin randomize; r:=Random(4); if r=0 then panel7.Color:=clRed; if r=1 then panel4.Color:=clLime; if r=2 then panel5.Color:=clYellow; if r=3 then panel6.Color:=clBlue; delay:=2; end else begin panel4.Color:=clGreen; panel5.Color:=clOlive; panel6.Color:=clNavy; panel7.Color:=clMaroon; delay:=1; DEC(help); if help = 0 then timer1.Enabled:=false; end; // <-- hier soll laut Delphi der Fehler sein end; |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Ich weiß zwar nicht, ob es der Fehler ist (er ist immerhin an einer komplett anderen Stelle) aber man schreibt nicht
Delphi-Quellcode:
sondern
if start = true then begin
Delphi-Quellcode:
if start then begin
Flare //Edit: Ich sehe da gerad ein If ohne Bedingung :mrgreen: |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Formatier das einfach mal gescheit:
Delphi-Quellcode:
Fällt dir jetzt was auf?
procedure TForm1.Timer1Timer(Sender: TObject);
var r, help : Integer; begin if start = true then begin INC(level); help := level + 3; start := false; end; if if delay = 1 then begin randomize; r := Random(4); if r = 0 then panel7.Color := clRed; if r = 1 then panel4.Color := clLime; if r = 2 then panel5.Color := clYellow; if r = 3 then panel6.Color := clBlue; delay := 2; end else begin panel4.Color := clGreen; panel5.Color := clOlive; panel6.Color := clNavy; panel7.Color := clMaroon; delay := 1; DEC(help); if help = 0 then timer1.Enabled := false; end; // <-- hier soll laut Delphi der Fehler sein end; |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Delphi-Quellcode:
Klammern gesetzt, eingerückt, ein if entfernt, mehrere ifs durch case ersetzt.
var
Form1: TForm1; delay: Integer = 1; level: Integer = 0; start: boolean = true; implementation procedure TForm1.Timer1Timer(Sender: TObject); var r, help: Integer; begin if start then begin INC(level); help:=level + 3; start:=false; end; if (delay = 1) then begin r:=Random(4); case r of 0: panel7.Color:=clRed; 1: panel4.Color:=clLime; 2: panel5.Color:=clYellow; 3: panel6.Color:=clBlue; end; delay:=2; end else begin panel4.Color:=clGreen; panel5.Color:=clOlive; panel6.Color:=clNavy; panel7.Color:=clMaroon; delay:=1; DEC(help); if (help = 0) then timer1.Enabled:=false; end; end; randomize sollte nur bei Programmstart aufgerufen werden. Grüße Klaus |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
danke die fehlermeldung ist jetzt weg
woran es lag hab ich aber bis jetzt immernoch nicht gefunden :( ich überleg nachher nochmal stark ich habe jetzt aber erstmal den code von klaus genommen folgendes passiert: zufällig ändern die panels für 1 sekunde ihre farbe und wieder zurück nach meiner logik sollte das ganze aber nur 4 mal geschehen, da die variable help ja theoretisch 0 wird und der timer ausgeschaltet werden sollte. jedoch blinkt mehr als 4 mal ein panel auf, warum? |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Zitat:
Delphi-Quellcode:
ist ein if, hinter dem nichts steht.
if delay = 1 then
Der Fehler sitzt nicht immer dort, wo der compiler meint, dass er sitzt. Du musst beim Fehlersuchen schon das Hirn einschalten. |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
wie wird help denn 0?
Delphi-Quellcode:
und vielleicht für eine neue Frage einen neuen Thread aufmachen.
procedure TForm1.Timer1Timer(Sender: TObject);
var r, help: Integer; begin if start then begin INC(level); help:=level + 3; // bei jedem Timeraufruf wird help auf 4 gesetzt start:=false; end; if (delay = 1) then begin r:=Random(4); case r of 0: panel7.Color:=clRed; 1: panel4.Color:=clLime; 2: panel5.Color:=clYellow; 3: panel6.Color:=clBlue; end; delay:=2; end else begin panel4.Color:=clGreen; panel5.Color:=clOlive; panel6.Color:=clNavy; panel7.Color:=clMaroon; delay:=1; DEC(help); // hier ist help = 3 if (help = 0) then timer1.Enabled:=false; end; end; // und hier ist der Timer zuende. Grüße Klaus |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
aber dadurch dass die variable "start" gesetzt wurde, wird "help" doch nur beim 1. mal auf 4 gesetzt oder nicht?
(ich denk ma für die kleine frage kann der thread bleiben oder?) |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
welche variable start?
Die Variable start ist boolean. Wenn vor dem Aufruf des Timers der level immmer 0 ist ist help beim Start immer 4!
Delphi-Quellcode:
Grüßeif start then begin INC(level); help:=level + 3; start:=false; end; Klaus |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
und was kann ich dagegen tun?
|
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Hallo,
was Klaus geschrieben hat, ist nur zum Teil richtig. Help wird tatsächlich nur beim ersten Aufruf gesetzt. Leider ist Help aber eine lokale Variable, deshalb ist Help auch bei allen übrigen Aufrufen undefiniert. Sobald Du Help als Variable der Form deklarierst, funktioniert auch die Methode. Alternativ kannst Du auch die Eigenschaft Tag des Timers verwenden, wenn Du die nicht für etwas anderes benötigst. Damit sparst Du Dir eine Variable, solltest dieses dann aber auch dokumentieren, damit Du weißt, was Du da getan hast. ich hab die Methode mal noch etwas überarbeitet und kommentiert. Du benötigst folgende Variablen (am Besten in Deiner Form definiert):
Delphi-Quellcode:
DoFirst: Boolean; // Welche Färbemethode?
level: Integer = 0; // Keine Ahnung ;-) start: boolean = true; // Erster Durchlauf? help: Integer; // Zähler, besser anders benennen
Delphi-Quellcode:
Gruß
procedure TForm1.Timer1Timer(Sender: TObject);
begin if start then begin // Startwerte setzen start := False; Inc(level); help := level + 3; DoFirst := True; end; // Panels einfärben if DoFirst then case Random(4) of 0: panel7.Color:=clRed; 1: panel4.Color:=clLime; 2: panel5.Color:=clYellow; 3: panel6.Color:=clBlue; end else begin panel4.Color := clGreen; panel5.Color := clOlive; panel6.Color := clNavy; panel7.Color := clMaroon; // Help vermindern Dec(help); end; // Zwischen den beiden Möglichkeiten wechseln DoFirst := not DoFirst; // Fertig -> Timer aus if (help = 0) then Timer1.Enabled := False; end; xaromz |
Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
Hai ihr,
ich habe mir auch mal den Spass gemacht etwas Code zu tippen. Dieser berücksichtigt "nebenbei" auch noch die Aufgabenstellung des Spieles ;-)
Delphi-Quellcode:
type
TDemoForm = class(TForm) Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Timer1: TTimer; btn_start: TButton; procedure btn_startClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } Level: Integer; Durchlauf: Integer; Reihenfolge: array of Integer; Pause: Boolean; procedure AllePanelsAus; public { Public-Deklarationen } end; var DemoForm: TDemoForm; implementation {$R *.dfm} procedure TDemoForm.btn_startClick(Sender: TObject); // Startet den Level var ndx: Integer; begin Level := 4; // Level des Spieles. SetLength(Reihenfolge, Level); // Arraygröße auf die Anzahl der Durchgänge setzen for ndx := Low(Reihenfolge) to High(Reihenfolge) do // Die Farbreihenfolge erzeugen begin Reihenfolge[ndx] := Random(4); // Zufallswert 0-3 in das Array schreiben end; Durchlauf := 0; Pause := False; Timer1.Enabled := True; // Timer starten end; procedure TDemoForm.FormCreate(Sender: TObject); begin Randomize; // Random initalisieren AllePanelsAus; Timer1.Enabled := False; // Timer ausschalten Timer1.Interval := 1000; // Dauer der Farbanzeige end; procedure TDemoForm.Timer1Timer(Sender: TObject); begin if (Pause) then begin AllePanelsAus; // Alle Panel wieder aus end else begin case Reihenfolge[Durchlauf] of // Panel gemäß Zufallsliste einschalten 0: panel1.Color := clLime; 1: panel2.Color := clYellow; 2: panel3.Color := clBlue; 3: panel4.Color := clRed; end; Inc(Durchlauf); // Durchlauf erhöhen end; if (Durchlauf - 1 = Level) then begin Timer1.Enabled := False; // Timer ausschalten AllePanelsAus; end; Pause := not (Pause); // Flag für die Pause umschalten end; procedure TDemoForm.AllePanelsAus; begin panel1.Color := clGreen; panel2.Color := clOlive; panel3.Color := clNavy; panel4.Color := clMaroon; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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