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