| Autor |
Beitrag |
P@u1
      
Beiträge: 117
|
Verfasst: Mo 23.08.10 17:31
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 23.08.10 17:34
Du könntest glaub ich auch einfach das OnTimer-Ereignis überschreiben.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
P@u1 
      
Beiträge: 117
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 27.08.10 18:16
Application.OnIdle wär auch eine Option.
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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 
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|