Newsgroup: it.comp.lang.delphi
Titolo: Come si fa un Contatore?

Ho necessità alla pressione di un button che un contatore inizi a contare il
tempo di quanto tempo tengo premuto il button e mi visualizzi il tempo su
una label, poi quando rilascio il button il contatore smetta di contare e m
i visualizzi sulla stessa label il conteggio finale, poi alla successiva
pressione del button reinizzi da zero il conteggio.
Insomma un contatore che controlli quanto tempo tengo premuto il
button........
Ho provato con i cicli for, if, while ma nn ci sono riuscito................
Grazie.........

 button........
Lascia perdere i cicli. Usa GetTickCount.
GetTickCount restituisce il numero di millisecondi da quando è partito il
PC.
Usa una variabile booleana (per esempio ButtonDown) per tenere traccia dello
stato della pressione del pulsante.
Al tempo stesso memorizzi da qualche parte il risultato di GetTickCount.
Quando rilasci il pulsante setti la variabile booleana (ButtonDown) a false
e richiami nuovamente il GetTickCount.
La differenza tra il valore restituito dal secondo GetTickCount ed il primo
ti da i millisecondi trascorsi dalla pressione al rilascio.
--
Acqua

button........
se usi il mouse per tenere premuto il button:
var
  tempo : cardinal;
procedure TForm1.Button1MouseDown(bla bla);
begin
   tempo := gettickcount
end;
procedure TForm1.Button1MouseUp(bla bla);
begin
  tempo := GetTickCount - tempo;
  ShowMessageFmt('secondi: %f',[tempo/1000]);
end;
se usi i tasti invece usa gli eventi onkeyup e onkeydown
-- 
---====งงง====----
www.provailtuoprovider.org
zrgny...@atv.vg
[rot13]

Con una conta-siringa?
--
Marco Kregar
marco....@FirebirdSQL.it
www.FirebirdSQL.it
"over the bench the goat sings, under the bench the goat dies"

 riuscito................ 
ti propongo questo esempio (suscettibile di miglioramenti), fatto con un 
thread (magari ti può essere utile, anche per altre cose).
Solo un paio di cosette per farlo funzionare:
1) crea un'applicazione nuova;
2) sostituisci TUTTO il codice della unit della form e con il codice 
   sottostante di UNIT1;
3) aggiungi una nuova unit al progetto;
4) sostituisci tutto il codice della nuova unit con il codice sottostante 
   di UNIT2.
{******* UNIT1 ***************}
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
  Forms, Dialogs, StdCtrls, 
  UNIT2;
type
  TForm1 = class(TForm)
  private
    FCounter: TThreadedCounter;
    FButton: TButton;
    procedure ShowCounter(const Count: Integer);
    procedure MyButtonClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
constructor TForm1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FButton:= TButton.Create(Self);
  with FButton do
  begin
    Left:= 30;
    Top:= 20;
    Caption:= 'Go!';
    Parent:= Self;
    OnClick:= MyButtonClick;
  end;
  Width:= 200;
  Height:= 100;
  FCounter:= TThreadedCounter.Create(True);
  FCounter.OnUpdate:= ShowCounter;
end;
destructor TForm1.Destroy;
begin
  FCounter.Free;
  inherited Destroy;
end;
procedure TForm1.MyButtonClick(Sender: TObject);
begin
  with FCounter do
    if Suspended then
      begin
        Reset;
        Resume;
      end
    else
      Suspend;
end;
procedure TForm1.ShowCounter(const Count: Integer);
begin
  FButton.Caption:= FormatFloat('0.0 secondi', Count / 1000);
  Caption:= FButton.Caption;
end;
end.
{******* FINE UNIT1 ************************}
{********INIZIO UNIT2 **********************}
unit Unit2;
interface
uses
  Classes;
type
  TUpdateEvent = procedure (const i: Integer) of object;
  TThreadedCounter = class(TThread)
  private
    FOnUpdate: TUpdateEvent;
    FCount: Integer;
    procedure DoUpdate;
  protected
    procedure Execute; override;
  public
    procedure Reset;
    property OnUpdate: TUpdateEvent read FOnUpdate write FOnUpdate;
  end;
implementation
uses Windows;
const
  DELAY   = 100;   //ritardo dell'aggiornamento in millisecondi
{ TMyCounter }
procedure TThreadedCounter.DoUpdate;
begin
  if Assigned(FOnUpdate) then
    FOnUpdate(FCount)
end;
procedure TThreadedCounter.Execute;
var
  c: Cardinal;
begin
  while not Terminated do
  begin
    c:= GetTickCount;
    if FCount >= High(Integer) then
      FCount:= 0;
    Sleep(DELAY);
    Inc(FCount, GetTickCount - c);
    Synchronize(DoUpdate);
  end;
end;
procedure TThreadedCounter.Reset;
begin
  FCount:= 0;
end;
end.
{******FINE UNIT2 *********************}
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 Ho necessità alla pressione di un button che un contatore inizi a contare
il
cut