Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.203 Beiträge
 
Delphi 12 Athens
 
#2

Re: Problem Trackbar bass.dll

  Alt 28. Aug 2008, 16:23
Erstmal das Problem mit dem Timer:

Wenn über den die Position geändert wird, ruft dieses wiederum OnChange auf, was also die Position im BASS ändert und bei gerundeten Werten, sowie einer weiterlaufenden Zeit im BASS, zu netten nebenwirkungen führt.

Du mußt einfach nur irgendwie verhinden, daß OnChange nicht ausgeführt wird, wenn dieses vom Programm verursacht wurde.
Delphi-Quellcode:
(* Update der Progressbar *)
procedure TRecordForm.RecordTimerTimer(Sender: TObject);
  // var t: integer; = wo wird T verwendet?
  begin
    ProgressBar.OnChange := nil;
    ProgressBar.Position := Round((BASS_ChannelGetPosition(chan, BASS_POS_BYTE)
      / BASS_ChannelGetLength(chan, BASS_POS_BYTE)) * 100);
    ProgressBar.OnChange := ProgressBarChange;
  end; // procedure RecordTimerTimer
oder
Delphi-Quellcode:
(* Update der Progressbar *)
// irgendwo irgendeine Variable definieren
var OnChangeGesperrt: Boolean;

procedure TRecordForm.RecordTimerTimer(Sender: TObject);
  // var t: integer; = wo wird T verwendet?
  begin
    OnChangeGesperrt := true;
    ProgressBar.Position := BASS_ChannelGetPosition(chan, BASS_POS_BYTE) * 100
      div BASS_ChannelGetLength(chan, BASS_POS_BYTE));
    OnChangeGesperrt := false;
  end; // procedure RecordTimerTimer

(* Position via ProgressBar ändern *)
procedure TRecordForm.ProgressBarChange(Sender: TObject);
begin
  if OnChangeGesperrt then Exit;
  ...
[add]
mal 'ne Frage: Warum wird in .RecordTimerTimer die Position für BASS_ChannelGetPosition anders berechnet (bei wenn Pause und wenn nicht)


[add2]
Vorschlag:
Delphi-Quellcode:
(* Position via ProgressBar ändern *)
procedure TRecordForm.ProgressBarChange(Sender: TObject);
var B: Boolean;
begin
  B := BASS_ChannelIsActive(chan) = BASS_ACTIVE_Playing;
  if B then BASS_ChannelPause(chan);
  BASS_ChannelSetPosition(chan, ProgressBar.Position
    * BASS_ChannelGetLength(chan, BASS_POS_BYTE) div 100, BASS_POS_BYTE);
  if B then BASS_ChannelPlay(chan, False);
end; // procedure ProgressBarChange
PS: das langsame Round und die zugehörigen Fließkommarechenoperationen kannst'e getrost weglassen, wenn du mit den rechenoperationen bei Intergerrechenoperationen bleibst
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat