CONVERTISSEUR D'UN NOMBRE DÉCIMAL EN BINAIRE ET HEXADECIMAL

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 31 janv. 2010 à 11:02
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 - 11 févr. 2010 à 17:32
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/51215-convertisseur-d-un-nombre-decimal-en-binaire-et-hexadecimal

dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
11 févr. 2010 à 17:32
Re bonjour
Solution :
- supprimer la fonction translationhex
- dans procedure TForm1.Button1Click(Sender: TObject);
modifier comme suit : memo2.lines.add(inttohex(nombre+i,0));
et ça doit marcher (ça marche chez moi, même avec 255)
nictdtet Messages postés 6 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 21 novembre 2011
11 févr. 2010 à 05:32
Bonjour à vous...

Convertir 255(d) sur 2 lignes donne 15F(H) puis 100(H) au lieu de FF(H) puis 100(H) à cause de "else translationhex:=inttostr(nomber)+hexadecimal;" au deuxième passage.
ludokk Messages postés 10 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 31 janvier 2010
1 févr. 2010 à 18:49
Ok, merci bien Roger pour cette autre possibilité de conversion
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
1 févr. 2010 à 13:03
Bonjour Philippe, bonjour Ludovic
pour la conversion binaire hexa on peut aussi directenet utiliser ceci :

function translationhex(nomber:integer):string;
///--- function IntToHex(Value:Integer;Digits:Integer):string;
begin
result := inttohex(nomber,nomber div 16 + 1)
end;

cordialement
ludokk Messages postés 10 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 31 janvier 2010
31 janv. 2010 à 13:47
Oui, j'ai bien compris, merci pour ces informations
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 janv. 2010 à 12:28
Oui, la variable result est définie par Delphi pour toutes les fonctions. On n'est pas obligés d'affecter le résultat au nom d'une fonction comme dans les autres langages.
J'espère que cela t'aura permis de découvrir qu'on peut faire plus court et plus simple.
Bonne continuation.
ludokk Messages postés 10 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 31 janvier 2010
31 janv. 2010 à 11:53
Merci beaucoup pour ce conseil, vos commentaires sont très clairs, je les ai mêmes compris.
Il y a une seule chose que je ne comprend pas vraiment, c'est est-ce que la variable result est une variable connu dans delphi et correspond à la valeur que va prendre la fonction, car j'ai remarqué que vous ne la définissez pas dans var.
Sinon, c'est tout j'ai compris le reste et je vous en remercie.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 janv. 2010 à 11:02
Bon, pour un code de débutant, c'est pas mal mais ça manque quand même de vérifications des saisies utilisateurs.
D'autre part, il y a de nombreuses pistes d'allègement du code et d'optimisation des performances.
Aussi, je te propose le code suivant (documenté pour un débutant) de manière aiguiser la curiosité et proposer une autre manière de coder.
Je voudrais signaler l'utilisation des blocs d'exception présent dans presque tous les langages qui sont un formidable moyen de gérer les erreurs pouvant survenir à n'importe quel moment de l'exécution du programme. Il ne faut surtout pas s'en priver. Ne soit pas étonné si le débogueur de Delphi s'arrête sur une partie du code, c'est normal. Si tu exécutes ton code tel qu'un utilisateur lambda peut le faire, c'est à dire en lançant l'exe, tu ne verras pas ces fenêtres, preuve que les erreurs sont bien gérées.
A+

{Retourne une chaine représentant la valeur de number
en notation hexadécimale 32 bits}
function IntToHex(number: integer): string;
begin
try
{Pour convertir en hexadécimal, on s'appuie sur la fonction
format et ses multiples possibilités}
result := format('$%.8x', [number]);
except
result := ''
end;
end;

{Renvoie la valeur en sa représentation binaire}
function IntToBin(number: integer): string;
begin
result := '';
while number > 0 do
begin
{utilisation de l'opérateur binaire AND}
result := IntToStr(number and 1) + result;
{Décalage à droite et mémorisation du nombre résultant}
number := number shr 1;
end;
end;

{Détermination du nombre de lignes à calculer et à afficher}
function NombreDeLignes(chaine: string): shortint;
begin
{Simplification du code à l'aide d'un bloc try..except}
try
{... on tente la conversion}
Result := StrToInt(chaine) - 1;
except
{si rien n'est ou une valeur incorrecte est saisie,
on affecte 0 au résultat}
Result := 0;
end;
end;

function scrollbar(numberlines: integer): boolean;
begin
//Simplification du code !
result := numberlines > 14;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
nombre: integer;
i: shortint;
begin
memo1.ScrollBars := ssnone;
memo2.ScrollBars := ssnone;
memo1.lines.clear;
memo2.lines.clear;
if Trim(edit1.Text) = '' then
memo1.Text := 'Merci de respectez les consignes'
else
begin
{Protection du code par un bloc try..except pour
protéger ton code}
try
nombre := StrToInt(edit1.text);
for i := 0 to NombreDeLignes(edit2.Text) do
begin
memo1.lines.append(IntToBin(nombre + i));
memo2.lines.append(IntToHex(nombre + i));
end;
except
edit1.Text := 'Nombre incorrect !';
end;
end;
Memo1.Font.Color := clWindowText;
Memo2.Font.Color := clWindowText;
if scrollbar(NombreDeLignes(edit2.Text)) then
begin
memo1.ScrollBars := ssvertical;
memo2.scrollbars := ssvertical;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{Plutôt que de devoir se déplacer avec la touche tabulation
ou cliquer sur le bouton, il est plus naturel de taper sur
la touche [Enter] pour beaucoup d'utilisateurs}
button1.Default := true;
end;
Rejoignez-nous