Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler bei OnTimer Ereignis unter Laufzeit...


DXC - Fr 19.08.05 14:39
Titel: Fehler bei OnTimer Ereignis unter Laufzeit...
Hallo,

Leider bekomme ich bei folgendem Quellcode einen Fehler: :?

Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidCast mit der Meldung 'Ungültige Typumwandlung' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Der sinn des Quellcodes ist dass sich das Bild nach oben verschiebt...

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 DoTimer (Sender: TObject);
private
    { Private-Deklarationen }
...

procedure TForm1.Button1Click(Sender: TObject);
var
  NewTimer: TTimer;
  NewImage: TImage;
begin
  NewTimer := TTimer.Create (Nil);
  NewTimer.Interval := 20;
  NewTimer.Enabled := True;
  NewTimer.OnTimer := DoTimer;
  begin
    NewImage := TImage.Create(Nil);
    with NewImage do
      begin
      Top := 144;
      Left := 8;
      Picture.LoadFromFile('xxx.bmp');
      Parent := Form1;
      Name := 'xxx';
      end;
  end;
end;


procedure TForm1.DoTimer(Sender: TObject);
begin
  (Sender as TImage).Top := (Sender as TImage).Top - 3;
end;


Danke für jede Antwort... :wink:

MFG
DXC

Moderiert von user profile iconTino: "Hilfe" im Titel entfernt. Quote-Tags hinzugefügt.


Martin1966 - Fr 19.08.05 14:55

Der Fehler liegt in Zeile 32. Der Sender ist vom Type TTimer und nicht TImage. ;-)

Lg Martin


DXC - Fr 19.08.05 18:57

Hallo,

Leder funktioniert es dann auch nicht (habe es auch schon versucht :wink: ).

Kommt nur der Fehler:

Delphi-Quelltext
1:
2:
3:
[Fehler] Unit1.pas(53): E2003 Undefinierter Bezeichner: 'Top'
[Fehler] Unit1.pas(53): E2003 Undefinierter Bezeichner: 'Top'
[Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Hm, vielleicht hab ich im allgemeinen etwas falsch gemacht, hier noch mal der Quellcode:


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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure DoTimer (Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  NewTimer: TTimer;
  NewImage: TImage;
begin
  NewTimer := TTimer.Create (Nil);
  NewTimer.Interval := 20;
  NewTimer.Enabled := True;
  NewTimer.OnTimer := DoTimer;
  begin
    NewImage := TImage.Create(Nil);
    with NewImage do
      begin
      Top := 144;
      Left := 8;
      Picture.LoadFromFile('xxx.bmp');
      Parent := Form1;
      Name := 'xxx';
      end;
  end;
end;


procedure TForm1.DoTimer(Sender: TObject);
begin
  (Sender as TTimer).Top := (Sender as TTimer).Top - 3;
end;


end.


Wäre nett wenn Ihr mir beim lösen des Problems helfen könntet...

MFG
DXC


JayEff - Fr 19.08.05 19:06

du weist dass ein Timer kein Top hat, oder?
Ausserdem ist der NewTimer ja dann eine lokale Variable (auch das Image.) was bedeutet in anderen Prozeduren wirds schwer, darauf zuzugreifen...
Der Timer wird nur solange existieren, bis die Button Prozedur einmal durchgelaufen ist. Und es ist unwahrscheinlich, dass das solange dauert, wie der Intervall eines Timers.
Ich hab KEINE ahnung warum du unbedingt mit dem sender arbeiten willst (der sender ist wie der name schon sagt das objekt, das die prozedur auslöst. also der Timer. willst du den (unsichtbaren) timer verschieben? geht nicht.
mach die variable NewImage global und erzeuge sie lieber im Form Create (oder setze das Image von Hand auf die Form, das cheint mir auch schlauer. das gleiche geht auch mit dem Timer.)
Ich hoffe ich hab dir Helfen können..


DXC - Fr 19.08.05 19:35

Hallo,

erstmals Danke denn jetzt funktioniert es endlich hab es jetz so gelöst:


Delphi-Quelltext
1:
NewImage.Top := NewImage.Top - 3;                    

... und NewImage und NewTimer Global definiert :wink:

Aber wenn ich jetzt 2x schnell hintereinander auf den Button klicke dann kommt das 2-te Bild aber doppelt so schnell :shock: .

So wollte ich das eigentlich nicht kann mir die frage auch noch jemand bitte beantworten :oops: ? (@Mod: Habe extra kein neues Topic erstellt weil es einfach zusammengehör, hoffe du verstehst mich... :wink: )

Danke, danke, danke, ... :wink:

MFG
DXC