Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008
-
25 mars 2005 à 17:37
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 2012
-
31 mars 2005 à 21:19
salut, j'aimerais créer un programme qui permet convertir un octet, en kilo, en mega, en giga, etc.
et qu'il puisse le faire dans tous les sens, qu'il convertisse kilo en octet ...
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20122 27 mars 2005 à 20:02
Bonsoir,
Le probleme de int64 c'est qu'il est limité dans la plage de valeurs -2^63..2^63-1.
Pour aller plus loin il faut passer à des nombres rééls et non plus des nombres entiers.
Voici, une solution :
// Oter ou non le commentaire selon les besoins
//{$DEFINE AVANT_STANDARDISATION}
// Formattage de la chaine de sortie
Result := Format( '%.10g ' + UNITES_OCTET[Source] + '= %.10g ' + UNITES_OCTET[Destination], [Valeur,Resultat] ) ;
end ;
Exemples d'appel :
var
S : string ;
// Conversion de teraoctets en octets
S := ConversionOctets( 65536 , uoTera , uoOctet ) ;
procedure TForm1.Button1Click(Sender: TObject);
var
S : string ;
begin
S := '' ;
S := S + ConversionOctets( 65536 , uoOctet , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoKilo ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoMega ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoGiga ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoTera ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoPeta ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoExa ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoZetta ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoYotta ) + #13#10 ;
S := S + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoKilo , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoMega , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoGiga , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoTera , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoPeta , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoExa , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoZetta , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoYotta , uoOctet ) + #13#10 ;
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20122 25 mars 2005 à 19:39
Avant la standardisation de décembre 1998 :
<LI>Un KiloOctet (ko) ou KiloByte (kB) 210 octets 1024 octets </LI>
<LI>Un MégaOctet (Mo) ou MégaByte (MB) 220 octets 1024 ko = 1 048 576 octets </LI>
<LI>Un GigaOctet (Go) ou GigaByte (GB) 230 octets 1024 Mo = 1 073 741 824 octets </LI>
<LI>Un TéraOctet (To) ou TeraByte(TB) 240 octets 1024 Go = 1 099 511 627 776 octets</LI>
Depuis décembre 1998, les unités standardisées par IEC sont :
<LI>Un KiloOctet (ko) ou KiloByte (kB) = 1000 octets </LI>
<LI>Un MégaOctet (Mo) ou MégaByte (MB) 1000 ko 1 000 000 octets </LI>
<LI>Un GigaOctet (Go) ou GigaByte (GB) 1000 Mo 1 000 000 000 octets </LI>
<LI>Un TéraOctet (To) ou TeraByte(TB) 1000 Go 1 000 000 000 000 octets</LI>
Il existe également le kilo binaire (kibi), le méga binaire (Mébi), le giga binaire (Gibi), le tera binaire (Tebi).
Il suffit donc de multiplier ou de diviser soit par n fois 1024 (ancienne norme) soit par n fois 1000 (nouvelle norme) pour obtenir chacune des unités.
1To 1000 Go 1000*1000 Mo = 1000 * 1000 * 1000 ko = 1000 * 1000 * 1000 * 1000 * octets
1 octet 1/1000 ko 1/(1000*1000) Mo = etc....
GordoCabron
Messages postés29Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 27 mars 2005 à 15:22
Salut
Une possibilite :
//------------------------------------------------------------------
procedure TForm1.Edit1Change(Sender: TObject);
var valeur,unite:integer;
begin
try
valeur:=StrToInt(Edit1.Text);
unite:=0;
while ((valeur shr (10+unite))<>0) do
unite:=unite+10;
case unite of
0 : Edit2.Text:=IntToStr(valeur shr unite)+' Octets';
10 : Edit2.Text:=IntToStr(valeur shr unite)+' Ko';
20 : Edit2.Text:=IntToStr(valeur shr unite)+' Mo';
30 : Edit2.Text:=IntToStr(valeur shr unite)+' Go';
end;
except
Edit2.Text:='Erreur';
end;
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 28 mars 2005 à 11:47
Ok, merci WhiteHippo, et quand je fais une
grosse convertion (tera vers octet avec "1" dans le edit1), a la fin de
mon edit, je trouve ceci : 1,099511628E012 o
comment arriver a un résultat comme celui-ci : 1 099 511 627 776 ?
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 28 mars 2005 à 12:09
bon, j'ai un autre petit problème :
-sur ma fiche, j'ai deux séries de RadioButton avec "octet", "kilo", "mega", ...
une pour la valeur de départ et une pour la valeur d'arrivée
comment faire pour qu'en fonction des RadioButton que je sélectionne, l'opération soit différente ?
Je pensais a un truc de ce genre : Edit2.Text := ConversionOctets(StrToFloat(Edit1.Text), depart , arrivee) ;
et depart correspondrait a Giga si je coche le RadioButton Giga, et
arrivee correspondrait a mega si je coche le RadioButton Mega dans le
deuxième liste.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20122 28 mars 2005 à 12:54
Vu que des réels sont utilisés, tu ne peux pas avoir 1 099 511 627 776, mais un arrondi.
RadioButton ou RadioGroup ? J'opterais pour la seconde solution.
Tu rajoutes un radioGroup dans la propriété items tu ajoutes toutes les unités dans l'ordre du TUnitesOctet, tu initialises itemIndex à 0 (par exemple) Il suffit alors de récuperer à l'aide de ItemIndex l'unité de départ et celle d'arrivée.
Exemple :
Edit2.Text := ConversionOctets(StrToFloat(Edit1.Text), TUnitesOctet(RadioGroupDepart.ItemIndex), TUnitesOctet(RadioGroupArrivee.ItemIndex)) ;
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 28 mars 2005 à 17:36
ça marche, merci WhiteHippo, une dernière chose, comment faire pour que dans edit1 on ne puisse entrer que des chiffres et une virgules, et que les nombres n'apparaissent pas comme ça : 1234567890,4545458 mais comme ça : 1 234 567 890,4545458
et pour l'arrondi, c'est obligatoire?
dans la calculette de windows, on met des nombres bcp plus grands sans arrondis
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20122 28 mars 2005 à 19:20
Sur l'evenement OnKeyDown du TEdit, il faut intercepter les caractères pour ne permettre que les chiffres, et la virgule. Lorsqu'une virgule est saisie, on le mémorise et on interdit la saisie de cette nouvelle virgule.
Pour l'affichage avec des séparateurs, il suffit de modifier la chaine de format en utilisant %.10n au lieu de %.10f
Pour l'arrondi, oui, puisque l'on travailles avec des réels.
Maintenant, si tu as le temps, tu peux toujours créer un nouveau type non natif qui corresponde mieux à tes besoins et qui puisse gérer les nombres entiers et réels comme la calculette windows :)