Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TUpDown: wie lange gedrückt? (https://www.delphipraxis.net/84392-tupdown-wie-lange-gedrueckt.html)

zecke 16. Jan 2007 13:34


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.

cruiser 16. Jan 2007 13:45

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;

zecke 16. Jan 2007 14:00

Re: TUpDown: wie lange gedrückt?
 
Danke :thumb: funktioniert einwandfrei! :stupid:

cruiser 16. Jan 2007 14:22

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;

zecke 16. Jan 2007 14:57

Re: TUpDown: wie lange gedrückt?
 
Das sieht eleganter aus, mal sehen, vielleicht modifiziere ich das Ganze noch ein bisschen hinundher ;)

thx :thumb:

cruiser 16. Jan 2007 15:28

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:
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.
Verwendung:
Delphi-Quellcode:
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;
Kein Resetten auf 1, Kein Init und überall verwendbar ;)

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 00:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz