AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TUpDown: wie lange gedrückt?

Ein Thema von zecke · begonnen am 16. Jan 2007 · letzter Beitrag vom 16. Jan 2007
Antwort Antwort
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#1

TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 14:34



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

Ps: Ich möchte kein SpinEdit verwenden.
mfg zecke
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 14:45
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;
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 15:00
Danke funktioniert einwandfrei!
mfg zecke
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 15:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 15:57
Das sieht eleganter aus, mal sehen, vielleicht modifiziere ich das Ganze noch ein bisschen hinundher

thx
mfg zecke
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TUpDown: wie lange gedrückt?

  Alt 16. Jan 2007, 16:28
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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