Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Mehrere If-Abfragen (https://www.delphipraxis.net/156617-mehrere-if-abfragen.html)

Matze33 8. Dez 2010 19:52

Mehrere If-Abfragen
 
Hey, hab mal ne "Anfängerfrage".
Ich möchte abfragen, ob sich ein Bild (das ich bewege, Konzept: Jump&Run-Game) über einem Panel befindet nach einem Sprung, damit es dann auf dem Panel landen kann und nicht wieder auf den Boden geht.
Eigentlich hätte ich dann jetzt das so geschrieben:
Delphi-Quellcode:
If Image1.Left>=Panel1.Left and Image1.Left<=Panel1.Left+Panel1.Width
Then Image.Top:=Image1.Top-Panel1.Height;
Wenn ich starten will, geht der Cursor hinter das Then und der Fehler "Incompatible Types" erscheint.
Der Fehler hierin liegt offensichtlich im "and", aber wie kann ich sonst mehrere Sachen überprüfen?

Klaus01 8. Dez 2010 19:56

AW: Mehrere If-Abfragen
 
Zitat:

Zitat von Matze33 (Beitrag 1067196)
Delphi-Quellcode:
If Image1.Left>=Panel1.Left and Image1.Left<=Panel1.Left+Panel1.Width
Then Image.Top:=Image1.Top-Panel1.Height;

Delphi-Quellcode:
If (Image1.Left>=Panel1.Left) and (Image1.Left<=Panel1.Left+Panel1.Width)
Then Image{1}.Top:=Image1.Top-Panel1.Height;
Sollte es nicht Image1.top heißen?

Grüße
Klaus

Matze33 8. Dez 2010 20:01

AW: Mehrere If-Abfragen
 
Äh ja, natürlich. War eben nur hingeschmiert^^

Auf jeden Fall danke dafür. Jetzt setz ich mich mal weiter hin, und gucke, wieso es noch nicht geht :P (Also der beabsichtigte Effekt). Sollte ich es nicht hinkriegen (wovon ich nicht ausgehe), melde ich mich wieder xD

Edit: Kann ich ein and auch nach Then verwenden?

Edit2: Hat sich schon erledigt, man bin ich blöd :D

aurikel_Max 8. Dez 2010 20:08

AW: Mehrere If-Abfragen
 
Zitat:

Zitat von Matze33 (Beitrag 1067201)
Edit: Kann ich ein and auch nach Then verwenden?

Zu welchem Zweck, mit einem AND verbindest du doch deine booleschen Ausdrücke?

Edit: Da war ich wohl etwas zu langsam - hat sich ja doch von selbst ergeben.

Matze33 8. Dez 2010 20:40

AW: Mehrere If-Abfragen
 
Japp, hab ich noch mal Glück gehabt, bevor ich wieder noch blöder dagestanden hätte^^

Wie dem auch sei, hab jetzt wieder eine Stelle, wo ich nicht weiter komme.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  wiederholungen:=wiederholungen+1;

  if Image1.Visible=True Then
  begin
    if wiederholungen<=14
    Then Image1.Top:=Image1.Top-wert;
    if wiederholungen>=15
    Then Image1.Top:=Image1.Top+wert;
    if wiederholungen=28
    Then begin Timer1.Enabled:=False; wiederholungen:=0; end;
  end;

  if Image2.Visible=True Then
  begin
    if wiederholungen<=14
    Then Image2.Top:=Image2.Top-wert;
    if wiederholungen>=15
    Then Image2.Top:=Image2.Top+wert;
    if wiederholungen=28
    Then begin Timer1.Enabled:=False; wiederholungen:=0; end;
  end;

  If (Image1.Left>=Panel1.Left) and (Image1.Left<=Panel1.Left+Panel1.Width)
  and (Image1.Top+Image1.Height=Panel1.Top)
  Then begin
    Image1.Top:=Panel1.Top-Image1.Height;
    Timer1.Enabled:=False;
  end;

  if Image1.Visible=True
  Then Image2.Top:=Image1.Top;
  if Image2.Visible=True
  Then Image1.Top:=Image2.Top;
end;
Das ist das, was bei einem Sprung (VK_UP) passiert. Aber die Figur (das Image1) springt jetzt immer wieder auf den Boden zurück, also er bleibt nicht auf dem Kasten (Panel1) stehen. Kann mir wer sagen, wieso? :stupid: (den Smiley musste ich ausprobieren :D )

Edit: Noch zur Erläuterung: Image1 ist die Spielfigur, die nach rechts guckt und Image2 das ganze gespiegelt, also nach links.

mkinzler 8. Dez 2010 21:12

AW: Mehrere If-Abfragen
 
Image1.Top+Image1.Height wird wohl nie geanu den Wert von Panel1.Top haben

BTW: Boolean-Werte nie auf True überprüfen. .Visible ist ja sschon ein Boolean. Zudem ist wahr als nicht falsch (0) deklariert und die Konstante True als 1.
Ich würde auch anders einrücken

Matze33 8. Dez 2010 21:30

AW: Mehrere If-Abfragen
 
Zitat:

Zitat von mkinzler (Beitrag 1067225)
Image1.Top+Image1.Height wird wohl nie geanu den Wert von Panel1.Top haben

Doch klar. Image1.Top+Image1.Height ist ja dann praktisch das untere Ende vom Bild. Und Panel1.Top ist halt das obere vom Panel xD
Wenn ich also springe sinkt der Wert von Image1.Top+Image1.Height auf eine Größe, die über Panel1.Top liegt, liegt aber zwischndurch genau auf der Höhe.

Image1.Top:=372
Image1.Height:=43
Image1.Top+Image1.Height:=415
Panel1.Top:=375
Sprung: 14*5px=70px
415-70=345
345<375
Und da ich in 5er Schritten gehe, wird genau die Position auch erwischt zwischendurch (2x).

Zitat:

Zitat von mkinzler (Beitrag 1067225)
BTW: Boolean-Werte nie auf True überprüfen. .Visible ist ja sschon ein Boolean. Zudem ist wahr als nicht falsch (0) deklariert und die Konstante True als 1.
Ich würde auch anders einrücken

Das geht mir jetzt zu schnell. Wie machst du es denn?

Hobby-Programmierer 9. Dez 2010 00:10

AW: Mehrere If-Abfragen
 
Markus meinte das in etwa so:
Delphi-Quellcode:
if Image1.Visible Then
  ...

pustekuchen 9. Dez 2010 06:48

AW: Mehrere If-Abfragen
 
Wie wäre es erstmal deinen Variablen vernünftige Namen zu geben?
Dann ist es viel angenehmer und erspart unnötige erklärungen.

Matze33 9. Dez 2010 13:21

AW: Mehrere If-Abfragen
 
Zitat:

Zitat von pustekuchen (Beitrag 1067278)
Wie wäre es erstmal deinen Variablen vernünftige Namen zu geben?
Dann ist es viel angenehmer und erspart unnötige erklärungen.

Wo liegt denn bitte an "Wiederholungen" das Problem?...

DeddyH 9. Dez 2010 13:23

AW: Mehrere If-Abfragen
 
Ich vermute, er meinte statt Variablen die Komponenten.

Matze33 9. Dez 2010 19:11

AW: Mehrere If-Abfragen
 
Jo, hab ich auch das Gefühl. Also nehm ich dazu mal Stellung: Es ist einfacher immer Image[x] zu schreiben, als Image_Mario_guckt_nach_links oder sowas, auch wenns jetzt übertrieben ist. Abgesehen davon ist es ja eigentlich auch nur für mich. Außerdem spielt das ja für meine eigentliche Rolle gar keine Frage. Deshalb auch die Bitte, jetzt wieder zum Problem zurück zu kommen^^

DeddyH 10. Dez 2010 11:17

AW: Mehrere If-Abfragen
 
Wie Markus bereits sagte, hast Du keine Toleranz eingebaut, die Abfrage wird also nicht wahr, wenn die aktuelle Y-Position nicht aufs Pixel genau stimmt. Und nochmal zur Namensgebung: wir kennen Deine Oberfläche nicht, können also mit Panel3 oder so nichts anfangen. Jetzt sag Du mir doch, was besser lesbar ist:
Delphi-Quellcode:
procedure TForm1.Image23Click(Sender: TObject);
begin
  Label34.Caption := Edit12.Text + ':' + Label42.Caption;
end;
oder
Delphi-Quellcode:
procedure TFormMain.imgFigurClick(Sender: TObject);
begin
  lblSpielstand.Caption := edtPunkte.Text + ':' + lblZeit.Caption;
end;
(Das ist zwar immer noch schlechter Stil, aber man kann anhand der Bezeichner zumindest erahnen, was die Komponenten darstellen sollen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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