Autor Beitrag
P@u1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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:

ausblenden 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

{ MyTimer }

procedure tMyTimer.Timer;
begin
  // Mache hier was du willst

  inherited// Löst OnTimer aus
end;

end.


Wenn du hingegen nur eine Funktion Regelmäßig aufrufen willst, dann musst du wie user profile iconelundril 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mi 25.08.10 18:34 
Hi,
user profile iconP@u1 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 27.08.10 18:16 
Application.OnIdle wär auch eine Option.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 28.08.10 11:30 
Moin!

user profile iconjaenicke 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)