Im Setter führe ich Aktioneneigentlich immer nur dann aus, wenn der Wert sich auch verändert hat. Dadurch läßt sich hier z.B. ein zirkulärer Aufruf von SetValue und TrckChange stoppen.
Delphi-Quellcode:
procedure TLabTrackBar.TrckBarAnpassung(TrackBar: TMouseTrackBar);
begin
TrackBar.Width := Width - 20;
TrackBar.Height := Height - 15;
TrackBar.Left := 10;
TrackBar.Top := 12;
if Assigned(FLblTrckBar) and Assigned(FTrckBar) then
begin
FLblTrckBar.Caption := floattostr(FTrckBar.Position * FScaleFactor) + FsLabelAdd;
LblAnpassung(FLblTrckBar);
end;
end;
procedure TLabTrackBar.LblAnpassung(FLabel: TLabel);
begin
if Assigned(FLblTrckBar) and Assigned(FTrckBar) then
FLblTrckBar.Left := Round((FTrckBar.Left + 11 - FLblTrckBar.Width / 2) +
(FTrckBar.Position / (FTrckBar.Max - FTrckBar.Min) * (FTrckBar.Width - 22)));
end;
procedure TLabTrackBar.Resize;
begin
inherited Resize;
TrckBarAnpassung(FTrckBar);
// LblAnpassung(FLblTrckBar); unnötig, geschieht in TrckBarAnpassung.
// warum werden überhaupt die eigenen Felder übergeben?
end;
procedure TLabTrackBar.SetValue(dValue: Double);
begin
if dValue <> FdValue then
begin
FdValue := dValue;
if Assigned(FTrckBar) then
FTrckBar.Position := Round(FdValue / FScaleFactor);
LblAnpassung(FLblTrckBar);
end;
end;
procedure TLabTrackBar.TrckChange(Sender: TObject);
begin
SetValue(FTrckBar.Position * FScaleFactor);
end;
Grüsse, Dirk