TrackBar, Timer und OnChange

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TrackBar, Timer und OnChange

Beitrag von Mathias »

Ich habe folgendes Problem, das OnChange Ereigniss der TrackBar wird ausgelöst, wen ich die Bar mit der Maus ändere, was auch gut ist. Nur wird das Ereigniss auch ausgelöst, wen die Bar über den Timer verstellt wird.
Dies habe ich jetzt umgangen, in dem ich OnChange vor der Timeränderung auf nil setzte.
Dies würde so funktionieren.

Nun zu Frage macht man dies so, oder gibt es da eine bessere Lösung ?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Max := 10000;
  Timer1.Interval:=20;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  p: integer;
  oc: TNotifyEvent;
begin
  oc := TrackBar1.OnChange;
  TrackBar1.OnChange := nil;
  p := TrackBar1.Position;
  Inc(p, 3);
  if p >= TrackBar1.Max then  begin
    p := 0;
  end;
  TrackBar1.Position := p;
  TrackBar1.OnChange := oc;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  WriteLn('change');  // Zur Überprüfung
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: TrackBar, Timer und OnChange

Beitrag von six1 »

Hi Mathias,
das "OnChange " ist ja kein "OnChangebyUser" oder "OnChangebyTimer" insofern ist die Aktion völlig richtig, dass bei einer Änderung von "position" das Ereignis ausgelöst wird.
Ich handhabe das genau so wie Du und schreibe die Ereignisbehandlung auf NIL.
Gruß, Michael

Antworten