Constant and CASE types do not match

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Constant and CASE types do not match

Beitrag von PascalHST »

Code: Alles auswählen

Ich habe eine Tastenabfrage erstellt, bekomme aber dann beim Kompileren die meldung:
 
Error: Constant and CASE types do not match
 
 
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure SteuerungsTimer(Sender: TObject);
    procedure KeyUp(Sender: TObject; var Key: char);
private
FTasteW, FTasteS, FTasteI, FTasteK: Boolean; 
 
procedure TForm1.KeyUp(Sender: TObject; var Key: char);
begin
  case Key of
        VK_SPACE: SpielStart;
    VK_Escape: Close;
    VK_W: FTasteW := False;
    VK_S: FTasteS := False;
    VK_I: FTasteI := False;
    VK_K: FTasteK := False;
  end;
 
 
 
procedure TForm1.SteuerungsTimer(Sender: TObject);
begin
  if FTasteW then
  ZeichneSchlaegerLinks(FSchlaegerRechtsY + 20);
  if FTasteS then
  ZeichneSchlaegerLinks(FSchlaegerRechtsY - 20);
  if FTasteI then
  ZeichneSchlaegerRechts(FSchlaegerRechtsY + 20);
  if FTasteK then
  ZeichneSchlaegerRechts(FSchlaegerRechtsY - 20);
  end;
 
 
procedure TForm1.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_SPACE: SpielStart;
    VK_Escape: Close;
    VK_W: FTasteW:= True;
    VK_S: FTasteS := True;
    VK_I: FTasteI := True;
    VK_K: FTasteK := True;
end;
end;  
 
Wo liegt der Fehler und was bedeutet die Meldung?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Constant and CASE types do not match

Beitrag von Michl »

Hast wahrscheinlich den Eventhandler von OnKeyPress genommen und als OnKeyUp für des Formular verwendet. Bei mir sieht die Ereignisbehandlungsroutine für OnKeyUp so aus:

Code: Alles auswählen

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
Damit wäre Key vom Typ Word (kein Char) und würde mit dem Typ von VK... übereinstimmen.

PS: eine Ereignisbehandlungsroutine kannst Du ganz einfach erstellen, indem:
- Du das Control, dessen Ereignis Du auswerten willst mit einem Klick anwählst
- im Objektinspektor den Reiter Ereignisse auswählst
- den Button [...] von dem entsprechendem Ereignis klickst
Damit wird automatisch der richtige Eventhandler erstellt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: Constant and CASE types do not match

Beitrag von PascalHST »

Danke, Fehler behoben, allerdings Funktionieren die Schläger nicht wirklich.
Man soll sie beide gleichzeitig bewegegn können, und bei druck auf die Taste sich um 20px verschieben....

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Constant and CASE types do not match

Beitrag von Michl »

PascalHST hat geschrieben:Man soll sie beide gleichzeitig bewegegn können, und bei druck auf die Taste sich um 20px verschieben....
Das liegt aber eher an der Architektur Deines Programms, als an Lazarus.

Bei mir funktioniert das eigentlich recht gut. Evtl. hilft Dir ein kleines Beispiel als Anregung?! Bsp.zip

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: Constant and CASE types do not match

Beitrag von PascalHST »

Vielen Dank dafür :)
Allerdings habe ich bereits Procedure um die Schläger zu zeichnen, wie bekomme ich deinen Code jetzt in meinen?
Bzw kannst du mir eine kurz Erläuterung zu Boolean geben?..

Code: Alles auswählen

procedure TForm1.ZeichneSchlaegerLinks(const AYNew: integer);               
begin
     if (AYNew <= 0) or (AYNew + CSchlaegerHoehe >= ClientHeight) then
        Exit;
     Canvas.Pen.Style            := psClear;
     Canvas.Brush.Color          := ClWhite;
     Canvas.Rectangle(FSchlaegerLinksX, FSchlaegerLinksY, FSchlaegerLinksX +
                      CBallGroesse, FSchlaegerLinksY + CSchlaegerHoehe);
     Canvas.Brush.Color          := ClBlack;
     Canvas.Rectangle(FSchlaegerLinksX, AYNew, FSchlaegerLinksX +
                      CBallGroesse, AYNew + CSchlaegerHoehe);
     FSchlaegerLinksY                   := AYNew;
     end;
 
procedure TForm1.ZeichneSchlaegerRechts (const AYNew: integer);            
begin
     if (AYNew <= 0) or (AYNew + CSchlaegerHoehe >= ClientHeight) then
        Exit;
     Canvas.Pen.Style             := psClear;
     Canvas.Brush.Color           := ClWhite;
     Canvas.Rectangle(FSchlaegerRechtsX, FSchlaegerRechtsY, FSchlaegerRechtsX +
                      CBallGroesse, FSchlaegerRechtsY + CSchlaegerHoehe);
     Canvas.Brush.Color           := ClBlack;
     Canvas.Rectangle(FSchlaegerRechtsX, AYNew, FSchlaegerRechtsX +
                      CBallGroesse, AYNew + CSchlaegerHoehe);
     FSchlaegerRechtsY                   := AYNew;
     end; 

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Constant and CASE types do not match

Beitrag von Michl »

PascalHST hat geschrieben:...wie bekomme ich deinen Code jetzt in meinen?
K.A. - ich kenne Dein Programm nicht!
PascalHST hat geschrieben:Bzw kannst du mir eine kurz Erläuterung zu Boolean geben?..
So, wie ich das bei dem vorherigen Post von Dir gesehen hatte, mit den "FTasteW, FTasteS, FTasteI, FTasteK: Boolean;" ist doch i.O., wenn Du damit zurecht kommst (das Array of Boolean war nur Faulheit von mir)!

Das, was ich Dir eigentlich zeigen wollte, ist die Verwendung des Timers. Wenn Du alle ...Millisekunden Dein Programm neuzeichnen lässt, kannst Du dort entsprechend auch gleich die gedrückten Tasten auswerten.
Zuletzt geändert von Michl am Di 17. Jun 2014, 13:41, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: Constant and CASE types do not match

Beitrag von PascalHST »

Nagut, Danke trotzdem, werde versuchen es noch iwie zu lösen :)

Antworten