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 ...
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
Tino: "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 public 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
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!