Ich nutze normalerweise "OnMouseWheel". Und dort hole ich mir den tatsächlichen Wert mit "WheelOffset := AMessage.WheelDelta / WHEEL_DELTA". Das Vorzeichen gibt dann Auskunft darüber, in welche Richtung das
Rad gedreht wurde. WHEEL_DELTA ist eine Konstante von Windows (glaube 120). Als Ergebnis erhalte ich dann die Anzahl der Rasten...
OnMouseWheelUp und OnMouseWheelDown werden mit jedem Raster immer genau so of aufgerufen wie in Windows bei den Mauseinstellungen die "Zeilen, die gleichzeitig gescrollt werden sollen" eingestellt ist.
Das mit Deiner Funktion geht so eh nicht. Due deklarierst einen lokalen Integer, der nicht initialisiert ist und inkrementierst diesen. Beim verlassen der Funktion wird dieser wieder freigegeben. Entweder "zaehler" als class member definieren oder - falls nur zum Testen - außerhalb der Methode (z.B. vor dem "procedure") deklarieren...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)