So, noch mal eine Nacht darüber geschlafen...
Also, ich möchte den Spinedit sowohl für die Maus- als auch für die Editeingabe (be)nutzen.
*Gibt (gäbe) es eine Eigenschaft "TimerSpeedButton (nicht) gedrückt" (egal, ob ich in dieser Klasse oder "extern" ermittelt, extern reicht es aus zu ermitteln, ob die (linke?!) Maustaste gedrückt ist oder nicht), dann kann (könnte) ich nur das Ereignis "OnChange" mit eben dieser Eigenschaft auswerten. Nur, wenn der Mausdruck vorbei ist, dann gibt es eben kein OnChange mehr (s. weiter oben).
Gibt (gäbe) es das Ereignis "TTimerSpeedButton.OnMouseUp", dann sind (wären) die Editeingaben nicht mit erfaßt, und ich stehe (stünde) zusätzlich vor obigem, mit * markiertem Problem. Ich müßte zwei Ereignisbehandlungsroutinen auswerten (die allerdings in eine gemeinsame Prozedur münden könnten).
Bummi, ich versuchte Deine Idee auch auf den im Beitrage weiter oben genannten Plattformen umzusetzen, aber es findet beim Dauermaustastendruck leider immer noch das unerwünschte "Dauerfeuer" statt. Ich setzte das so um:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin;
type
TForm1 =
class(TForm)
SpinEdit1: TSpinEdit;
procedure ApplicationEvents1Message(
var Msg: tagMSG;
var Handled: Boolean);
procedure SpinEdit1Change(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var FMouseDown:boolean;
procedure TForm1.ApplicationEvents1Message(
var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message= WM_LBUTTONDOWN
then FMouseDown := true
else if Msg.message= WM_LBUTTONUP
then FMouseDown := false
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
if not FMouseDown
then windows.beep(200+random(1000),100)
end;
end.
Ist daran etwas falsch?
Himitsu (=Geheimnis), Deine Idee ist simpel, erschlägt aber all' die o.g. Probleme auf ziemlich triviale Weise (muß man aber auch erst einmal darauf kommen) und ist so gesehen doch von ganz eigener Eleganz. Sie funktioniert ab ca. 110(+x) ms Timerintervall, wohl abhängig von der Computergeschwindigkeit. Das hat sicher mit RepeatPause=100 zu tun. Wundert mich nur, daß es auch für die Verzögerung nach dem ersten Klick, implementiert als InitRepeatPause=400 genauso funktioniert (also, daß der Timer sich nicht meldet).
Also noch einmal danke, ggf. auch im voraus für weitere Beiträge.