Autor |
Beitrag |
M1R1
Hält's aus hier
Beiträge: 2
|
Verfasst: Mo 20.02.12 14:17
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.
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
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 20.02.12 14:22
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.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
M1R1
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 27.02.12 13:47
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.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Für diesen Beitrag haben gedankt: M1R1
|
|
Blup
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: 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; |
Für diesen Beitrag haben gedankt: M1R1
|
|
|