Autor |
Beitrag |
Green
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Do 11.05.06 23:13
wie der titel schon sagt, ich will einen timer zur laufzeit createn der nach x sekunden abc() und def() macht, also programmierbar ist, der dannach sich selbst per destroy zerstört, alles schön OOP, aber wie mach ich das???
mfG Green
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 11.05.06 23:36
Moin!
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var Timer: TTimer;
Timer := TTimer.Create(NIL);
FreeAndNil(Timer); |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Fr 12.05.06 07:37
ääähm, jo und wo setz ich jetzt die proceduren die durchführen soll? also das was er letztendlich timen soll?
|
|
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Fr 12.05.06 07:55
Titel: re
Ereignisse sind Eigenschaften.
Ereignisse sind Methodenzeiger.
...
(Quelle: EntwicklerHandbuch, 5 cm dick)
Ein ereignis kann man so deklarieren:
Delphi-Quelltext 1:
| OnTimer: procedure(Sender:TObject); |
Das Ereignis OnTimer musst du natürlich nicht selber deklarieren, du musst diesem Ereigniss aber eine Methode (Eine Procedure mit den selben Parametern) zuweisen. Das machst du dann so Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Timer: TTimer;
Timer := TTimer.Create(NIL); Timer.OnTimer := DeineProcedure; FreeAndNil(Timer); |
DeineProcedure deklarierst du im Public- oder Privat-Abschnitt von TForm und implementierst sie unten.
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 07:52
ok vielen dank, das hab ich kapiert.
aber noch ne frage: was mach ich wenn ich jetzt erstens dynamisch timer erstellen will also die timer dynamisch benennnen will:
timer1 timer2 timer3
wobei die zahl halt inner variable ist, und wie greif ich jetzt dynamisch, das heisst wieder mit der variable auf den timerx zu?
desweiteren kriege ich beim zuweisen immer die fehlermeldung:
Zitat: | [Error] Unit1.pas(25): Undeclared identifier: 'TTimer' |
meine uses sind:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
und ich arbeite mit D6 Enterprise
mfG Green
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 13.05.06 09:02
Hallo,
aus Turbo-Pascal Zeiten:
Nimm einen Timer mit kuerzeren Intervallen(20 ms ist unter Windows das Minimum) und merke Dir mit einem Zaehler, wer gerade dran ist.
Ein
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TprcTimer= procedure(???Was Du glaubst, zu brauchen); record MyTime = MomT, StartT : integer; prcTime : TprocTime; end; |
Dann erzeugst du eben ein dynamische Feld aTimer : array of Mytime.
Deine ontimer Procedure klappert jetzt alle Feldelemente ab.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure ontimer(..) var i : integer; begin for i := 0 to High[aTimer] do with aTimer[i] do begin MomT := MomT-timer.interval; If MomT< 0 then begin MomT := MomT+StartT; prcTime; end; end; end; |
Gruss Horst
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 13.05.06 09:07
Für den Timer musst du ExtCtrls mit einbinden, wie ein schneller Blick in die Delphi-Hilfe verrät 
_________________ We are, we were and will not be.
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 09:15
@horst_h
öööh das blick ich jetzt nit ganz, aber ich werd den tip von
@Gausi
zu herzen nehmen... danke erstmal vielmals, mfG Green
eine weitere frage: bei dem
Delphi-Quelltext 1: 2: 3:
| Timer.OnTimer := DeineProcedure; |
ich hab jetzt meine procedure aber ich will ausser Sender: TObject noch was übergeben... aber wie mach ich das?
also wenn ich das so schreib:
Delphi-Quelltext 1: 2: 3:
| procedure showit(x: integer; Sender: TObject); Timerarray[x].OnTimer := showit(x,Button1); |
dann krieg ich immer nen fehler... Zitat: |
[Error] Unit1.pas(36): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
|
mfG Green
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Sa 13.05.06 10:21
So einfach ist das nicht möglich.- Ich würde eine Klasse von TTimer ableiten, der eine weitere Property geben (z.B. "Button") und die dann vor der Zuweisung der Procedure setzen. Dann kannst du in der Procedure per TMyTime(Sender).Button auf den Button zugreifen.
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 10:51
ich habs: ich benutz einfach die Property 'Tag' die is genau für sowas gedacht...
Zitat: | Stores an integer value as part of a component.
property Tag: Longint;
Description
Tag has no predefined meaning. The Tag property is provided for the convenience of developers. It can be used for storing an additional integer value or it can be typecast to any 32-bit value such as a component reference or a pointer. |
aber danke für die idee, wäre ich ohne dich nit draufgekommen
mfG Green
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 11:00
oops, mir fällt grade auf das ich da nen denkfehler gemacht hab...
wenn ich im Timer<x> tag auf x setz ums in der procedure von OnTimer abzufragen, dann brauch ich ja in der Procedure auch die nummer des timers in der x steht, aber des müsste ich ja mit übergeben wenn ich ONTimer setz was ja leider nicht geht. kann es sein das das unmöglich ist? mein problem ist halt das ich eben den timer setzen will beispielsweise auf 5 sekunden und der dann was bestimmtes machen soll ( abc() def() ) und sich dann per FreeAndNil(Timer); selber beenden soll da er ja nicht unendlich mal abc un def machen soll sondern nur einmal, bzw. halt eine orgeschribene anzahl... dazu brauch ich aber die nummer des timers, welche ich ja dummerweise nicht hab... kann mir jemand helfen? bzw. hat jemand das problem kapiert?
es muss doch möglich sein das objekt das mir die procedure aufgerufen hat herauszufinden... so neben bei: was bringt sender eigentlich?
mfG Green
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Sa 13.05.06 11:12
MrSaint hat folgendes geschrieben: | Dann kannst du in der Procedure per TMyTime(Sender).Button auf den Button zugreifen. |
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 11:20
oh yeah ENDLICH GEHTS!!! Vielen Dank  ihr seid super
mfG Green
|
|
Green 
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: Sa 13.05.06 11:31
äähm noch ne frage...
nach dem FreeAndNil(Timer); wie sieht denn Timer (also die variable) dann aus? also kann ich rausfinden ob ich den timer schon gekillt hab?
mfG Green
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 13.05.06 11:42
Moin!
FreeAndNil eingeben, Cursor draufstellen und F1 drücken, dann lesen...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Sa 13.05.06 11:53
Vieleicht hilft dir das aus der Delphi Ecke
// Hier die effizienteste Methode mal schnell einen Timer zu erzeugen
// und wieder zu entfernen. Wenn auf diese Art gleichzeitig mehrere Timer
// erzeugt werden sollen, muss TimerId hochgezählt werden.
// Getestet mit D4 unter Win98
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| const TimerID: Integer = 1; procedure OnTimer; begin killtimer(application.handle, TimerID); beep; showmessage('Zeit ist abgelaufen'); end; procedure TForm1.Button1Click(Sender: TObject); var zeit: cardinal; begin zeit := 1000; settimer(application.handle, TimerID, zeit, @OnTimer); end; |
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 13.05.06 13:18
Hallo,
damit man mal >sieht< was ich meinte.
Es n Rechtecke,Ellipsen auf die Form.convas gezeichnet und blinken vor sich hin.
Bei n = 4000 ist die Belastung < 1 %.
Gruss Horst
Einloggen, um Attachments anzusehen!
|
|
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 14.05.06 18:35
Titel: ?
Horst_H hat folgendes geschrieben: | Hallo,
TprcTimer= procedure(???Was Du glaubst, zu brauchen);
record MyTime =
MomT,
StartT : integer;
prcTime : TprocTime;
end;
|
`
@Horst_H: Kann es sein, dass du dich da vertan hast? Wir sind doch nicht bei C++!
Record-Typen deklariert man bei pascal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type MyTime = record MomT, StartT : integer; prcTime : TprocTime; end; |
|
|
-Pl-
      
Beiträge: 22
Win XP, Win Vista
Delphi 7
|
Verfasst: Do 25.01.07 01:40
Titel: Re: re
Jakob Schöttl hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Timer: TTimer;
Timer := TTimer.Create(NIL); Timer.OnTimer := DeineProcedure; FreeAndNil(Timer); |
|
Ich habe es genau so gemacht, aber es kommt trotzdem der Fehler:
[Fehler] : Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
für folgende Zeile:
Delphi-Quelltext 1:
| DrawTimer.OnTimer := DrawTimerTimer; |
Das weitere sieht so aus:
Delphi-Quelltext 1:
| procedure DrawTimerTimer(Sender: TObject); |
Delphi-Quelltext 1: 2: 3: 4:
| procedure DrawTimerTimer(Sender: TObject); begin Draw; end; |
Das müssten die interessanten Abschnitte sein ... bin ich einfach nur blind und hab was übersehen oder wo liegt der Fehler ?
Vielen Dank für eure Hilfe !
ps: Ich weiss das der Thread ziemlich weit ausgegraben ist *Suchfunktion tätschel*
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 25.01.07 01:52
Moin!
Mach deine DrawTimerTimer-Prozedur zu einem Mitglied deiner Formualklasse, dann klappt das (sagt doch auch der Compiler).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|