Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Pascal Discussion :

Démonstration des bases numériques


Sujet :

Flash Pascal

  1. #1
    Rédacteur/Modérateur

    Démonstration des bases numériques
    Bonjour !

    J'ai commencé un programme qui convertit l'écriture décimale d'un nombre entier en écriture binaire, etc. Je sais bien qu'on trouve une multitude de programmes de ce genre (exemple). Je voudrais faire en Flash-Pascal ce qu'on fait d'ordinaire en PHP ou JavaScript.

    Je suis embêté pour lui trouver un nom. J'ai lu quelque part le mot "convertisseur" mais mon dictionnaire n'est pas d'accord avec ce choix.

    CONVERTISSEUR. s. m. Celui qui réussit dans la conversion des âmes. Ce missionnaire était un grand convertisseur.
    Il signifie également, Celui qui s'efforce de convertir les autres à sa religion. Il est familier dans les deux sens et ne se dit guère que par plaisanterie.
    Si vous avez une idée, je vous serais reconnaissant de m'en faire part.

    En attendant, je l'ai appelé bases.

    Critique bienvenue, car je voudrais faire quelque chose de propre pour ma première contribution aux sources Flash-Pascal.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    program Bases;
    uses
      Flash8;
    {$FRAME_WIDTH 240}
    {$FRAME_HEIGHT 160}
    {$BACKGROUND $A0A0A0}
    type
      TEditBox = class(TextField)
        procedure onKeyDown;
      end;
    var
      e: TEditBox;
      t1, t2, t3, t4: TextField;
      fmt: TextFormat;
     
    function StrToInt(s: string): Integer;
      var
        i, tmp, p10: Integer;
      begin
        tmp := 0;
        p10 := 1;
        for i := Length(s) downto 1 do
          begin
            if (Ord(s[i]) >= 48) and (Ord(s[i]) <= 57) then
              begin
                Inc(tmp, (Ord(s[i])-48) * p10);
                p10 := p10 * 10;
              end;
          end;
        Result := tmp;
      end;
     
    function IntToBase(i, base: Integer): string;
      var
        Digits, tmp: string;
      begin
        Digits := '0123456789ABCDEF';
        if i = 0 then
          tmp := '0'
        else
          tmp:='';
        while i > 0 do
          begin
            tmp := Digits [i mod base + 1] + tmp;
            i := i div base;
          end;
        Result := tmp;
      end;
     
    procedure TEditBox.onKeyDown;
      var
        n: integer;
      begin
        if Key.getAscii = 13 then
        begin
          if Length(e.text) > 3 then
            Exit;
          n := StrToInt(e.text);
          t1.Text := IntToBase(n,  2);
          t2.Text := IntToBase(n,  8);
          t3.Text := IntToBase(n, 16);
        end;
      end;
     
    procedure Encadre(xa, ya, l, h: Integer);
      begin
        _root.beginFill($ffffff);
        _root.lineStyle(2,$000080);
        _root.moveTo(xa    , ya);
        _root.lineTo(xa + l, ya);
        _root.lineTo(xa + l, ya + h);
        _root.lineTo(xa    , ya + h);
        _root.lineTo(xa    , ya)
      end;
     
    begin
      fmt := TextFormat.Create('Tahoma', 14);
      fmt.color := $000000;
      Encadre(10, 10, 32, 21);
      Encadre(10, 38, 72, 21);
      Encadre(10, 66, 32, 21);
      Encadre(10, 94, 24, 21);
      e := TEditBox.Create(nil, 'input', 0, 10, 10 + 0 * (21 + 7), (3 + 1) * 8, 21);
      e.setNewTextFormat(fmt);
      e.type := 'input';
      e.text:='';
      Selection.setFocus(e);
      Key.addListener(e);
      t1:= TextField.Create(nil, 'output', 1, 10, 10 + 1 * (21 + 7), (8 + 1) * 8, 21);
      t2:= TextField.Create(nil, 'output', 2, 10, 10 + 2 * (21 + 7), (3 + 1) * 8, 21);
      t3:= TextField.Create(nil, 'output', 3, 10, 10 + 3 * (21 + 7), (2 + 1) * 8, 21);
      t4:= TextField.Create(nil, 'output', 4, 50, 10, 5 * 8, 21);
      t1.setNewTextFormat(fmt);
      t2.setNewTextFormat(fmt);
      t3.setNewTextFormat(fmt);
      t4.setNewTextFormat(fmt);
      t4.text := 'Byte';
    end.

  2. #2
    Membre habitué
    Bonjour Roland,

    "Convertir" a plusieurs sens possibles, pas seulement religieux :

    convertir, verbe intransitif
    Sens 1 Amener quelqu'un à la religion ou à changer de religion [Religion].
    Sens 2 Convaincre, faire changer quelqu'un d'opinion, de parti politique...
    Sens 3 Transformer en une autre chose. Ex Convertir des billets en pièces.
    convertisseur, nom masculin
    Sens Appareil qui convertit, qui effectue une transformation.
    De plus, tout le monde parle de "convertisseur de monnaies".
    Tony
    Hobbyiste débutant Delphi 7

  3. #3
    Membre expérimenté
    numération tout simplement non ?

    @+

  4. #4
    Rédacteur/Modérateur

    Merci pour vos suggestions.

    Puisque "convertisseur" est déjà utilisé dans ce sens-là, pourquoi pas ?

    Mais "numérateur" n'est pas une mauvaise idée : ça correspond assez bien à la chose.

    Autrement, pour le programme lui-même, l'avez-vous essayé ? Je ne parle pas du code, mais du lien vers le fichier SWF. Est-ce que ça marche chez vous ?

  5. #5
    Membre habitué
    Citation Envoyé par Roland Chastain Voir le message
    Autrement, pour le programme lui-même, l'avez-vous essayé ? Je ne parle pas du code, mais du lien vers le fichier SWF. Est-ce que ça marche chez vous ?
    Je suis sur Chrome, et je vois 4 champs.

    A droite du 1er champ, je lis "Byte".

    Je peux saisir dans le 1er champ mais pas dans les 3 autres.
    Tony
    Hobbyiste débutant Delphi 7

  6. #6
    Membre expérimenté
    pas de soucis, ça fonctionne...le premier en input et les autres en output.
    J'ai fait un essai avec 255 concluant.

  7. #7
    Rédacteur/Modérateur

    Merci pour les tests !

    Bon, effectivement la conversion ne se fait que dans un sens. Je vais voir si je trouve comment gérer plusieurs champs d'entrée.

  8. #8
    Rédacteur/Modérateur

    Gestion de plusieurs champs d'entrée-sortie
    Je peine à finir mon convertisseur-numérateur.

    Je n'ai pas trouvé jusqu'ici le moyen d'afficher mes résultats. Sûrement que je ne m'y suis pas pris comme il fallait.

    Si vous avez un conseil il sera bienvenu.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    program Numerateur;
    uses
      Flash8;
    {$FRAME_WIDTH 240}
    {$FRAME_HEIGHT 160}
    {$BACKGROUND $a0a0a0}
    type
      TEditBox1 = class(TextField)
        procedure onKeyDown;
      end;
      TEditBox2 = class(TextField)
        procedure onKeyDown;
      end;
      TEditBox3 = class(TextField)
        procedure onKeyDown;
      end;
      TEditBox4 = class(TextField)
        procedure onKeyDown;
      end;
    var
      e1: TEditBox1;
      e2: TEditBox2;
      e3: TEditBox3;
      e4: TEditBox4;
      t1, t2, t3, t4: TextField;
      f: TextFormat;
      s1, s2, s3, s4: string;
      nombre: Integer;
     
    function StrToInt(s: string): Integer;
      var
        i, tmp, p10: Integer;
      begin
        tmp := 0;
        p10 := 1;
        for i := Length(s) downto 1 do
          begin
            if (Ord(s[i]) >= 48) and (Ord(s[i]) <= 57) then
              begin
                Inc(tmp, (Ord(s[i]) - 48) * p10);
                p10 := p10 * 10;
              end;
          end;
        Result := tmp;
      end;
     
    function IntToBase(i, base: Integer): string;
      var
        digits, tmp: string;
      begin
        digits := '0123456789ABCDEF';
        if i = 0 then
          tmp := '0'
        else
          tmp:='';
        while i > 0 do
          begin
            tmp := digits [i mod base + 1] + tmp;
            i := i div base;
          end;
        result := tmp;
      end;
     
    function Position(const c: Char; const s: string): Integer;
    var
      i, tmp: Integer;
    begin
      tmp := 0;
      for i := 1 to Length(s) do
        begin
          if c = s[i] then tmp := i;
        end;
      result := tmp;
    end;
     
    function BaseToInt(const s: string; base: Integer): Integer;
      var
        digits: string;
        i, temp: Integer;
      begin
        digits := '0123456789ABCDEF';
        temp := 0;
        for i := 1 to Length(s) do
          begin
            temp := base * temp;
            Inc(temp, Position(s[i], digits) - 1);
          end;
        Result := temp;
      end;
     
    procedure TEditBox1.onKeyDown;
      begin if Key.getAscii = 13 then begin
        s1 := e1.text;
        nombre := StrToInt(s1);
        s2 := IntToBase(nombre, 2);
        e2.text := s2;// j'en suis là
        // le résultat ne s'affiche pas
      end; end;
    procedure TEditBox2.onKeyDown;
      begin if Key.getAscii = 13 then begin
        s2 := e2.text;
      end; end;
    procedure TEditBox3.onKeyDown;
      begin if Key.getAscii = 13 then begin
        s3 := e3.text;
      end; end;
    procedure TEditBox4.onKeyDown;
      begin if Key.getAscii = 13 then begin
        s4 := e4.text;
      end; end;
     
    procedure Cadre(xa, ya, l, h: Integer);
      begin
        _root.beginFill($f0f0f0);
        _root.lineStyle(2,$808080);
        _root.moveTo(xa    , ya);
        _root.lineTo(xa + l, ya);
        _root.lineTo(xa + l, ya + h);
        _root.lineTo(xa    , ya + h);
        _root.lineTo(xa    , ya)
      end;
     
    begin
      f := TextFormat.Create('Tahoma', 14);
      f.color := $000000;
      Cadre(10, 10, 32, 21);
      Cadre(10, 38, 72, 21);
      Cadre(10, 66, 32, 21);
      Cadre(10, 94, 24, 21);
      e1 := TEditBox1.Create(nil, 'input', 0, 10, 10 + 0 * (21 + 7), (3 + 1) * 8, 21);// décimal
      e2 := TEditBox2.Create(nil, 'input', 1, 10, 10 + 1 * (21 + 7), (8 + 1) * 8, 21);// binaire
      e3 := TEditBox3.Create(nil, 'input', 2, 10, 10 + 2 * (21 + 7), (3 + 1) * 8, 21);// octal
      e4 := TEditBox4.Create(nil, 'input', 3, 10, 10 + 3 * (21 + 7), (2 + 1) * 8, 21);// hexadécimal
      e1.setNewTextFormat(f);
      e2.setNewTextFormat(f);
      e3.setNewTextFormat(f);
      e4.setNewTextFormat(f);
      e1.type := 'input';
      e2.type := 'input';
      e3.type := 'input';
      e4.type := 'input';
      e1.text:='000';
      e2.text:='00000000';
      e3.text:='000';
      e4.text:='00';
      //Selection.setFocus(e1);
      Key.addListener(e1);
      Key.addListener(e2);
      Key.addListener(e3);
      Key.addListener(e4);
    end.

  9. #9
    Expert éminent sénior
    Bonjour,

    voici une proposition.

    on tombe ici sur une limitation, ou une logique en tout cas, de Flash 8.
    Selection.getfocus renvoie le nom de l'objet sous la forme d'un chemin dans l'animation.

    Dans le cas présent nous travaillons dans le niveau 0 (on peu charger un autre SWF à un autre niveau), et on retrouve le paramètre "name" du constructor que j'ai du rendre unique.

    Bien que cette notion soit plus ou moins cachée dans FlashPascal, elle est très importante. Par exemple, vous ne pouvez pas donner le focus à un objet dont le nom est vide !

    Je ne sais pas si cette logique a été revue en ActionScript 3...un jour FlashPascal passera en AS3 (Flash 9 et au delà) mais ça demande bcp de travail

    Sinon quelque remarques :
    - tu fais peu d'usage des constructeurs avec paramètres, c'est dommage.
    - quand deux instances sont identiques, pas la peine de déclarer deux types
    - quand peu de chose change entre deux classes, autant mettre ce qui est commun dans un ancêtre commun
    - tu utilises peu les variables locales, elles sont plus efficaces car elles utilisent un registre local au lieu d'un nom global.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
     
    program Numerateur;
    uses
      Flash8;
    {$FRAME_WIDTH 240}
    {$FRAME_HEIGHT 160}
    {$BACKGROUND $a0a0a0}
    type
      TEditBox = class(TextField)
        constructor create(b: Integer; x, y, w, h: Number; s: string);
        procedure onKeyDown;
      end;
     
    var
      e1: TEditBox;
      e2: TEditBox;
      e3: TEditBox;
      e4: TEditBox;
     
    //  t1, t2, t3, t4: TextField;
      f: TextFormat;
    //  s1, s2, s3, s4: string;
    //  nombre: Integer;
     
    constructor TEditBox.Create(b: Integer; x, y, w, h: Number; s: string);
    begin
      inherited Create(_root, 'base' + IntToStr(b), _root.getNextHighestDepth(), x, y, w, h);
      setNewTextFormat(f);
      type := 'input';
      Text := s;
      border := True;
      borderColor := $808080;
      background := True;
      backgroundColor := $f0f0f0;
    end;
     
    function StrToInt(s: string): Integer;
      var
        i, tmp, p10: Integer;
      begin
        tmp := 0;
        p10 := 1;
        for i := Length(s) downto 1 do
          begin
            if (Ord(s[i]) >= 48) and (Ord(s[i]) <= 57) then
              begin
                Inc(tmp, (Ord(s[i]) - 48) * p10);
                p10 := p10 * 10;
              end;
          end;
        Result := tmp;
      end;
     
    function IntToBase(i, base: Integer): string;
      var
        digits, tmp: string;
      begin
        digits := '0123456789ABCDEF';
        if i = 0 then
          tmp := '0'
        else
          tmp:='';
        while i > 0 do
          begin
            tmp := digits [i mod base + 1] + tmp;
            i := i div base;
          end;
        result := tmp;
      end;
     
    function Position(const c: Char; const s: string): Integer;
    var
      i, tmp: Integer;
    begin
      tmp := 0;
      for i := 1 to Length(s) do
        begin
          if c = s[i] then tmp := i;
        end;
      result := tmp;
    end;
     
    function BaseToInt(const s: string; base: Integer): Integer;
      var
        digits: string;
        i, temp: Integer;
      begin
        digits := '0123456789ABCDEF';
        temp := 0;
        for i := 1 to Length(s) do
          begin
            temp := base * temp;
            // Pos() sera ajouté dans la prochaine version <img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />
            Inc(temp, Position(s[i], digits) - 1);
          end;
        Result := temp;
      end;
     
    procedure TEditBox.onKeyDown;
    var
      i: Integer;
    begin
      if Key.getAscii = 13 then
      begin
      // cf http://www.dreamincode.net/code/snippet360.htm
        case Selection.getFocus of
          '_level0.base10' : i := StrToInt(e1.Text);
          '_level0.base2'  : i := BaseToInt(e2.Text, 2);
          '_level0.base8'  : i := BaseToInt(e3.Text, 8);
          '_level0.base16' : i := BaseToInt(e4.Text, 16);
        else
          exit;
        end;
        e1.Text := IntToStr(i);
        e2.Text := IntToBase(i, 2);
        e3.Text := IntToBase(i, 8);
        e4.Text := IntToBase(i, 16);
      end;
    end;
     
    {
    procedure Cadre(xa, ya, l, h: Integer);
      begin
        _root.beginFill($f0f0f0);
        _root.lineStyle(2,$808080);
        _root.moveTo(xa    , ya);
        _root.lineTo(xa + l, ya);
        _root.lineTo(xa + l, ya + h);
        _root.lineTo(xa    , ya + h);
        _root.lineTo(xa    , ya)
      end;
    }
    begin
      f := TextFormat.Create('Tahoma', 14);
      f.color := $000000;
    // Remplacer par un Border...mais je n'ai pas trouvé de borderWidth...
    //  Cadre(10, 10, 32, 21);
    //  Cadre(10, 38, 72, 21);
    //  Cadre(10, 66, 32, 21);
    //  Cadre(10, 94, 24, 21);
      e1 := TEditBox.Create(10, 10, 10 + 0 * (21 + 7), (3 + 1) * 8, 21, '000');// décimal
      e2 := TEditBox.Create( 2, 10, 10 + 1 * (21 + 7), (8 + 1) * 8, 21, '00000000');// binaire
      e3 := TEditBox.Create( 8, 10, 10 + 2 * (21 + 7), (3 + 1) * 8, 21, '000');// octal
      e4 := TEditBox.Create(16, 10, 10 + 3 * (21 + 7), (2 + 1) * 8, 21, '00');// hexadécimal
      //Selection.setFocus(e1);
     
      // un seul suffit car il reçoit TOUS les évènements clavier !
      // sinon il faudrait placer chaque TextField dans un MovieClip avec un onKeyDown
      Key.addListener(e1);
    //  Key.addListener(e2);
    //  Key.addListener(e3);
    //  Key.addListener(e4);
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Rédacteur/Modérateur

    Citation Envoyé par Paul TOTH Voir le message
    voici une proposition.
    Merci Paul pour le code et les remarques.

    Voici donc la nouvelle version du fichier bases.swf.

###raw>template_hook.ano_emploi###