Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Nachkomme von TTimer - OnTimer Event zuweisen
P@u1 - Mo 23.08.10 17:31
Titel: Nachkomme von TTimer - OnTimer Event zuweisen
Hi,
ich erstelle mir gerade eine Klasse, die eine Nachkomme von TTimer ist und ich möchte eine Prozedur, die beim OnTimer event aufgerufen wird benutzen.
Ich hab mir jetzt gedacht, ich könnte mir eine solche Prozedur schreiben, und dann den Creator neu machen, so dass im Create diese Prozedur als OnTimer zugewiesen wird.
Aber ich habe mich gefragt, ob das nicht einfacher geht und dachte, ihr könnt mir vll helfen.
Danke schonma!
elundril - Mo 23.08.10 17:34
Du könntest glaub ich auch einfach das OnTimer-Ereignis überschreiben.
lg elundril
Critter - Mo 23.08.10 18:01
Hallo,
wenn du wirklich einen Nachfahren von tTimer machen willst, also eine Klasse die alles kann was tTimer kann noch ein bisschen mehr, dann solltest du das OnTimer-Event
nicht nutzen. Denn dieses ist für Leute die deine Klasse verwenden, damit die noch eine Regelmäßige Aktion ausführen können.
Wenn du eine Klasse ableitest solltest du immer die Methode überschreiben, die das Event aufruft, in diesem Fall ist es die Procedure "Timer" (wie ein Blick in die Quelltexte von tTimer offenbart).
Deine Ableitung sollte also ungefähr so aussehen:
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:
| unit Unit2;
interface
Uses ExtCtrls;
Type tMyTimer = class(tTimer) protected procedure Timer; override; End;
implementation
procedure tMyTimer.Timer; begin inherited; end;
end. |
Wenn du hingegen nur eine Funktion Regelmäßig aufrufen willst, dann musst du wie
elundril richtig feststellte gar keine Ableitung machen, sondern nur das OnTimer-Ereignis nutzen, dafür ist die Komponente ja da.
critter
P@u1 - Mi 25.08.10 18:10
Ok, ich habe das jetzt mal als Nachfahren von TTimer gelöst.
Allerdings hab ich noch weitere Probleme:
Das ganze soll eine Bildschirmlupe werden.
Dachte mir ich mach jez einen Timer mit Intervall auf 1 ms und dann erstelle ich mir eine Form die rechts oben in die Ecke kommt und immer eine Vergrößerung eines Bereiches um die Maus herum anzeigt.
Gibts da vll auch noch bessere Möglichkeiten?
Ein weiteres Problem ist, dass bei meiner bisherigen Lösung Sachen die auf den Bildschirm gemalt wurden (wie z.B. Form.Canvas.Rectangle) in der Vergrößerung nicht auftauchten.
Methode ist, dass ich einen Screenshot mache und dann per Canvas.CopyRect den richtigen Bereich ausschneide.
Irgenwie frage ich mich gerade, ob ich nicht vll lieber von TForm abgeleitet hätte als von TTimer.
Ich wollte jetzt den Creator von Timer überschreiben und dann dabei noch eine Form erstellen, nur irgendwie bekomme ich es nicht.
Edit: Das mit dem Creator hab ich jetzt hinbekommen!
Critter - Mi 25.08.10 18:34
Hi,
P@u1 hat folgendes geschrieben : |
| Irgenwie frage ich mich gerade, ob ich nicht vll lieber von TForm abgeleitet hätte als von TTimer. |
ich frage mich, wieso du überhaupt eine Ableitung von einem der Beiden machen willst? Ich fürchte deine Ansätze sind hier gelinde gesagt ziemlich Exotisch. Vielleicht solltest du lieber (in einem eigenen Topic in der richtigen Sparte) einmal einer Diskussion starten wie so etwas am besten um zu setzen ist. Wenn man es anständig machen möchte wird da viel WinAPI Kram reinspielen, das habe ich aber alles nicht im Kopf, so das ich keine konkreten hinweise geben kann.
Generell würde ich einen Timer für so etwas aber vergessen, ich würde mich bemühen mich über jede Mausbewegung informieren zu lassen und immer wenn eine solche registriert wird meinen Screenshot machen. Auch wird es einiges geben wo du um es zu Vergrößern ziemliche Klimzüge machen musst weil es direkt von der Grafikkarte und nicht von Windows gezeichnet wird. Solche Dinge wirst du wahrscheinlich insbesondere bei Videos und Spielen haben. Aber auch da kennen sich andere Besser aus. Auf jeden Fall beides eigene Themen die du in eigenen Topics klären solltest.
Das wichtigste scheint mir aber tatsächlich zu sein, dass du dir Grundlagen aneignest um überhaupt eine Sinnvollen Weg zur Realisierung deines Projektes erkennen zu können.
critter
delfiphan - Fr 27.08.10 18:16
Application.OnIdle wär auch eine Option.
jaenicke - Fr 27.08.10 19:06
Und mal von allem anderen abgesehen:
In einer eigenen Klasse einen TTimer zu verwenden ist meistens kaum sinnvoll. Mittels SetTimer kann man das ganz schnell direkt einbauen und ist damit flexibler als mit TTimer.
Davon abgesehen ist ein Timer hier wohl kaum sinnvoll, das stimmt sicher, aber als Übung mag sowas ok sein. Ernsthaft nutzen ist ne ganz andere Sache.
der organist - Sa 28.08.10 10:42
kann jaenicke da nur zustimmen. Nimm dir doch das OnMove Event von der Form vor. Spart garantiert ne Menge Speicher und die Maus-Koordinaten hast du da auch gleich dabei ;)
Hidden - Sa 28.08.10 11:30
Moin!
jaenicke zustimmen kann ich auch, nur würde ich es dann wirklich mit dem Windows-Timer machen(wie er schrieb).
OnMouseMove kann sinnvoll sein, aber dann, wenn sich auch wirklich dann und nur dann etwas ändern soll.
lg,
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!