VISIOMEM - AFFICHER VOTRE MÉMOIRE

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 17 avril 2008 à 17:25
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 23 avril 2008 à 17:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/46384-visiomem-afficher-votre-memoire

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 avril 2008 à 17:33
Bonjour,
@Philkakou les fichiers .dfm sont dans le zip ...
Essaye de créer toi-même la fiche et de reporter le code sur l'unité de la nouvelle fiche.
Elle comporte 1 timer, 1 barre de progression, un popup menu et un bouton.
Bonne chance !

Cordialement, Bacterius !
cs_philkakou Messages postés 2 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 22 avril 2008
22 avril 2008 à 23:50
Justement, l'erreur de Delphi est la suivante:
Erreur à la création de la fiche. impossible d'ouvrir la fiche
main.dfm fichier spécifié introuvable.
faudrait rajouter les fichiers dfm dans le zip pour disposer de la définition des fenêtres
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 avril 2008 à 21:19
Bonjour,
te donne-t-il un message du genre : "Erreur de lecture Format de flux incorrect" ?

Dans ce cas essaye de prendre juste le code source, et de recréer une fiche :)

Tu fixes la propriété BorderStyle de la fiche, None,
et tu ajoutes un bouton et une barre (nommée Barre) à ta fiche. Je suis désolé que tu n'arrives pas à ouvrir le source. Moi je vis ca chaque fois que je télécharge une source ici [99% des cas :( ] ...

Essaye d'ouvrir le projet à l'aide du fichier .DFM peut-être ?

Bonne chance.

Dis-en plus sur tes messages d'erreur, tes problèmes et on pourra peut être mieux t'aider :)

Cordialement, Bacterius !
cs_philkakou Messages postés 2 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 22 avril 2008
22 avril 2008 à 21:00
J'ai delphi 7
Quand je charge le main.pas Delphi me dit que la fiche correspondante n'existe pas...
Comment faire ?
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 avril 2008 à 19:00
au temps pour moi, c'est anterieur pas ulterieur :)
huhuhu

alors pour le Barre.Min, la VCL standard dispose d'un code propre qui empeche l'execution de tout une portion de code si une propriété se voit alouer toujours la même valeur :

procedure TProgressBar.SetMin(value: integer);
begin
if Value <> fMin then
begin
fMin := Value;
Change;
end;
end;

ou un truc comme ça, mais c'est pas plus mal de le virer, on supprime ainsi un call, un cmp et un jump.

pour le registre :

pas besoin de gerer l'exception, et attention, tu ne librere plus l'instance du TRegistry, donc memory Leak!

au mieux, double bloc try :

with ...create do
try
try
...
except
...
end;
finally
Free;
end;
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 avril 2008 à 20:13
Version 1.1 mise en ligne - finalement je laisse dans Windows\Run sinon j'ai peur que la clé ne serve a rien ^^'

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 avril 2008 à 19:23
Re,
j'ai ajouté des petites optimisation supplémentaires aux conseils que tu m'as donné Foxi :
- j'ai mis le Barre.Min := 0; dans le Form.Create puisque ca ne change jamais ...

- Ajout d'un message d'erreur en cas d'erreur de registre, et alors les options "lancer au démarrage" disparaissent

- Création d'une autre clé (SoftWare\VisioMem) et pas dans (Windows\Run) :)

Voila, qu'en pensez-vous ? je mettrai le zip bientot :)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 avril 2008 à 18:26
Bonjour,
Lol je rectifie donc :
"Version Ulterieure"
Merci foxi
Mais je crois qu'il y a quand meme une erreur dans ton équation ^^' ... ulterieur ne veut-il pas dire "après" ? http://fr.wiktionary.org/wiki/ult%C3%A9rieur :
"
ultérieur

(Familier) Qui se fait après, qui arrive après.
Je me suis réservé la liberté de faire des demandes ultérieures.
J’attendrai encore des renseignements ultérieurs.
La cérémonie a été remise à une date ultérieure."

Merci quand meme d'avoir rectifié mon erreur :p

Cordialement, Bacterius !
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 avril 2008 à 16:51
posterieur = precedente = ulterieure :)
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
17 avril 2008 à 18:53
Urgh
Ok je tiendrai compte de ca dans la version posterieure foxi ^^'
Merci beaucoup :)

Cordialement, Bacterius !
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
17 avril 2008 à 17:25
Correction :

- Pas besoin de variables.
- Toujours executer en mode protégé (try...finally)
- On n'appel jamais Destroy mais Free pour liberer un objet (lire l'aide delphi)
- Attention a respecter l'utilisation correcte de TRegistry.
- OpenKey doit etre une condition d'execution (if ... then)
- On ne touche pas aux clef systeme, appel du "CKINE" a false! pas a true!
- On appel toujours CloseKey a la fin

procedure TForm1.WriteInReg;
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false) then
WriteString('VisioMem_Run_On_Start',ParamStr(0));
CloseKey;
finally
Free;
end;
end;

procedure TForm1.EraseFromReg;
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false) then
if ValueExists('VisioMem_Run_On_Start') then
DeleteValue('VisioMem_Run_On_Start');
CloseKey;
finally
Free;
end;
end;

On ne note jamais les True/False dans les conditions, même si c'est bon, c'est inutile.
if condition true then> if condition thenif condition false then> if not condition then

a respecter aussi pour les While, Repeat until etc.

de plus, afin d'eviter les problemes, il faut egalement jouer avec les propriété enabled des checkboxs.
On ne peu inscrire et désinscrire la clef en même temps!
Egalement toujours laisser des choix Vierge a l'utilisateur (checkbox non checked)

with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false) then
begin
LanceraudmarragedeWindows1.Checked := false;
Supprimerlaclduregistre1.Checked := false;
Supprimerlaclduregistre1.Enabled := ValueExists('VisioMem_Run_On_Start');
LanceraudmarragedeWindows1.Enabled := not Supprimerlaclduregistre1.Enabled;
end;
CloseKey;
finally
Free;
end;

En programmation, qu'on soit francais ou non, les Flags, s'appels toujours des Flags! c'est un terme technique, pas un mots traductible.

Un timer réglé a 1ms ne sert a rien! tu peux regler a 250, 500, 1000 ms. c'est amplement suffisant pour ce genre de trucs.
pour de l'animation on mettrais plutot aux alentours de 40-50ms (25/20Fps)

La boucle du timer peut largement etre améliorée!
n'utilise pas d'integer pour les capacitées! minimum LongWord/DWORD/Cardinal. sinon ton programme affichera n'importe quoi passé les 2Go de ram (ce qui est le cas de beaucoup de monde).

pas besoin d'une fonction externe pour le calcul du %, en le mettant en clair dans la routine on permet au compilateur de faire sa petite optimisation.

toujours pour le %, le type extended est beaucoup trop grand pour ça!
un % ne depasse jamais 100 dans ce cas precis et la precision a 1 suffit amplement (point trop n'en faut) donc single (FLOAT 32 bits).

Toujours dans ce cas precis, les nombreux appel a IntToStr, FormatFloat, etc ralentissent ta routine. un bon vieux Format permet de gagner un peu de performance et donc de ne pas occuper le CPU pour rien.

La selection du format d'affichage des capacitées (Mo, Ko, O) :
Ne pas oublier les "Else" au conditions afin de ne pas appeler plusieurs fois du code inutile.
shr 20 div (1024*1024) plus rapideshr 10 div 1024 plus rapide

on peu garder le div si tu inclus la norme du format des octets de 1998 :
1 Kibi-octet (Kio) = 1024 octets
1 Kilo-octet (Ko) = 1000 octets
Mais cette norme n'est valables que pour les stockages physique (DD, clef Usb, carte memoire). la capacitée de la Ram etant toujours ne vieille norme ou 1Ko = 1024 octets.
Mais c'est toujours bon de la savoir.

L'unité de mesure des capacité prend toujours une majuscule :
Mo (Mega-octets)
Kb (Kilo-bits)
GB (Giga-Bytes) (Bytes s'ecrit avec un B majuscule pour le differencier du b de bits)

Finallement, en supprimant les fonctions inutile on gagne encore du temps en supprimant plusieurs Call de fonctions :
ta version = 7 calls (2*SizeOf, 2*GetMemoryStatus, GetFreeMem, GetTotalMem, GetPercentage)
version corrigée = 2 calls (1*SizeOf, 1*GetMemoryStatus).

donc on passe de 7 calls * 1000 (1 ms) = 7000 calls/secondes
a 2 calls * 2 ou 4 (500/250 ms) = 4 / 8 calls/secondes

tout cela permettra une plus grande fluidité de ton programme.

procedure TForm1.Timer1Timer(Sender: TObject);
Var
Mem : TMemoryStatus;
T, F: LongWord;
P : single;
begin
Var
begin
Mem.dwLength := SizeOf(TMemoryStatus);
GlobalMemoryStatus(Mem);
F := Mem.dwAvailPhys;
T := Mem.dwTotalPhys;
P := (100/T)*F;

Barre.Min := 0;
Barre.Max := T;
Barre.Position := F;

if Mgaoctets1.Checked then
Barre.Hint := format('%d Mo libres sur %d Mo - %.1f%%',[F shr 20, T shr 20, P])
else
if Kilooctets1.Checked then
Barre.Hint := format('%d Ko libres sur %d Ko - %.1f%%',[F shr 10, T shr 10, P])
else
if Octets1.Checked then
Barre.Hint := format('%d Octets libres sur %d Octets - %.1f%%',[F,T,P]);
ModifieIcone;
end;
Rejoignez-nous