Entwickler-Ecke
Multimedia / Grafik - Bewegung einen Bildes mit Timer und Bildwechsel
M1R1 - Mo 20.02.12 14:17
Titel: Bewegung einen Bildes mit Timer und Bildwechsel
Ich habe mithilfe eines Timers ein Programm erstellt, dass ein Objekt von oben nach unten bewegt, nun wollte ich jedesmal, wenn das Objekt die Richtung ändert das Bild, dass sich hinter diesem Objekt befindet, ändern(es befinden sich zwei Bilder nebeneinander, die immer vertauscht werden sollen. Jetzt zeigt es mir zwar keine Fehler mehr an und angeblich wurde das Programm erfolgreich kompiliert, allerdings öffnet sich nichts.
Kann mir jemand helfen? Ich benutze Lazarus.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| unit Unit1;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; nachunten, Bilderwechsel:boolean; implementation
{$R *.lfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if image1.top+image1.height>form1.height then nachunten:=false; if image1.top<1 then nachunten:=true; if nachunten= true then image1.top:=image1.top+1 else image1.top:=image1.top-1 ;
if nachunten =true then Bilderwechsel:=false else Bilderwechsel:=true;
end;
procedure TForm1.FormCreate(Sender: TObject); var Bild : TPicture; begin randomize; nachunten:=true; while Bilderwechsel =false do begin Bild:= image2.picture; image2.picture:=image3.picture; image3.picture:=Bild end; while Bilderwechsel =true do Begin Bild:= image2.picture; image2.picture:=image3.picture; image3.picture:=Bild ; end; end;
end. |
Moderiert von
Narses: Delphi-Tags hinzugefügt
Xion - Mo 20.02.12 14:22
:welcome:
Wenn du deinen Code mit Delphi Tags [delphi] [/delphi ] umrandest (oder den Knopf dafür nutzt, dann sieht er auch hübsch aus ;)
Zum Problem: Du hast eine klassische Endlosschleife im deinem OnCreate produziert, und da erst danach das Fenster angezeigt wird, siehst du erst endlos spät (= nie) was. Das liegt daran, dass egal welchen Wert "Bilderwechsel" zu Beginn hat, du eine Schleife startest...die eben endlos laufen wird.
M1R1 - Mo 27.02.12 13:04
hey, danke erst mal für die Antwort...
ich hab die while-schleife durch eine if...then anweisung ersetzt, leider funktioniert es aber immer noch nicht, d.h. das Programm startet zwar, aber das Bild wechselt nicht :(
muss ich die anweisung in den timer einfügen? oder den Zeitpunkt des Bilderwechsels anders definieren?
Xion - Mo 27.02.12 13:47
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure Bildwechsel(var PicA, PicB: TImage); var Bild : TPicture; begin Bild:= PicA.picture; PicA.picture:=PicB.picture; PicB.picture:=Bild ; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin
if image1.top+image1.height>form1.height then begin nachunten:=false; Bildwechsel(Image2,Image3); end else if image1.top<1 then begin nachunten:=true; Bildwechsel(Image2,Image3); end; if nachunten= true then image1.top:=image1.top+1 else image1.top:=image1.top-1 ;
if nachunten =true then Bilderwechsel:=false else Bilderwechsel:=true; end;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; nachunten:=true; end; |
So in der Art würde ich es machen.
Blup - Di 28.02.12 10:59
Die Procedure Bildwechsel kann so nicht funktionieren, da in "Bild" nicht der Bildinhalt zwischen gespeichert wird, sondern nur die Referenz auf das Objekt PicA.picture.
Instanzvariablen als Varparameter machen nur Sinn, wenn der Inhalt der Variablen tatsächlich verändert werden soll.
Hier werden jedoch nur die Daten der Objekte verändert, auf die diese Variablen verweisen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure Bildwechsel(PicA, PicB: TImage); var Bild : TPicture; begin Bild := TPicture.Create; try Bild.Assign(PicA.picture); PicA.picture.Assign(PicB.picture); PicB.picture.Assign(Bild); finally Bild.Free; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!