Probleme mit Gültigkeitsbereich von Variablen in Klassen
-
Hy,
ich hab eine Klasse, welche unter anderem das Attribut timerID hat. Fuer dieses Attribut bestehen Setter und Getter.
Eine Bestimmte Methode (startet fuehrt u.a. folgenden Code aus:setTimerID( SetTimer(NULL ,1,1000, (TIMERPROC)OnTimer));Die Entsprechende Funktion sieht so aus:
void CALLBACK OnTimer(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD d){ static int a = 0; a++; if (idEvent == getTimerID()) { ShowMessage(IntToStr(a)); } }Die obige Funktion steht in der cpp der Klasse.
Ich bekomme nun (logischerweise) den folgendne Fehler:
*
[C++ Fehler] TMy_win.cpp(11): E2268 Aufruf der undefinierten Funktion 'getTimerID'*Mir ist klar, dar die Funktion ja nicht zur Klasse gehoert, er die Methode getTimerID auch nicht findet.
Doch wie kann ich darauf zugreifen, oder das Problem umgehen?
-
Da du hier im VCL-Forum bist, warum verwendest du denn nicht die Komponente TTimer?
Bei deinem Code müßtest du entweder auch die GetTimerId-Methode als statisch deklarieren oder aber wiederum eine statische globale Variable deklarieren, in der du die Klasseninstanz speicherst.
Also nimm besser die TTimer-Komponente...
-
Ich verwende nicht den TTimer weil ich dafuer wieder soweit mein Verstaendnis ist eine Form brauche. Hab aber die Klasse in einer separaten Datei und möchte dies sauber lösen und nicht wegen des Timers auf ein Form-Objekt zurückgreifen (habe es so auch noch nicht hinbekommen).
Ich hab die GetTimerID als static deklariert, danach musste ich auch das Attribut timerID als static kompilieren. Jetzt bekomme ich den Fehler:
[Linker Fehler] Error: Ungelöste externe 'TMy_win::timerID' referenziert von C:\...\TMY_CLASS.OBJ
Auch glaub ich dass es sich so nicht lösen lässt oder? ICh brauche ja das Attribut eines bestimmten Objekts der Klasse, also z.b. obj1.getTimerID(), was aber durch static dann nicht mehr gewährleistet ist.
Für einen kurzen Code-Hint wäre ich dankbar.
-
Nein, für die TTimer-Komponente brauchst du nicht extra eine Form.
Einfach ein Objekt in deiner Klasse definieren:
class MyClass { ... private: TTimer * timer; ... public: void __fastcall onTimer(TObject *Sender); ... }; MyClass:MyClass() { ... timer = new TTimer( 0 ); timer->Enabled = false; timer->OnTimer = onTimer; ... } void __fastcall MyClass::onTimer(TObject *Sender) { // whatever } ... // nicht vergessen wieder aufzuräumen MyClass:~MyClass() { ... delete timer; ... }Und zum einsetzten des Timers einfach folgendes machen:
timer->Interval = 5000; // whatever timer->Enabled = true;hf
-
Das funktioniert wunderbar, danke.
Rein aus Interesse, wie hätte ich das mit meinem Ansatz (SetTimer und timerID als Attribut) lösten können?