Autor Beitrag
M1R1
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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.
ausblenden volle Höhe 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 }

  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end

var
  Form1: TForm1; 
  nachunten, Bilderwechsel:boolean;
implementation

{$R *.lfm}

{ TForm1 }



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 user profile iconNarses: Delphi-Tags hinzugefügt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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.

_________________
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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mo 27.02.12 13:47 
ausblenden volle Höhe 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.

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: 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.
ausblenden 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