dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 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és6Date d'inscriptionmercredi 30 décembre 2009StatutMembreDernière intervention21 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és10Date d'inscriptiondimanche 8 novembre 2009StatutMembreDernière intervention31 janvier 2010 1 févr. 2010 à 18:49
Ok, merci bien Roger pour cette autre possibilité de conversion
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 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és10Date d'inscriptiondimanche 8 novembre 2009StatutMembreDernière intervention31 janvier 2010 31 janv. 2010 à 13:47
Oui, j'ai bien compris, merci pour ces informations
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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és10Date d'inscriptiondimanche 8 novembre 2009StatutMembreDernière intervention31 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és4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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;
11 févr. 2010 à 17:32
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)
11 févr. 2010 à 05:32
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.
1 févr. 2010 à 18:49
1 févr. 2010 à 13:03
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
31 janv. 2010 à 13:47
31 janv. 2010 à 12:28
J'espère que cela t'aura permis de découvrir qu'on peut faire plus court et plus simple.
Bonne continuation.
31 janv. 2010 à 11:53
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.
31 janv. 2010 à 11:02
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;