Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung: Ausdruckstyp muss BOOLEAN sein (https://www.delphipraxis.net/69536-fehlermeldung-ausdruckstyp-muss-boolean-sein.html)

Fr33z0r 16. Mai 2006 18:06


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:
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;
:gruebel: :gruebel: :gruebel:

Flare 16. Mai 2006 18:12

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:
if start = true then begin
sondern
Delphi-Quellcode:
if start then begin

Flare

//Edit: Ich sehe da gerad ein If ohne Bedingung :mrgreen:

Luckie 16. Mai 2006 18:13

Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
 
Formatier das einfach mal gescheit:
Delphi-Quellcode:
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;
Fällt dir jetzt was auf?

Klaus01 16. Mai 2006 18:13

Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
 
Delphi-Quellcode:
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;
Klammern gesetzt, eingerückt, ein if entfernt, mehrere ifs durch case ersetzt.
randomize sollte nur bei Programmstart aufgerufen werden.
Grüße
Klaus

Fr33z0r 16. Mai 2006 18:24

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?

RavenIV 16. Mai 2006 18:29

Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
 
Zitat:

Zitat von Fr33z0r
danke die fehlermeldung ist jetzt weg
woran es lag hab ich aber bis jetzt immernoch nicht gefunden :( ich überleg nachher nochmal stark

über der Zeile
Delphi-Quellcode:
if delay = 1 then
ist ein if, hinter dem nichts steht.
Der Fehler sitzt nicht immer dort, wo der compiler meint, dass er sitzt.
Du musst beim Fehlersuchen schon das Hirn einschalten.

Klaus01 16. Mai 2006 18:37

Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
 
wie wird help denn 0?

Delphi-Quellcode:
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.
und vielleicht für eine neue Frage einen neuen Thread aufmachen.

Grüße
Klaus

Fr33z0r 16. Mai 2006 18:44

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?)

Klaus01 16. Mai 2006 19:04

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:
 
if start then
  begin
    INC(level);
    help:=level + 3;  
    start:=false;
  end;
Grüße
Klaus

Fr33z0r 16. Mai 2006 22:19

Re: Fehlermeldung: Ausdruckstyp muss BOOLEAN sein
 
und was kann ich dagegen tun?

xaromz 17. Mai 2006 07:48

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:
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;
Gruß
xaromz

Sharky 17. Mai 2006 07:52

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