![]() |
TUpDown: wie lange gedrückt?
:hi:
Ich habe ein UpDown mit einem Edit verbunden und alles funktioniert soweit. Mein Problem ist: Wie bekomme ich heraus, wie lange ein Pfeil beim UpDown gedrückt gehalten wird? Ich möchte nach ca 2 Sekunden die Eigenschaft 'Increment' erhöhen und benötige das dafür. Ich habe mit den Ereignissen 'OnMouseDown' etc. vom UpDown und TTimer herumgewurschtelt, aber es will nicht, wie ich will. Wie kann ich das am geschicktesten lösen? Danke im voraus :mrgreen: Ps: Ich möchte kein SpinEdit verwenden. |
Re: TUpDown: wie lange gedrückt?
Meine Lösung wäre:
auf der Form privat deklarieren:
Delphi-Quellcode:
private
fUpDownPressedAt: Cardinal; Und dann die Ereignisse nutzen:
Delphi-Quellcode:
procedure TForm1.UpDown1Changing(Sender: TObject;
var AllowChange: Boolean); var fDelta : Cardinal; begin fDelta := GetTickCount - fUpDownPressedAt; case fDelta of 0..1000: UpDown1.Increment := 1; 1001..2000: UpDown1.Increment := 2; 2001..3000: UpDown1.Increment := 3; 3001..4000: UpDown1.Increment := 4; 4001..5000: UpDown1.Increment := 5; 5001..9999: UpDown1.Increment := 6; end; end; procedure TForm1.UpDown1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin fUpDownPressedAt := GetTickCount; end; procedure TForm1.UpDown1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin UpDown1.Increment := 1; end; |
Re: TUpDown: wie lange gedrückt?
Danke :thumb: funktioniert einwandfrei! :stupid:
|
Re: TUpDown: wie lange gedrückt?
Nach ein bisschen probieren find ich die Kurve für Zehnerpotenzen am besten:
Delphi-Quellcode:
case (GetTickCount - fUpDownPressedAt) of
0..3999: udCredits.Increment := 1; 4000..6999: udCredits.Increment := 10; 7000..8999: udCredits.Increment := 100; 9000..9999: udCredits.Increment := 1000; end; |
Re: TUpDown: wie lange gedrückt?
Das sieht eleganter aus, mal sehen, vielleicht modifiziere ich das Ganze noch ein bisschen hinundher ;)
thx :thumb: |
Re: TUpDown: wie lange gedrückt?
Und noch ne Runde... merkt man, dass ich grad nix zu tun hab?
Ne Unit zum immer wieder verwenden:
Delphi-Quellcode:
Verwendung:
unit cruSpeedup;
interface uses Windows; function _cruSpeedupGetInc: Integer; function _cruSpeedupRelease: Integer; implementation var fPressed: Cardinal; fInited: Boolean; const mxCrd = High(Cardinal); // time since pressed in msec itm10 = 2000; // increases 10 itm100 = 5000; // increases 100 itm1k = 9000; // increases 1000 itm10k = 14000; // increases 10000 itm100k = 20000; // increases 100000 function _cruSpeedupGetInc: Integer; begin if not fInited then begin fPressed := GetTickCount; fInited := True; end; case (GetTickCount - fPressed) of 0..itm10-1 : Result := 1; itm10..itm100-1 : Result := 10; itm100..itm1k-1 : Result := 100; itm1k..itm10k-1 : Result := 1000; itm10k..itm100k-1 : Result := 10000; itm100k..mxCrd : Result := 100000; end; end; function _cruSpeedupRelease: Integer; begin fInited := False; Result := 1; end; initialization _cruSpeedupRelease; end.
Delphi-Quellcode:
Kein Resetten auf 1, Kein Init und überall verwendbar ;)
uses
cruSpeedup; procedure TForm1.udChange(Sender: TObject; var AllowChange: Boolean); begin (Sender as TUpDown).Increment := _cruSpeedupGetInc; end; procedure TForm1.udRelease(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TUpDown).Increment := _cruSpeedupRelease; end; Have fun Edit: kleines Update (1 Zuweisung weniger ;) ) Edit2: Verallgemeinert und auch für andere Controls mit Integer unterstützung ausgelegt (Increase bis 100.000 ab 20 Sekunden) Edit3: So müsst es laufen.. ganz ohne Reset gehts dann wohl doch nich ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz