procedure SetLabelTemps(const RefreshProgress : boolean = true);
var
t1, t2, t3: single;
begin
with form1 do begin
// Met à jours la barre de progression
if RefreshProgress then ProgressBar1.Position := BASS_ChannelGetPosition(Channel);
// Met à jours le temps de lecture
t1 := BASS_ChannelBytes2Seconds(Channel, ProgressBar1.Position);
t2 := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel));
t3 := t2 - t1;
with LabelTemps do begin
case Tag of
0: Caption := format('-%s',[TimeToStr(t3 / 86400)]);
1: Caption := TimeToStr(t1 / 86400);
2: Caption := TimeToStr(t2 / 86400);
end;
end;
end;
end;
- et remplacer les procedures Time2Timer, LabelTempsMouseDown et ProgressBar1MouseMove par :
procedure TForm1.Timer2Timer(Sender: TObject);
begin
SetLabelTemps;
with Timer2 do
if t3 <= 0.5 then Interval := 10
else Interval := 500;
if t1 = t2 then LectureNext;
end;
procedure TForm1.ProgressBar1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssLeft in Shift then
begin
ProgressBar1.Position := Round(X / (ProgressBar1.Width - 4) * ProgressBar1.Max);
BASS_ChannelSetPosition(Channel, ProgressBar1.Position);
SetLabelTemps(false);
end;
end;
voila ... mmm vus les modif qu'il y a faire, envoie moi ton email par message privé et comme ça je pourrais te transmettre les modif sans devoir recréer a chaque fois un sujet.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 18 déc. 2005 à 10:10
c'est du delphi ... ça va etre chaud de liberer de la ram.
a moins de le faire en mode shell ... #sig#
tu peu deja optimiser completement le code, virer ce qui n'est pas necessaire.
cs_flagada
Messages postés60Date d'inscriptionjeudi 8 mai 2003StatutMembreDernière intervention18 février 2011 16 déc. 2005 à 20:15
Merci pour vos conseils, j'ai adopté le code de FOXI et j'ai fais une mise à jours de la source.
Par contre je me demandais comment tu mesurais les 385ms ??
Est-ce que vous auriez des conseils simple pour libérer le plus de mémoire possible ? (chez moi le prog prend entre 7 et 8Mo de RAM)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 15 déc. 2005 à 04:11
ARF ARF!
VEXT est sensé etre un ensemble d'ou le const VEXT = ['','']
mais je crois que ça ne fonctionne pas avec les type STRING vus que des strings ne peuvent etre de type ordinal ...
function ValidExt(const filename : string) : boolean;
var
X : integer;
E : string[5];
const
VEXT : array[0..8] of string[5] = ('.mp3','.ogg','.wma','.wav','.mpc','.aiff','.aif','.mp2','.mp1');
begin
E := LowerCase(ExtractFileExt(filename));
for X := 0 to 8 do begin
// ou // for X := Low(VEXT) to High(VEXT) do begin
if E = VEXT[X] then begin
result := true;
exit;
end;
end;
result := false;
end;
Je pense que c'est des parenthèses, sinon il croit que tu veu declarer un tableau...
cs_flagada
Messages postés60Date d'inscriptionjeudi 8 mai 2003StatutMembreDernière intervention18 février 2011 14 déc. 2005 à 19:21
C'est vrai qu'il y'a pas mal de code, en même temps y'a pas mal de fonctions à intégrer (apparition progressive, liste des répertoires, liste de lecture, hotkey, lecture des mp3, etc...).
J'ai relu tout le code aujourd'hui et j'ai amélioré pas mal de trucs. Par contre j'ai pas pu faire ce que tu m'avais dit: quand je déclare const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
il me marque une erreur "Type ordinal requis" ??
Si tu as des améliorations et des suggestions n'hésite surtout pas (et les autres aussi), ça m'aidera à progresser :-)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 déc. 2005 à 06:46
non justement, les traitements chaine = chaine + chaine + chaine sont trés lourd pour delphi et l'utilisation de format est beaucoup plus rapide.
maintenant tu peu toujours faire des tests de charge entre les deux methodes pour voir laquelles est la plus rapide.
par contre pour la fonction ValidExt, c'est sur et certain que c'est mieux.
j'ai remarquer deux ou trois chose encore dans ce style dans ton code, mais tu trouveras surrement de quoi il s'agit.
j'ai remarquer qu'il y avait beaucoup de code, et ce qui me donne envie de regarder en details pour voir pourquoi il y'en a autant et pondre, si possible des ameliorations.
cs_flagada
Messages postés60Date d'inscriptionjeudi 8 mai 2003StatutMembreDernière intervention18 février 2011 13 déc. 2005 à 22:38
Merci pour les conseils, je vais en tenir compte.
Même s'il ne me semble pas vraiment beaucoup plus clair de mettre
t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
à la place de
t := Parent.Parent.Parent.Text + '\' + Parent.Parent.Text + '\' + Parent.Text + '\' + Text;
Surtout que même si l'écriture est un peu plus lourde, je pense que le programme effectue moins de calcul avec la deuxième écriture non ?
Mais pour le "with MyTreeNode1 do begin" et le "VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];" t'as parfaitement raison c'est bcp mieux avec !
merci :)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 13 déc. 2005 à 12:49
juste un conseil, pour augmenter un peu la rapiditée de certaines routines remplace :
if MyTreeNode1.Level = 0 then t := MyTreeNode1.Text;
if MyTreeNode1.Level = 1 then t := MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 2 then t := MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 3 then t := MyTreeNode1.Parent.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
et autre ligne du genre par :
with MyTreeNode1 do begin
case Level of
0:t:=Text;
1:t:=format('%s\%s',[Parent.Text,Text]);
2:t:=format('%s\%s\%s',[Parent.Parent.Text,Parent.Text,Text]);
3:t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
end;
end;
Remplacer egalement les codes lourd et redondant par des fonctions plus simple et rapide :
comme par exemple :
if (UpperCase(ExtractFileExt(sr.name)) = '.WAV') or
(UpperCase(ExtractFileExt(sr.name)) = '.AIFF') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP3') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP2') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP1') or
(UpperCase(ExtractFileExt(sr.name)) = '.OGG') or
(UpperCase(ExtractFileExt(sr.name)) = '.WMA') or
(UpperCase(ExtractFileExt(sr.name)) = '.MPC') then
remplacer par :
function ValidExt(const filename : string) : boolean;
// ensemble des extentions supportées
const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
begin
// si l'extention se trouve dans l'ensemble
if UpperCase(ExtractFileExt(filename)) IN VEXT then
result := true
else
result := false;
end;
et declarer le IF de cette façon :
if ValidExt(sr.name) then ... code ...
voila, c'est tout ce que j'ai vus pour l'instant car je me suis pas pencher en details.
ça a l'air pas mal en tout cas, je testerais a fond plus tard.
19 févr. 2006 à 15:01
18 déc. 2005 à 10:59
0: Caption := format('-%s',[TimeToStr(t3 / TimeAdj)]);
1: Caption := TimeToStr(t1 / TimeAdj);
2: Caption := TimeToStr(t2 / TimeAdj);
18 déc. 2005 à 10:57
Zip :
- fournir les DCU HotKeyManager et CoolTrayIcon
unit1.pas :
>>> interface champs VAR (variables globale) ajouter :
TimeAdj : integer = 86400;
t1, t2, t3 : single;
>>> procedure TForm1.FormCreate
- mettre aprés "begin" : LongTimeFormat := 'nn:ss';
>>> un peu avant "procedure TForm1.Timer2Timer"
- ajouter :
procedure SetLabelTemps(const RefreshProgress : boolean = true);
var
t1, t2, t3: single;
begin
with form1 do begin
// Met à jours la barre de progression
if RefreshProgress then ProgressBar1.Position := BASS_ChannelGetPosition(Channel);
// Met à jours le temps de lecture
t1 := BASS_ChannelBytes2Seconds(Channel, ProgressBar1.Position);
t2 := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel));
t3 := t2 - t1;
with LabelTemps do begin
case Tag of
0: Caption := format('-%s',[TimeToStr(t3 / 86400)]);
1: Caption := TimeToStr(t1 / 86400);
2: Caption := TimeToStr(t2 / 86400);
end;
end;
end;
end;
- et remplacer les procedures Time2Timer, LabelTempsMouseDown et ProgressBar1MouseMove par :
procedure TForm1.Timer2Timer(Sender: TObject);
begin
SetLabelTemps;
with Timer2 do
if t3 <= 0.5 then Interval := 10
else Interval := 500;
if t1 = t2 then LectureNext;
end;
procedure TForm1.LabelTempsMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetLabelTemps;
end;
procedure TForm1.ProgressBar1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssLeft in Shift then
begin
ProgressBar1.Position := Round(X / (ProgressBar1.Width - 4) * ProgressBar1.Max);
BASS_ChannelSetPosition(Channel, ProgressBar1.Position);
SetLabelTemps(false);
end;
end;
voila ... mmm vus les modif qu'il y a faire, envoie moi ton email par message privé et comme ça je pourrais te transmettre les modif sans devoir recréer a chaque fois un sujet.
18 déc. 2005 à 10:10
a moins de le faire en mode shell ... #sig#
tu peu deja optimiser completement le code, virer ce qui n'est pas necessaire.
16 déc. 2005 à 20:15
Par contre je me demandais comment tu mesurais les 385ms ??
Est-ce que vous auriez des conseils simple pour libérer le plus de mémoire possible ? (chez moi le prog prend entre 7 et 8Mo de RAM)
15 déc. 2005 à 04:11
VEXT est sensé etre un ensemble d'ou le const VEXT = ['','']
mais je crois que ça ne fonctionne pas avec les type STRING vus que des strings ne peuvent etre de type ordinal ...
solution (avec tableau) : perf(M = 385ms / 5x100KRq)
function ValidExt(const filename : string) : boolean;
var
X : integer;
E : string[5];
const
VEXT : array[0..8] of string[5] = ('.mp3','.ogg','.wma','.wav','.mpc','.aiff','.aif','.mp2','.mp1');
begin
E := LowerCase(ExtractFileExt(filename));
for X := 0 to 8 do begin
// ou // for X := Low(VEXT) to High(VEXT) do begin
if E = VEXT[X] then begin
result := true;
exit;
end;
end;
result := false;
end;
voila une solution rapide et fiable.
14 déc. 2005 à 21:42
(Désoler du double post...)
14 déc. 2005 à 21:40
const VEXT = ('.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC');
Je pense que c'est des parenthèses, sinon il croit que tu veu declarer un tableau...
14 déc. 2005 à 19:21
J'ai relu tout le code aujourd'hui et j'ai amélioré pas mal de trucs. Par contre j'ai pas pu faire ce que tu m'avais dit: quand je déclare const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
il me marque une erreur "Type ordinal requis" ??
Si tu as des améliorations et des suggestions n'hésite surtout pas (et les autres aussi), ça m'aidera à progresser :-)
14 déc. 2005 à 06:46
maintenant tu peu toujours faire des tests de charge entre les deux methodes pour voir laquelles est la plus rapide.
par contre pour la fonction ValidExt, c'est sur et certain que c'est mieux.
j'ai remarquer deux ou trois chose encore dans ce style dans ton code, mais tu trouveras surrement de quoi il s'agit.
j'ai remarquer qu'il y avait beaucoup de code, et ce qui me donne envie de regarder en details pour voir pourquoi il y'en a autant et pondre, si possible des ameliorations.
13 déc. 2005 à 22:38
Même s'il ne me semble pas vraiment beaucoup plus clair de mettre
t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
à la place de
t := Parent.Parent.Parent.Text + '\' + Parent.Parent.Text + '\' + Parent.Text + '\' + Text;
Surtout que même si l'écriture est un peu plus lourde, je pense que le programme effectue moins de calcul avec la deuxième écriture non ?
Mais pour le "with MyTreeNode1 do begin" et le "VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];" t'as parfaitement raison c'est bcp mieux avec !
merci :)
13 déc. 2005 à 12:49
if MyTreeNode1.Level = 0 then t := MyTreeNode1.Text;
if MyTreeNode1.Level = 1 then t := MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 2 then t := MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 3 then t := MyTreeNode1.Parent.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
et autre ligne du genre par :
with MyTreeNode1 do begin
case Level of
0:t:=Text;
1:t:=format('%s\%s',[Parent.Text,Text]);
2:t:=format('%s\%s\%s',[Parent.Parent.Text,Parent.Text,Text]);
3:t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
end;
end;
idem pour :
NomFichierSon := n.Strings[n.count - 3] + ' - ' + n.Strings[n.count - 2] + ' - ' + Copy(n.Strings[n.count - 1], 1, Length(n.Strings[n.count - 1]) - Length(ExtractFileExt(n.Strings[n.count - 1])))
utilisation de format...
Remplacer egalement les codes lourd et redondant par des fonctions plus simple et rapide :
comme par exemple :
if (UpperCase(ExtractFileExt(sr.name)) = '.WAV') or
(UpperCase(ExtractFileExt(sr.name)) = '.AIFF') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP3') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP2') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP1') or
(UpperCase(ExtractFileExt(sr.name)) = '.OGG') or
(UpperCase(ExtractFileExt(sr.name)) = '.WMA') or
(UpperCase(ExtractFileExt(sr.name)) = '.MPC') then
remplacer par :
function ValidExt(const filename : string) : boolean;
// ensemble des extentions supportées
const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
begin
// si l'extention se trouve dans l'ensemble
if UpperCase(ExtractFileExt(filename)) IN VEXT then
result := true
else
result := false;
end;
et declarer le IF de cette façon :
if ValidExt(sr.name) then ... code ...
voila, c'est tout ce que j'ai vus pour l'instant car je me suis pas pencher en details.
ça a l'air pas mal en tout cas, je testerais a fond plus tard.