Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild fällt ... nicht (https://www.delphipraxis.net/103502-bild-faellt-nicht.html)

Poring 16. Nov 2007 15:16


Bild fällt ... nicht
 
Huhu,
ich möchte das Bild gerne immer schneller fallen lassen:
Delphi-Quellcode:
var
  Form1: TForm1;
  Fallen: real;
  Höhe: integer;
...
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Fallen:= 1;
with Image1 do
repeat
Höhe:= Image1.Top;
Fallen:= Fallen*1.1;
Image1.Top:=Image1.Top - Fallen;
until ( Image1.Top = Höhe - 250 );
end;
Nur ich bekomme dann die Fehlermeldung:
[Fehler] Unit1.pas(36): E2010 Inkompatible Typen: 'Integer' und 'Extended'

Was muss ich den dort machen :gruebel:

mfg

Luckie 16. Nov 2007 15:21

Re: Bild fällt ... nicht
 
Wenn du von einem Gnazzahltypen einen Fließkommadatentyp abziehst, ist das Ergebnis auch ein Fließkommadatentyp. Der Ganzzahldatentyp wird bei dieser Operation entsprechend erweitert. Die Eigenschaft Top benötigt aber einen Ganzzahldatentyp, da es keine Bruchteile von Pixel gibt. Du musst also aus deinem Fließkommadatentyp mit Delphi-Referenz durchsuchenRound oder Delphi-Referenz durchsuchenTrunc, je nachdem was besser passt, wieder einen Ganzzahldatentyp machen.

Apollonius 16. Nov 2007 15:22

Re: Bild fällt ... nicht
 
Eine Höhe ist eine Ganzzahl, Fallen eine Gleitkommazahl. Zum Umwandeln kannst du z.B. round() oder trunc() nehmen.
Aber mal ernsthaft: Genau das steht doch eigentlich in der Fehlermeldung. Wir nutzen hier doch kein C++. :gruebel:

Außerdem muss in die Schleife noch ein Application.ProcessMessages, sonst siehst du nichts.

Poring 16. Nov 2007 15:26

Re: Bild fällt ... nicht
 
Delphi-Quellcode:
round(Fallen);
so müsste es laut delphihelp sein:
Delphi-Quellcode:
For the last two cases, the result of calling the round() function is not the same as the result of adding 0.5 and then calling the floor() function because positive zero will be returned in such cases.

The following function call returns 3.

round(2.6)
The following function call returns 2.

round (2.4)
geht aber nicht:
[Fehler] Unit1.pas(36): E2014 Anweisung erforderlich, aber Ausdruck vom Typ 'Int64' gefunden

- Ich wusste nur nich ob sich die meldung auf Top oder auf Fallen bezieht ;)

EDIT:
ok richtig lesen muss man:
Delphi-Quellcode:
Fallen:=round(Fallen);
nun kommt jedoch trozdem die Fehlermeludng:
[Fehler] Unit1.pas(37): E2010 Inkompatible Typen: 'Integer' und 'Extended'
bei Image1.Top:=Image1.Top - Fallen; :gruebel:

RavenIV 16. Nov 2007 16:13

Re: Bild fällt ... nicht
 
Wenn Du richtig gelesen hättest, wäre Dir aufgefallen, dass Du es so machen sollst:
Delphi-Quellcode:
Image1.Top:=round(Image1.Top - Fallen);

Poring 16. Nov 2007 16:34

Re: Bild fällt ... nicht
 
Ahso danke.
Nur rennt das jetzt innerhalb von 2 sec ins unendliche ... will das eigentlich langsam fallen lassen. Gibts da ne möglichkeit?

DeddyH 16. Nov 2007 16:44

Re: Bild fällt ... nicht
 
Du benutzt doch einen Timer. Also entweder dessen Interval höher stellen oder den Faktor (1.1) verkleinern.

Poring 16. Nov 2007 16:50

Re: Bild fällt ... nicht
 
Sollte ja auch noch flüssig sein. Was mich wundert:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Fallen:= 1;
with Image1 do
repeat
Höhe:= Image1.Top;
Fallen:= Fallen*1.01;
Image1.Top:=round(Image1.Top + Fallen);
until ( Image1.Top = 50 );
end;
(Interval=2000)
Wenn es bei Top=50 bleibt es kurz stehen und dann rennt es ins unendliche nach unten. Warum? :(

DeddyH 16. Nov 2007 16:53

Re: Bild fällt ... nicht
 
Zitat:

Zitat von Poring
Delphi-Quellcode:
until ( Image1.Top = 50 );

Und was, wenn Image1.Top > 50? ;)

Sergej 16. Nov 2007 16:57

Re: Bild fällt ... nicht
 
Zitat:

Zitat von Poring
Wenn es bei Top=50 bleibt es kurz stehen und dann rennt es ins unendliche nach unten. Warum? :(

Schau die mal den Unterschied zwischen einer while-Schleife und deiner repeat-until-Schleife an. Vielleicht kommst du selbst auf die Lösung ;-)

DP-Maintenance 16. Nov 2007 17:21

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Das passt hier eigentlich besser hin.

Poring 16. Nov 2007 17:26

Re: Bild fällt ... nicht
 
Delphi-Quellcode:
while Image1.Top<200 do begin
Höhe:= Image1.Top;
Fallen:= Fallen*1.01;
Image1.Top:=round(Image1.Top + Fallen);
Application.ProcessMessages;
So?
Naja ok nun hält es wenigstens an ^^
Jedoch sobald es sichtbar anfängt runter zu gehen, ist es slebst bei einem Interval von 5000 innerhlab von paar Millisekunden gleich unten :(

Christian Seehase 16. Nov 2007 17:31

Re: Bild fällt ... nicht
 
Moin Poring,

ich denke mal, dass es einfach keine gute Idee ist, dass Du das gesamte Fallen in einer Schleife abarbeitest.
Es würde wahrscheinlich besser funktionieren, wenn Du das Image bei jedem Timeraufruf ein Stückchen fallen lässt.

Matze 16. Nov 2007 17:31

Re: Bild fällt ... nicht
 
Hallo,

wenn du das so mittels Schleife lösen möchtest, benötigst du keinen Timer, denn beim ersten Timeraufruf wird die komplette Schleife in Sekundenschnelle abgearbeitet. Da genügt ein DelayDelay (das ist eine Alternative zu Delphi-Referenz durchsuchenSleep) innerhalb der Schleife.

Apollonius 16. Nov 2007 17:32

Re: Bild fällt ... nicht
 
Darf ich fragen, warum du eine Schleife in einen Timer setzt? Wenn die Schleife bereits beim ersten Timer-Aufruf durchlaufen wird, ist Image1.Top natürlich schon größer oder gleich 200. Dann passiert bei weiteren Timer-Aufrufen nichts mehr. Nimm also die Schleife raus.

Poring 16. Nov 2007 17:38

Re: Bild fällt ... nicht
 
Es sollte ja nicht konstant fallen, sonder auch schneller werden ... aber eben nicht soo! schnell. Sollte vll schon so 5-6 Sekunden dauern von oben bis unten, nur eben immer shcneller werdend.

Delphi-Quellcode:
if Image1.Top<200 then begin
Höhe:= Image1.Top;
Fallen:= Fallen*1.1;
Image1.Top:=round(Image1.Top + Fallen);
Application.ProcessMessages;
Interval=500

Ja nun geht das besser, nun ruckelt es aber :gruebel:

Apollonius 16. Nov 2007 17:45

Re: Bild fällt ... nicht
 
Also die 1,1 und das Timer-Intervall verringern.

Poring 16. Nov 2007 17:48

Re: Bild fällt ... nicht
 
:-D Nu flackerts :spin:

Apollonius 16. Nov 2007 17:52

Re: Bild fällt ... nicht
 
Ist DoubleBuffered gesetzt?

Poring 16. Nov 2007 17:55

Re: Bild fällt ... nicht
 
:coder2: Nein, wie mache ich das denn? :/

DeddyH 16. Nov 2007 17:56

Re: Bild fällt ... nicht
 
Im OnShow (oder OnCreate) die Zeile
Delphi-Quellcode:
DoubleBuffered := true;
einfügen.

Poring 16. Nov 2007 18:01

Re: Bild fällt ... nicht
 
Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.

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