IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Composants VCL Delphi Discussion :

Affichage de nombre "à tambours"


Sujet :

Composants VCL Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Affichage de nombre "à tambours"
    Bonjour.
    Quelqu'un saurait-il si (et où) on peut télécharger un composant (compatible Delphi 6) permettant de réaliser un affichage de nombre (en fait un seul chiffre me suffirait, je sais juxtaposer ) avec des "tambours" à l'ancienne, comme le compteur de visites de certains sites Web ou certaines vieilles horloges numériques mécaniques ? J'ai "googlé" sans succès, un affichage 7 segments se trouve sans problème par contre
    Merci d'avance ...

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Salut

    Avec des bitmaps enregistrées dans une imageList, tu pourrais sans doute te dépanner sans avoir à installer un composant. Tu n'as plus qu'à créer les 10bitmaps et les ranger dans l'ordre dans l'imagelist. La correspondance chiffre-index de l'image est directe.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    ...certaines vieilles horloges numériques mécaniques
    Bin, il suffirait, à partir d'une photo d'une vieille horloge numérique mécanique, de créer 10 petits (*) BitMap's pour les chiffres de 0 à 9 puis en placer les images dans un TImageList dans lequel on en récupère l'indice pour afficher un nombre par juxtaposition sur n'importe quel composant dont le Canvas est accessible.

    A+.

    (*) : "petits" : Mais s'ils sont grands on peut aussi lors de l'affichage utiliser StretchDraw ça permettrait une utilisation adaptative aux besoins.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Posts croisés : Grillé de vitesse...

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Pour faciliter le cadrage des bitmaps, tu peux te servir d'un DrawGrid.
    pour les bitmaps, en plus des chiffres, tu peux prévoir éventuellement, l'état "Eteint", et un symbole de dépassement de capacité pour l'afficheur. Ce sont juste des idées.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Invité
    Invité(e)
    Par défaut Problème lié à cet afficheur
    Bonjour.
    Mon problème est justement la création des bitmaps, pour obtenir un effet 3D "vintage" réaliste ... Je n'ai malheureusement pas accès à une telle horloge pour la photographier, la seule dont je dispose est en fonctionnement (programmateur de four intégré) et protégée par une vitre qui va me gâcher les photos. Il y aurait bien la solution d'aller sur un site avec compteur, de faire des accès répétés pour faire tourner ce compteur et de faire des captures d'écran ... En dernier recours !
    Merci déjà pour vos réponses, mais j'attends si quelqu'un n'a pas déjà résolu ce problème : flemme ?

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Si, comme moi, t'es un manche en dessin, tu peux ruser...

    Il existe des sites spécialisés dans les icônes (au sens d'images pour les sites web).

    Tu peux aussi créer avec un peu de malice des chiffres à l'aide une police de caractères (il y en a plein de site avec des fontes gratuites : dafont...) qui se rapproche du style de ton application, puis retoucher le tout avec des filtres graphiques.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Invité
    Invité(e)
    Par défaut Affichage de chiffres "cylindre"
    Bonjour.
    Grâce à vos idées j'ai trouvé des choses intéressantes que je cherchais par ailleurs (en particulier des icônes de drapeaux ! Toujours délicat à faire pour certains ...) mais apparemment pas de chiffres en cylindre ; au passage certains affichages de compteurs web décalent les chiffres en hauteur pour plus de réalisme ! Je vais donc soit m'orienter vers des captures d'écran, ou utiliser l'affichage 7 segments qui n'est pas vilain non plus et permet même de changer de couleur !
    En tout cas merci ...
    Alberich

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    telle horloge pour la photographier, la seule dont je dispose est en fonctionnement (programmateur de four intégré) et protégée par une vitre qui va me gâcher les photos.
    Il y également les compteurs d'eau qui fonctionnent avec des "tambours" à l'ancienne.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Invité
    Invité(e)
    Par défaut Compteurs mécaniques : suite ...
    Bonjour.
    Il y a ausi le bon vieux compteur bleu EDF ... mais je crains que ni le Service des Eaux ni EDF n'apprécieraient que tu enlèves la vitre pour photographier (ni ta cave s'il s'agit du compteur d'eau : apparemment l'affichage est "sous-marin")

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    "... mais je crains que ni le Service des Eaux ni EDF n'apprécieraient que tu enlèves la vitre pour photographier (ni ta cave s'il s'agit du compteur d'eau )"
    Si j'ai parlé du compteur d'eau c'est que les miens sont dans les WC et qu'avec l'éclairage diffus il n'y a pas de reflet sur la vitre. Puis ailleurs rien n'empêcherait d'utiliser temporairement un éclairage diffus.

    Pour en revenir aux BitMap's : il y aurait également la possibilité d'utiliser un BitMap unique, avec les 0 à 9 disposés verticalement, puis avec CopyRect on récupère la zone à afficher qui peut être à cheval sur deux chiffres et avec un Timer faire tourner le tambour en incrémentant la position y du CopyRect.

    Et l'aspect cylindrique du tambour peut être obtenu en appliquant un dégradé au BitMap de la zone copiée, par exemple en l'assombrissant en fonction de l'écartement par rapport à l'axe du cylindre.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Comme ça m'a taquiné, voici un Zip avec un bout de code qui affiche le Tambour d'indice i avec un rendu cylindrique et qui le fait tourner.
    Pour faire tourner le tambour à plus grande vitesse il faudra utiliser les ScanLines à la place du Pixels[] que j'ai utilisé pour ce premier essai.

    Il ne reste plus qu'à juxtaposer les autres Tambours...

    A+.

    EDIT : Supprimé le Zip, un nouveau Zip dans mon message du 01/11/2013, 13h47
    Images attachées Images attachées  
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je propose une autre approche

    1) ajouter une PaintBox de 23x47 pixels

    2) ajouter un bitmap Degrade
    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
     
      Degrade: TBitmap;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      y, c : Integer;
    begin
      HDigit := imgSource.height div 11;
      WDigit := imgSource.width;
     
      Degrade := TBitmap.Create;
      Degrade.Width := WDigit;
      Degrade.Height := HDigit;
      with Degrade.Canvas do
      begin
        for y := 0 to HDigit div 2 do
        begin
          c := (y * 255) div (HDigit div 2);
          Pen.Color := c + c shl 8 + c shl 16;
          MoveTo(0, y);
          LineTo(WDigit, y);
          MoveTo(0, HDigit - y);
          LineTo(WDigit, HDigit - y);
        end;
      end;
      ...
    3) sur le OnPaint de la PaintBox
    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
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
      x, y, yy, n: Integer;
    begin
      with PaintBox1.Canvas do
      begin
        Draw(0, 0, Degrade);
        Font.Name := 'Impact';
        Font.Height := 32;
        Font.Style := [];
        x := (WDigit - TextWidth('0')) div 2;
        y := - Round(kPosition * hDigit);
        yy := (HDigit - TextHeight('0')) div 2;
        Brush.Style := bsClear;
        for n := 0 to 9 do
        begin
          TextOut(x, y + yy, IntToStr(n));
          Inc(y, hDigit);
          MoveTo(0, y);
          LineTo(WDigit, y);
        end;
      end;
    end;
    4) ajouter un PaintBox1.Invalidate; dans le code du bouton Afficher

    NB: le code n'est pas complètement optimisé puisqu'il dessine 10 digits alors que 3 maxi sont visibles

    l'idée est donc de précalculer le dégradé qui est dessiné et par dessus lequel on vient écrire les chiffres
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Paul TOTH : l'idée est donc de précalculer le dégradé qui est dessiné et par dessus lequel on vient écrire les chiffres
    L'idée est excellente, cela évite des recopies incessantes.

    J'ai donc modifié le code comme suit : voir le Zip
    Par contre pour afficher un nombre donc avec plusieurs tambours juxtaposés je n'ai pas réussi à conserver l'effet de la rotation du ou des tambours qui bougent et cela saute aux yeux rien qu'en voyant la miniature ci-jointe.

    A+.

    EDIT : Supprimé le Zip : Un nouveau Zip dans mon message du 01/11/2013, 13h47
    Images attachées Images attachées  
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je n'ai pas compris le pb, et ton zip n'est pas à jour à priori

    je pense que pour faire de multiples chiffres il suffit d'avoir une PaintBox plus large et de boucler sur le même code en augmentant X de la largeur d'un digit à chaque fois
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Paul TOTH :
    ton zip n'est pas à jour à priori
    Mille excuses, ..., je viens de le remplacer dans mon message d'hier 14h38.

    je n'ai pas compris le pb, ..., je pense que pour faire de multiples chiffres il suffit d'avoir une PaintBox plus large et de boucler sur le même code en augmentant X de la largeur d'un digit à chaque fois
    Dans le Zip j'ai une PaintBox large. Mais le problème n'est pas de positionner les tambours en fonction de X. Le problème est qu'en incrémentant/décrémentant un nombre de Delta cela ne modifie que le chiffre de certains tambours et c'est lors de cette modification qu'il faut pouvoir simuler la visualisation de la rotation de ces tambours vers l'avant ou l'arrière.
    Mais je pense que pour y arriver il faudra mémoriser le caractère affiché précédemment sur chaque tambour et lors du changement du nombre le comparer au nouveau puis obtenir la rotation vers l'avant ou l'arrière du ou des tambours dont la valeur change.

    Au fait puisque l'on parle de PaintBox : Quel est l'avantage du PaintBox par rapport à un TImage vu que les dans les deux cas on utilise leur Canvas. ???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  17. #17
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    C'est une question d'angle, non ? Chaque tambour fait un tour quand le précédent en a fait 100.

    On doit pouvoir calculer cela facilement d'après la seule nouvelle valeur :
    soit 45.7 : le 7 s'affiche à 100 % mais le 5 doit s'afficher à 70 % de la progression vers le 6 et le 4 à 57 % de celle vers le 5.

    Il doit suffire de décaler sur le BitMap vertical des chiffres la ligne de lecture à base du chiffre + hauteur chiffre*%rotation
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  18. #18
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Au fait puisque l'on parle de PaintBox : Quel est l'avantage du PaintBox par rapport à un TImage vu que les dans les deux cas on utilise leur Canvas. ???

    A+.
    TPaintBox permet un dessin "dynamique", tout se passe dans l'événement OnPaintBox. c'est pratique quand le dessin est sujet à variations. On peut faire pareil avec TImage, il faut alors s'appuyer sur l'événement OnPaint de la fiche. Cela peut devenir compliqué avec plusieurs images. L'avantage du TPaintBox est que le code est spécifique à chaque image (je sais pas si je me suis bien expliqué);

    Je suis en train de produire une solution personnelle au problème d'alberich. Cependant elle ne simule pas le roulement en tambour comme dans les afficheurs sur les fours. Mais j'y travaille...
    J'ai par contre quatres types d'animation lors du changement de valeur du compteur.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    voici une approche orientée objet

    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
     
    type
      TTambour = class
      private
        FWidth : Integer;
        FHeight: Integer;
        FImage : TImage;
        FBitmap: TBitmap;
        FTimer : TTimer;
        FText  : string;
        FSize  : TSize;
        FDigits: array of Integer;
        procedure SetText(const Value: string);
        procedure OnTimer(Sender: TObject);
      public
        constructor Create(AImage: TImage; AText: string);
        destructor Destroy;
        property Text: string read FText write SetText;
      end;
     
    constructor TTambour.Create;
    begin
      inherited Create;
      FWidth := 24;
      FHeight := 48;
      FImage := AImage;
      FBitmap := TBitmap.Create;
      with FBitmap.Canvas do
      begin
        Font.Name := 'Impact';
        Font.Height := 32;
        Font.Style := [fsBold];
        Brush.Style := bsClear;
        FSize := TextExtent('0');
        FSize.cx := (FWidth - FSize.cx) div 2;
        FSize.cy := (FHeight - FSize.cy) div 2;
      end;
      FTimer := TTimer.Create(nil);
      FTimer.Interval := 60;
      FTimer.OnTimer := OnTimer;
      Text := AText;
      OnTimer(Self);
    end;
     
    destructor TTambour.Destroy;
    begin
      FTimer.Free;
      FBitmap.Free;
      inherited;
    end;
     
    procedure TTambour.SetText(const Value: string);
    begin
      FText := Value;
      SetLength(FDigits, Length(FText));
      FBitmap.Width := Length(FText) * FWidth;
      FBitmap.Height := FHeight;
      FTimer.Enabled := True;
    end;
     
    procedure TTambour.OnTimer(Sender: TObject);
    const
      DIGITS = '0123456789,-+E';
    var
      Done: Boolean;
      y, c, x: Integer;
      Index  : Integer;
    begin
      Done := True;
      with FBitmap.Canvas do
      begin
        for y := 0 to FHeight div 2 do
        begin
          c := (255 * y) div (FHeight div 2);
          c := c + c shl 8 + c shl 16;
          Pen.Color := c;
          MoveTo(0, y);
          LineTo(FBitmap.Width, y);
          MoveTo(0 , FHeight - 1 - y);
          LineTo(FBitmap.Width, FHeight - 1 - y);
        end;
        Pen.Color := clBlack;
        for x := 0 to Length(FText) - 1 do
        begin
          MoveTo(x * FWidth, 0);
          LineTo(x * FWidth, FHeight);
          Index := Pos(FText[x + 1], DIGITS) - 1;
          if Index * FHeight <> FDigits[x] then
          begin
            Done := False;
            FDigits[x] := (FDigits[x] + 6) mod (FHeight * Length(DIGITS));
          end;
          Index := FDigits[x] div FHeight + 1;
          if Index > 10 then
            Font.Color := clRed
          else
            Font.Color := clBlack;
          y := FSize.cy - FDigits[x] mod FHeight;
          TextOut(x * FWidth + FSize.cx, y, DIGITS[Index]);
          Inc(y, FHeight);
          MoveTo(x * FWidth, y);
          LineTo((x + 1) * FWidth, y);
          Inc(Index);
          if Index = 11 then
            Font.Color := clRed
          else
          if Index = 15 then
          begin
            Index := 0;
            Font.Color := clBlack;
          end;
          TextOut(x * FWidth + FSize.cx, y, DIGITS[Index]);
          Inc(y, FHeight);
          MoveTo(x * FWidth, y);
          LineTo((x + 1) * FWidth, y);
        end;
      end;
      FImage.Picture.Assign(FBitmap);
      FTimer.Enabled := Done = False;
    end;
     
     
    begin
      Tambour := TTambour.Create(Image1, edNombre.Text);
    end.
    il suffit ensuite de donner une nouvelle valeur à Tambour.Text pour changer son affichage...attention sa largeur dépend directement du nombre de lettres dans le texte.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Paul TOTH : voici une approche orientée objet
    OK, mille fois merci.

    Après avoir viré les premières approches j'ai testé la nouvelle dont voici le Zip.
    Pour la rotation des tambours c'est OK.
    Mais il reste qq-part un ou deux bugs de logique car :
    - au lancement les chiffres devraient s'afficher directement sans la rotation,
    - puis en cliquant ensuite sur le bouton "Animer" qui déclenche l'incrémentation du nombre dans Timer1Timer c'est carrément le chaos (!!!???).

    attention sa largeur dépend directement du nombre de lettres dans le texte.
    J'ai prévu une largeur pour 20 tambours ça doit suffire pour des Int64 comme pour des Extended.

    A+.
    Fichiers attachés Fichiers attachés
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. affichage de donnée avec double quote
    Par artichaudd dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2011, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo