begin process at 2010 02 10 05:32:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > TABLEAU DE VOYANTS CLIGNOTANTS

TABLEAU DE VOYANTS CLIGNOTANTS


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :clignotant, voyants, leds, timer, souris Niveau :Débutant Date de création :18/12/2006 Date de mise à jour :01/05/2008 09:25:33 Vu / téléchargé :7 420 / 742

Auteur : Jean_Jean

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
J'est en me heurtant à une gestion de voyants (Voir la capture!) que j'ai décidé de publier ce code. Il me fallait des voyants clignotants!

Ce programme pourra servir à d'autres débutants.

L'utilisateur peut modifier le nombre de voyants, de niveau et leur dimension (en partie)

Source

  • Les thèmes et intérêts de programmation sont divers :
  • Pour la 1ère version :
  • - Image des voyants chargés par appel direct du fichier Bitmap:
  • TImage(FindComponent('Image' + IntToStr(i))).Picture.LoadFromFile(FicVoy);
  • Ou par référence à un index du composant ImageList
  • ImageList1.GetBitmap(1,TImage(Components[i]).Picture.Bitmap)
  • - Sélection visuelle d'option (en cliquant sur un voyant). Paramétrage de la colonne et de la ligne d'une Matrice de voyants
  • Colonne = Process concerné / Ligne = Niveau du Paramètre du Process
  • - Clignotement (par deux timers) du Voyant concerné par l'option choisie
  • - Identifications dynamiques divers de voyants :
  • if Assigned(FindComponent('Image' + IntToStr(i))) then
  • TImage(FindComponent('Image' + IntToStr(i))).Picture.LoadFromFile(FicVoy)
  • ou
  • If Components[i] Is TImage Then if ( Components[i].Name = 'Image4') then...
  • Pour la 2ème version, on ajoutera :
  • - Création Dynamique des Leds
  • - Centralisation des clics de sélection des leds
  • - Personnalisation du tableau des Leds : Nombre de proces, de leds par process, espacements...
  • On notera que le deuxième source (blincker 2) est beaucoup moins gourmand en octets
  • Jean_Jean
Les thèmes et intérêts de programmation sont divers : 

Pour la 1ère version :

- Image des voyants chargés par appel direct du fichier Bitmap:       
  TImage(FindComponent('Image' + IntToStr(i))).Picture.LoadFromFile(FicVoy);
  Ou par référence à un index du composant ImageList
  ImageList1.GetBitmap(1,TImage(Components[i]).Picture.Bitmap)

- Sélection visuelle d'option (en cliquant sur un voyant). Paramétrage de la colonne et de la ligne d'une Matrice de voyants
  Colonne = Process concerné / Ligne = Niveau du Paramètre du Process

- Clignotement (par deux timers) du Voyant concerné par l'option choisie
- Identifications dynamiques divers de voyants :
      if Assigned(FindComponent('Image' + IntToStr(i))) then
      TImage(FindComponent('Image' + IntToStr(i))).Picture.LoadFromFile(FicVoy)
      ou
      If Components[i] Is TImage Then if ( Components[i].Name = 'Image4') then...

Pour la 2ème version, on ajoutera :

- Création Dynamique des Leds
- Centralisation des clics de sélection des leds
- Personnalisation du tableau des Leds : Nombre de proces, de leds par process, espacements...

On notera que le deuxième source (blincker 2) est beaucoup moins gourmand en octets

Jean_Jean

 Conclusion

Le source est commenté en détail.
Le code est encore améliorable. Notamment, celui d'écrire un Objet Tableau de voyants ou un composant comme l'a suggéré Florenth :-)
L'utilisation va de soi et peut s'adapter très facilement...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

31 décembre 2006 17:53:09 :
18/12/2006 : 1ère version non optimisée plusieurs timers, images statiques, 1 méthode par voyant... Bien que le code n'est pas de haut niveau, je l'ai laissé. il permet aux débutants de voir les différents niveaux de programmation. Le code fourni n'était alors que prétexte à faire une petite révision de l'utilisation de quelques instructions. 31/12/2006 : 2ème version optimisée suivant les commentaires du 1er source Paramètres modifiables du tableau de Leds Création Dynamique des Leds : 1 fréquence possible par led 1 seule méthode pour la sélection d'une Led quelconque Merci à ceux qui ont participé
01 mai 2008 09:25:34 :
01/05/2008 : Corrections orthographiques

 Sources du même auteur

Source avec Zip Source avec une capture GESTION DE CASES À COCHER PERSONNALISÉES DANS UN STRINGGRID
Source avec Zip Source avec une capture COULEURS SYSTÈME

 Sources de la même categorie

Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA par Bacterius
Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture DÉFORMER UNE IMAGE AUX DIMENSIONS D'UN QUADRANGLE QUELCONQUE... par FFCAST
Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette
Source avec Zip Source avec une capture ÉCRAN DE VEILLE FEU D'ARTIFICE par barbichette

 Sources en rapport avec celle ci

Source avec Zip TMICROTIMER - TIMER À LA MICROSECONDE ! par Bacterius
Source avec Zip Source avec une capture SIMULATION DE PLUSIEURS TIRAGES DU JEU DE JOKER (LOTTO) par bad_dark_spirit
Source avec Zip Source avec une capture KEYMOUSE PARAMÉTRAGE, OU MODIFIER LES PARAMÈTRES DE LA SOURI... par Bacterius
Source avec Zip Source avec une capture UN CHRONOS SIMPLE AVEC UN COMPOSENT LABEL ANIMÉ par jackalunion
Source avec Zip Source avec une capture NI CLIC NI TOUCHE par barbichette

Commentaires et avis

Commentaire de f0xi le 19/12/2006 09:39:21 administrateur CS

pfiuuu que de code pour ça ...

tu pourrais optimiser tout cela avec des tableaux, des inverseurs booléens ect... ect...

exemple avec des paintbox :

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    PaintBox2: TPaintBox;
    PaintBox3: TPaintBox;
    PaintBox4: TPaintBox;
    PaintBox5: TPaintBox;
    PaintBox6: TPaintBox;
    PaintBox7: TPaintBox;
    PaintBox8: TPaintBox;
    PaintBox9: TPaintBox;
    PaintBox10: TPaintBox;
    PaintBox11: TPaintBox;
    PaintBox12: TPaintBox;
    PaintBox13: TPaintBox;
    PaintBox14: TPaintBox;
    PaintBox15: TPaintBox;
    PaintBox16: TPaintBox;
    PaintBox17: TPaintBox;
    PaintBox18: TPaintBox;
    PaintBox19: TPaintBox;
    PaintBox20: TPaintBox;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    procedure DoImageClick(Sender : TObject);
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TBlinker = record
    Image     : TPaintBox;
    State     : boolean;
    Enabled   : boolean;
    Frequency : integer;
    Tick      : integer;
  end;

var
  BlinkColors : array[boolean] of Integer = (clGreen, clLime);
  Blinkers    : array of TBlinker;

procedure TForm1.FormCreate(Sender: TObject);
var N : integer;
begin
  Randomize;
  SetLength(Blinkers, 20);
  For N := 0 to high(Blinkers) do
      with Blinkers[N] do begin
           state     := false;
           enabled   := true;
           Frequency := (N+1) shl 1;
           Tick      := 0;
           Image     := TPaintBox(FindComponent('PaintBox'+IntToStr(N+1)));
           Image.Tag := N;
           Image.OnClick := DoImageClick;
           Image.Hint    := 'F = '+inttostr(Frequency*Timer1.Interval)+' ms';
      end;
   Timer1.Interval := 10;
end;

procedure TForm1.DoImageClick(Sender : TObject);
begin
  with Blinkers[(sender as TPaintBox).Tag] do begin
       Enabled := not Enabled;
       State   := false;
       Tick    := 0;
       Image.Canvas.Brush.Color := BlinkColors[state];
       Image.Canvas.FillRect(Image.ClientRect);
  end;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var N : integer;
begin
   for N := 0 to High(Blinkers) do
      with Blinkers[N] do
        if Enabled then begin
           inc(Tick);
           if Tick >= Frequency then begin
              State := not State;
              Image.Canvas.Brush.Color := BlinkColors[state];
              Image.Canvas.FillRect(Image.ClientRect);
              Tick  := 0;
           end;
        end;
end;


end.

Commentaire de Francky23012301 le 19/12/2006 12:54:42

@f0xi : quitte à utiliser 20 TPainBox autant les créer dynamiquement (idem pour le timer) non ?

Commentaire de Jean_Jean le 19/12/2006 13:14:12

Vive la jeunesse!
J’aimerai avoir 20 ans de moins et avoir plus de temps. Changer d’activité et reprendre une spécialisation de 3ème cycle à 50 balais!…Pas évident, mais j’ai l’enthousiasme d’un jeune de 20 ans dans tout ce que je fais. Alors merci à tous!

Je me doutai bien que mon code ferait bondir les pros ! J’ai un tas de code en attente, mais si je ne publie pas, je ne vais pas progresser. Par exemple, j’étais gêné d’utiliser 2 timers pour 1 clignotant, mais mon souci 1er était ailleurs!

Délibérément, je n’ai pas voulu me lancer dans la conception d’un composant car je n’arrive pas à les installer. De plus, avec la migration de D5 à D7, j’ai perdu tout le travail que j’avais fait en composants !…. Borland ne m’a pas renvoyé mon code d’utilisateur de delphi 7 (je leur ai envoyé pourtant le n° de série). Donc, j’attends de normaliser et clarifier mon installation de Delphi, avant de gérer à nouveau : Composants et Bases de données.

Florenth, OK. Je vais peut-être créé un Objet Clignotant plutot qu’un composant ? ça reviendra au même, non ?
Foxi, OK. Je vais tester ta solution. Y a t-il une raison pour que tu choisisses PaintBox au lieu de Image ?
Francky, OK!

Bien à vous !

Commentaire de Jean_Jean le 19/12/2006 18:08:54

Merci Florenth :)
J'ai d'autres priorités! il faut que je clarifie chez Borland. En fermant mon entreprise, je suis passé de 4 à 1 ordinateur. ça pas été sans problème!
Je remettrai tout nickel un peu plus tard!

Mais ça fait plaisir de voir que je fais un peu parti de la communauté des delphim'ans et qu'elle vit bien au travers de ce site. J'ai plein de choses à donner, mais faut pas pousser mémé, sinon, je panique!!!

Je connais la procédure pour créer 1 Compo... On verra plus tard! Je travaille sur un compte utilisateur. c'est peut-être ça le bug car j'ai installé D7 sur le Compte Admi.

Pour l'appli,
Je vais essayer de créer un Objet Led et tenir compte de vos remarques. après réflexion, ça pourrait être intéressant. Je posterai une nouvelle version, quand je sentirai que je suis bloqué pour optimiser plus!

A +

Commentaire de japee le 19/12/2006 22:41:10 administrateur CS

Salut Jean_Jean,

Ben c'est plutôt sympa, pour un premier envoi.
Il est certain qu'il y a moyen d'optimiser, et je vais y aller moi aussi de ma petite suggestion.
Tiens, comme ça, par exemple, pourquoi ne pas l'écrire ainsi :

procedure TForm1.Eteint_Voyants(aNumThrd : Byte);
  Var i : Byte;
begin
  FicVoy := Rep+'LEDoff.bmp';
  for i := ((aNumThrd - 1) * 7) + 1 to aNumThrd * 7 do
    if Assigned(FindComponent('Image' + IntToStr(i))) then
      TImage(FindComponent('Image' + IntToStr(i))).Picture.LoadFromFile(FicVoy);
end;

On gagne quelques lignes de code, et c'est plus rigolo.
Car la programmation, faut que ça reste rigolo, telle est ma devise.

Florenth a dit :
"Qu'est ce qu'on s'embetterait si tous les codes du site étaient de la pure merveille, prêt-à-l-emploi ou encore z-avez-qu-a-le-déposer-sur-la-fiche ..."

Je suis entièrement d'accord avec lui.
Et, oserai-je ajouter, on s'emmerderait grave...

Bonne continuation à tous.

japee

Commentaire de Jean_Jean le 19/12/2006 23:57:14

Ha oui, merci Japee!

Bonne idée. Je corrige tout de suite.
j'étais justement en train d'adapter ton code sur la création dynamique à l'appli

:)@+

Commentaire de f0xi le 20/12/2006 00:27:59 administrateur CS

salut les zoulous!

@francky :

mon but premier n'etait pas de dynamisé les compos de la fiche mais de montrer ce qu'on pouvait faire avec 3 procedure et un seul timer (toute les paintbox clignote a leurs propre frequence).

@jeanjean :

pour les compos, y'a que l'embaras du choix, soit on part d'une classe TGraphicControl, soit d'un RadioButton ou encore un TRadioGroup etc....
comme je disais a je sais plus qui y'a pas longtemps, quand on commence a avoir des tonnes de lignes de codes redondante ... il faut se demander si il n'y a pas un chemin plus cours.

Pour ce qui est des pertes de compos, y'a une astuce simple, tu crée un dossier "delphi" sur une partition ou disque different du C:.
avec comme sous repertoire : Delphi\Lib et Delphi\Projects
ce qui permet, en cas de reinstallation de Delphi ou du systeme ou de formatage du disque C: de ne rien perdre.
on peu d'ailleur faire pareil avec le dossier "mes documents", on peu le placer ailleur que sur  C: (click droit sur "Mes documents" > propriétés > onglet cible > deplacer)


Commentaire de Jean_Jean le 20/12/2006 08:44:18

Oui, merci Francky

OK pour tout.

1. Pour la gestion de mes sources,j'ai perdu des mois de boulot sur certains codes suite à un Pb de hard! Je suis en train d'installer un disque de sauvegarde externe.

2. j'ai testé ton code,c'est OK. Je suis en train de l'adapter. Je pense que je vais procéder en plusieurs étapes. La création d'un composant suggérée par Florenth est une bonne idée que j'exploiterai plus tard. Voilà pour l'heure les  types que j'ai créés pour l'instant :

  {fiche----------------------------------}
  TFormBlinker = class(TForm)
    Timer1: TTimer;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Déclarations privées }
    procedure DoImageClick(Sender : TObject);
    procedure Libere_Les_Leds;
  public
    { Déclarations publiques }
  end;

  {Voyant ----------------------------------}
  TBlinker = record
    Image     : TImage;
    State     : boolean;
    Enabled   : boolean;
    Frequency : integer;
    Tick      : integer;
  end;

  {Classe Led  -----------------------------}
  TLedBlink = class(TImage) // classe héritant de TPaintBox
  public
    constructor Create(aLed : TComponent); override;
    procedure   aLedClick(Sender : TObject);
  end;

Const
  NledProcess = 7;
  NProcess    = 4;
Var
  FormBlinker : TFormBlinker;
  BlinkColors : array[boolean] of Integer = (clGreen, clLime);
  Blinkers    : array of TBlinker;
  NbreLeds    : Integer;  // compte les voyants créés
  aLedblink   : TLedBlink;

3. J'ai préféré un TImage pour Image, car je n'arrive pas à affecter une image bmp existente de manière dynamique à un PaintBox.

4. D'ailleurs ça bug toujours dans la procédure Timer1Timer. Les images ne clignotent pas et s'effacent. Je vais m'y pencher un peu aujourd'hui.

    if Tick >= Frequency then
    begin
      State := not State;
      if State then
      begin
        ImageList1.GetBitmap(0,TImage(FindComponent('Image'+IntToStr(N+1))).Picture.Bitmap);
        TImage(FindComponent('Image'+IntToStr(N+1))).Refresh;
      end else
      begin
        ImageList1.GetBitmap(1,TImage(FindComponent('Image'+IntToStr(N+1))).Picture.Bitmap);
        TImage(FindComponent('Image'+IntToStr(N+1))).Refresh;
      end;
...

Commentaire de Jean_Jean le 20/12/2006 09:01:21

Autant pour Moi!

La procédur Timer1Timer fonctionne, j'avais résolu le Pb!

:)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Icone dans une TTooBar [ par lguez ] Dans le TTOOLBAR on peut afficher une image differente si la souris passe sur une icone de la ToolBar ou non en renseignant les champs Images et HotIm Sacré Mikey, c jamais ou il est! :: Prob localisation souris [ par Gysmo ] Salut a tous!Voila j'ai creer sur mon prog des bontons avec des TImage superposé. Kan on click ca change d'image, une image bouton normal, une image b Un TIMER plus précis... [ par DAR ] Je cherche un timer beaucoup plus précis que celui livré avec Delphi.Il me faut une précision de l'ordre de la micro seconde.Merci à ceux qui pourront Position souris dans un RichEdit [ par bassman64 ] Je voudrais savoir comment faut faire pour coller du text à la position du curseur de la souris !J'arrive à coller le text : ClipBoard.AsText;Mais pas cacher curseur souris [ par crogger ] salut, comment fairs-t(on disparaitre le curseur de la souris de windows ? cad pas que dans ma propre apli....ShowCursor(False) ne fonctionne que si l Disable le scroll sur un TDBGrid [ par MasterJ ] Salut tt le monde,Voila le probleme, sur un TDBGrid, lorsqu'un utilisateur utilise le scroll de la souris et ensuite double clique sur un autre enregi Comment déplacer un composant TImage avec la souris lors de l'éxecution de l'application???? [ par MasterNKZ ] Comment déplacer un composant TImage avec la souris lors de l'éxecution de l'application????J'ai une source pour déplacer un composant avec la souris, Image surlove [ par Youyou0214 ] Salut tout le monde,Je voudrais savoir comment sur le passage de la souris on peut change d'image et de remettre l'ancienne image des que la souris n' Message du système [ par Bruto ] J'ai consulté le tutoriel sur le message dans la rubrique Tutoriaux mais il ne me montre pas comment capter un message du système.Avec la façon citée, click souris [ par exyacc ] comment je peux recuperer un click souris en dehors de ma form ?merci ;)


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales