Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 1 oct. 2008 à 14:42
Oui je vois ça ... un defi ^^
C'est toujours interessant de trouver des solutions alternatives.
Mais n'etait-ce pas toi qui m'avais fait remarquer que 81 bitmaps (pour le calcul mental) en fichiers ça faisait usine à gaz ?
Je trouve que 1 image et 1 shape ça fait un peu crade comme code ^^
Mais sinon, je ne savais pas que les Shapes pouvaient se fusionner avec en dessous !
C'est cool ça ^^ je vais pouvoir m'amuser ^^
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 1 oct. 2008 à 14:04
Bon sinon j'ai ajouté ... enfin voir description et mise à jour.
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 1 oct. 2008 à 14:03
...
J'ai fait pareil de mon côté :
100 Images + 100 Shape = 4432 Ko // Mais j'ai pas fait la procédure ni ajouté les bitmaps
100 LEDs = 3762 Ko
Hmm ...
Cordialement, Bacterius !
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 sept. 2008 à 22:47
Je viens de poser 100 fois ton composant sur une fiche, je regarde la place en mémoire occupée : 3400k
J'ai ensuite fait 100 shape et 100 timage avec une image transparente dedans et une procedure pour les couleurs : 3200k
Qui est lourd ? ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 sept. 2008 à 21:41
Ah oui juste un truc :
si je ne me trompe pas, le composant est juste une instance du code que j'ai écrit pour la LED ?
C'est à dire que les tableaux constante ne seront pas recréés sur chaque composant, mais appelés par chaque instance ?
Donc sur 40 LEDs sur une form, seul 1 tableau de constante sera déclaré pour tous ?
Je crois que c'est ça mais je ne suis pas sur ...
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 sept. 2008 à 21:39
Sinon c'est toujours une connaissance de plus, savoir qu'on peut fusionner une couleur avec un TShape et les pixels derrière ^^ Ca peut aider du monde ...
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 sept. 2008 à 21:39
Ouais mais bon ... ton simple code ... 1 fichier bitmap, 1 TImage, 1 TShape, un peu lourd tout ça ...
C'est sûr que ça peut aller plus vite avec un shape avec Brush fixé à blending AND, ^^
Evidemment installer un composant c'est lourd, mais avec un projet avec 20 LEDs elle devient vite lourde avec 20 shapes et 20 images :'(
Cordialement, Bacterius !
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 sept. 2008 à 20:15
Nan, ton composant est très bien dans la forme, dans dans le fond je ne trouve pas car il est vite rattrapé par du simple code.
Oui j'utilise une bitmap, toi aussi non ? ^^
Je donne les couleurs a des TShape sous les bitmap transparents, l'effet est le meme et le choix de couleur est plus grand.
Oui, ma ligne de code ne ferait pas long feu ici ^^ lol
Bien vu pour ton compo néanmoins !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 sept. 2008 à 18:57
Ouais mais tu utilises quand même un bitmap, et tu lui donnes des couleurs.
(encore une fois) tu viens de casser ma source ...
[cherche quelque chose à dire]
Ah !
Néanmoins, ta ligne de code présente moins d'intêret, du point de vue de la programmation, que mon composant.
De plus, une ligne de code est assez limite en termes de quantité, pour pouvoir être admis en tant que source.
^^
Sinon, c'est toujours plus simple, pour ceux qui n'auraient pas envie d'utiliser mon composant.
Bien vu JulioDelphi ^^
Cordialement, Bacterius !
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 sept. 2008 à 18:19
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 sept. 2008 à 17:58
Ben ouais mais tu n'auras jamais les beaux bitmaps, avec un reflet de lumière ...
C'est ça qui fait de mon composant plus qu'une ellipse avec des bords noirs ...
Sans le reflet de lumière c'est différent ... :'(
Cordialement, Bacterius !
cs_pascal99
Messages postés24Date d'inscriptionmercredi 10 septembre 2003StatutMembreDernière intervention20 janvier 2009 30 sept. 2008 à 14:45
Merci JulioDelphi,
Apres avoir ouvert ton source, tu avais effectivement tout donné dans ton message.
La simplicité a l’état pur !!!
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 sept. 2008 à 14:14
@Bluperfect : ce n'est pas de l'objet ? c'est a dire ?
Mon but était d'obtenir un résultat le plus proche possible de son composant SANS son composant, juste les compos de base de delphi.
Reussi ou pas ?
@pascall99 : Euh, si je l'ai même déjà donnée dans mon post au dessus ! Une seule ligne de code.
Voici en plus l'image de la diode et une propriété à modifier :
et tu mets "Transparent=true" sur les 3 TImage.
Les 3 TShape étant des cercles sans bord posés SOUS les TImages transparentes.
Puis pour finir les TShapes sont nommés "ShapeON" "ShapeOFF" et "ShapeDIS".
Ces 3 noms sont le HINT des Colorbox.
Bon ok je fais un zip (l'image est dedans) ...
http://diabloporc.free.fr/delphi/demos/led_sans_compo.zip
cs_pascal99
Messages postés24Date d'inscriptionmercredi 10 septembre 2003StatutMembreDernière intervention20 janvier 2009 30 sept. 2008 à 13:12
Bonjour,
JulioDelphi, tu n'aurais pas la source de ce led_sans_compo par hasard ?
a+
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 30 sept. 2008 à 12:25
C'est pas de l'objet ton truc....
DH
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 sept. 2008 à 09:45
Salut !
Alors moi j'avoue je n'ai pas encore lu le code ni les commentaires mais je propose ça :
La même chose que toi mais sans aucun composant externe.
Juste 3 TGroupBox, 3 TShape, 3 TImage, 3 TColorBox, 3 TLabel et une seule ligne de code dans le onchange des colorbox :
(FindComponent((Sender as TColorBox).Hint) as TShape).Brush.Color:= (Sender as TColorBox).Selected;
De plus, on peut mettre toutes les couleurs et pas seulement 9.
Reste à faire 3 procédure si on veut faire des positions on, off, disa...
Des commentaires ? ^^
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 29 sept. 2008 à 22:52
Tiens, à propos de OnMuseEnter et OnMouseLeave, un truc utile :
Cacher le curseur après un délai d'inactivité, et le rétablir après un mouvement !
DH
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 29 sept. 2008 à 21:46
Bon, j'ai intégré les évenements OnMouseEnter et OnMouseLeave (j'ai suivi les instructions de mon bouquin Borland avec mes evenements perso, et je me suis légèrement inspiré de la TextImage de Guillemouze pour l'idée ^^).
Ces evenements peuvent être utiles pour une LED ... (quand on pointe la souris dessus on change la LED de couleur ... enfin vous voyez le truc).
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 29 sept. 2008 à 20:51
Bon voilà, le composant possède un petit moteur d'aide bien à lui.
GetLedElementHelp.
J'ai repris ton idée des tableaux constante Cirec, pour écrire directement la définition et le nom.
Voilà ...
Ca ne servira probablement à rien, au fond, mais c'est un entraînement supplémentaire ^^
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 29 sept. 2008 à 18:06
Voilà Cirec, j'ai ajouté ta boucle ordinale, en la commentant (pour bien montrer que j'ai compris le principe) et en modifiant juste le formattage (le 1 >> Pink) ne me plaisait pas, j'ai remplacé par des listes de cette façon :
(0) Aqua
(1) Pink
(2) Purple
(3) Red
...
C'est sûr que c'est plus pratique, plus besoin d'aller modifier la liste des 3 combos lorsqu'on ajoute une couleur.
Je n'ai pas mis à jour la capture mais je pense que vous avez compris.
Cordialement, Bacterius !
offlake
Messages postés190Date d'inscriptionmercredi 3 septembre 2008StatutMembreDernière intervention17 janvier 2009 29 sept. 2008 à 00:07
Merci Cirec
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 22:37
Oui je mets tout le code en anglais, je trouve que c'est plus conventionnel, plus pratique, et plus professionnel ^^
Sinon, il est tard, je mettrai ça demain apres-midi :)
Merci encore Cirec je n'y aurais jamais pensé à Ord.
est de type ordinal, tu peux donc faire : aInt :Ord(lcAqua); // aInt 0 aInt :Ord(lcPurple); // aInt 2
etc. etc.
et sinon regarde ce que tu peux faire avec l'exemple que je t'ai donné:
(vide tes deux ComboBox (OnCombo & OffCombo)et remplace le code du OnCreate par celui-ci)
procedure TMainForm.FormCreate(Sender: TObject);
var I: TLedColor;
begin
for I := Low(TLedColor) to High(TLedColor) do
begin
OnCombo.Items.Add(Format('%d >> %s', [Ord(I), StrLedColor[I]]));
OffCombo.Items.Add(Format('%d >> %s', [Ord(I), StrLedColor[I]]));
end;
DoubleBuffered := True;
OnLedComp := TSwitchLed.Create(Self);
OnLedComp.Left := 6; // Création dynamique du ON
OnLedComp.Top := 14;
OnLedComp.LedState := lsOn;
OnLedComp.Parent := OnBox;
OnCombo.ItemIndex := Ord(OnLedComp.OnColor);
OffLedComp := TSwitchLed.Create(Self);
OffLedComp.Left := 7; // Création dynamique du OFF
OffLedComp.Top := 14;
OffLedComp.LedState := lsOff;
OffLedComp.Parent := OffBox;
OffCombo.ItemIndex := Ord(OnLedComp.OffColor);
end;
voilà plus besoin d'écrire ça en dur ... et c'est tellement plus simple
Les couleurs ne sont plus en Français ... mais là c'est toi qui avait choisi de nommer les ressources en Anglais ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 19:01
Bon voilà, l'exemple est mis à jour.
On peut maintenant modifier les 3 valeurs (OnColor, OffColor, DisabledColor) des LEDs depuis l'exemple.
Le feu rouge est toujours là :)
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 18:03
Voilà c'est fait.
En fait, j'avais besoin d'une de ces fonctions pour une version surchargée de GetBitmap, et j'ai pas pensé à virer l'autre.
Puis après ton message, je me suis rendu compte que la version de GetBitmap avec Index était inutile comparée à celle avec Color.
Donc voilà c'est fait.
J'ai ajouté quelques commentaires en plus ...
vires moi ces deux procedures "IntToLedColor & LedColorToInt" ... je les ai pas virés pour que tu les remettes à la première occase. Ö
regarde comment j'ai fait dans la procedure "SetLedBmp"
c'est exactement le même principe ;)
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 14:43
Ah j'ai ajouté GetBitmap (pour récupérer dans un objet TBitmap le bitmap LED demandé).
Et OffLake tu peux remercier Cirec, qui a fait pas mal d'optimisation (notamment dans le dessin et le stockage des bitmaps LEDs), et te remercier aussi (je n'aurais jamais eu l'idée de faire ce composant sans ta source ^^).
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 13:03
De rien, mais dans un gros projet qui contient genre 15 leds, ne te fatigue pas à les créer dynamiquement.
Place les directement sur ta fiche, car créer 15 composants dynamiquement c'est très pénible et source d'erreurs.
Cordialement, Bacterius !
offlake
Messages postés190Date d'inscriptionmercredi 3 septembre 2008StatutMembreDernière intervention17 janvier 2009 28 sept. 2008 à 12:45
Ohh Bacterius c bien comme composants franchement jte felicite !!
La prochaine fois nimporte qu'elle LED je vai le créer dynamiquement en suivant te code
merci
Offlake
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 12:09
Bon voilà, tout ça a été arrangé, j'ai ajouté des petites optimisations perso en passant.
John Dogget j'ai pensé à toi, je n'ai pas mis le thème WindowsXP dans l'exemple (tu as toujours un écran noir après ...) ^^
"tu as la folie des composants en ce moment ...." oui c'est vrai ... mais je découvre juste, j'ai envie d'approfondir.
Sinon, pour la création des 9 bitmaps à chaque Paint, c'était car j'avais peur que les bitmaps ne soient pas libérés à la destruction du composant, si je les mettait en propriété globale (si jamais on kill une application avec une LED dedans ...), mais je crois que Destroy est appellé de toute façon non ? Même avec un Kill ?
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 sept. 2008 à 11:30
Oui, sauf que quand on poste une source, qui est sans nul doute très interessante (voir sources OffLake) et qu'on utilise une JVCL complète pour en utiliser qu'une LED et 1 bouton XP, je pense qu'il est plus préférable de coder ces 2 compos :)
Surtout pour ceux qui ont des difficultés à installer la JVCL.
Je vais appliquer les idées de Cirec.
Cordialement, Bacterius !
John Dogget
Messages postés384Date d'inscriptionvendredi 18 juin 2004StatutMembreDernière intervention 7 mai 2009 28 sept. 2008 à 09:53
Tu mets un TBevel entre les deux, et tu lui mets une hauteur de 2 ;)
Bon sinon, c'est effectivement très bien de créer ses propres composants pour ses propres besoins.
Mais pour ceux qui comme moi n'ont pas envie de réinventer la roue à chaque fois, les packs e composants sont vraiment très utiles.
La JVCL en particulier est un outils (open-source) extraordinaire qui offre des compos qu'on ne trouve pas ailleurs.
Je comprends très bien qu'il soit preferable de se servir des compos de base Delphi pour poster ici, mais pour d'autres projets il n'y as pas de raisons de s'en priver ...
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 28 sept. 2008 à 07:50
A propos de composants :
Comment tirer un trait entre deux TComponents sur un TForm dans l'EDI ?
avant que tu fasses une mise à jour je tiens à te dire que la voie utilisée n'est pas la bonne ...
tu recharges continuellement toutes les images pour libérer de suite après (dans la procedure Paint) et il y a pas mal de code inutile.
Je te propose donc une autre version plus efficace dans la gestion des bitmaps et leurs index :
**********************************************************************************
unit SwitchLed;
type
TLedColor=(lcAqua, lcPink, lcPurple, lcRed, lcYellow, lcGreen,
lcBlue, lcOrange, lcBlack); // Type couleur de la LED
TLedState=(lsOn, lsOff, lsDisabled); // Type état de la LED
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnStartDrag;
property OnDragOver;
property OnEndDrag; // On remet tous les évenements hérités
property OnDragDrop;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock; // Je ne suis pas sûr pour les docks ...
property OnEndDock;
property PopupMenu; // On remet le popupmenu
property ShowHint; // On remet ShowHint
property Visible; // On remet Visible
end;
procedure Register;
implementation
{$R Leds.res}
procedure Register;
begin
RegisterComponents('Bacterius', [TSwitchLed]); // Recensement du composant
end;
constructor TSwitchLed.Create(AOwner: TComponent);
begin
inherited Create(AOwner); // Constructeur hérité
// Parent := TWinControl(AOwner); // Le parent sera un transtypage de AOwner
FOnColor := lcGreen; // Couleur ON par défaut
FOffColor := lcRed; // Couleur OFF par défaut
FDisabledColor := lcBlack; // Couleur DISABLED par défaut
FLedState := lsOff; // Etat de la LED par défaut
FAllowChanges := True; // On autorise la modification des valeurs
FVersion := '1.3'; // On fixe la version
FAuthor := 'Bacterius'; // On fixe l'auteur
Width := 13;
Height := 13; // C'est la taille des bitmaps LEDs
procedure TSwitchLed.SetOnLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FOnColor then
begin
FOnColor := Value; // On définit
SetLedBmp(lsOn, FOnColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetOffLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FOffColor then
begin
FOffColor := Value; // On définit
SetLedBmp(lsOff, FOffColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetDisabledLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FDisabledColor then
begin
FDisabledColor := Value; // On définit
SetLedBmp(lsDisabled, FDisabledColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetLedBmp(const Idx: TLedState; Value: TLedColor);
begin
if not Assigned(FLedBmp[Idx]) then
begin
FLedBmp[Idx] := TBitmap.Create;
FLedBmp[Idx].TransparentColor := clGreen;
FLedBmp[Idx].Transparent := True; // On fixe la transparence :)
end;
procedure TSwitchLed.SetLedState(Value: TLedState);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FLedState then
begin
FLedState := Value; // On définit
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.Paint;
begin
if Width <> 13 then Width := 13; // On empeche de redimensionner
if Height <> 13 then Height := 13;
// On dessine
Canvas.Draw(0, 0, FLedBmp[LedState]);
end;
destructor TSwitchLed.Destroy;
var I: TLedState;
begin
for I:= Low(TLedState) to High(TLedState) do
FLedBmp[I].Free;
inherited Destroy;
end;
end.
**********************************************************************************
dans l'unité Main il y a aussi des changements
la procedure FormClose est inutile, l'affectation correcte du parent des Leds et la selection des couleurs:
**********************************************************************************
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
OnLedComp := TSwitchLed.Create(Self);
OnLedComp.Left := 6; // Création dynamique du ON
OnLedComp.Top := 14;
OnLedComp.LedState := lsOn;
OnLedComp.Parent := OnBox;
OffLedComp := TSwitchLed.Create(Self);
OffLedComp.Left := 7; // Création dynamique du OFF
OffLedComp.Top := 14;
OffLedComp.LedState := lsOff;
OffLedComp.Parent := OffBox;
end;
procedure TMainForm.ModifyColors(Sender: TObject);
Var
TmpColor: TLedColor;
begin
if Sender is TComboBox then // Si c'est bien un combobox alors ...
begin
if not (TComboBox(Sender).ItemIndex in [0..7]) then Exit;
// Si l'itemindex est incorrect on s'en va
TmpColor := TLedColor(TComboBox(Sender).ItemIndex);
// On définit la couleur selon l'itemindex du combobox sender
case TComboBox(Sender).Tag of
1: OnLedComp.OnColor := TmpColor; // Selon le tag du combobox on modifie le led correspondant
2: OffLedComp.OffColor := TmpColor;
end;
end;
end;
**********************************************************************************
il y a encore d'autres possibilités mais je t'en laisse un peut ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 sept. 2008 à 23:42
Bon demain je fais l'optimisation en masse (index pour modifier les couleurs), et d'autres choses :)
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 sept. 2008 à 22:22
Ah oui je n'ai pas mis à jour l'exemple suite à la modification du composant.
Je ferai ça demain.
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 sept. 2008 à 22:14
Bon, en regardant la LED de Mauricio (dans les sources en rapport), j'ai remarqué qu'il manquait un truc à ma LED : un état éteint, soit Disabled. Et une couleur noire aussi.
C'est réparé :)
1 oct. 2008 à 14:42
C'est toujours interessant de trouver des solutions alternatives.
Mais n'etait-ce pas toi qui m'avais fait remarquer que 81 bitmaps (pour le calcul mental) en fichiers ça faisait usine à gaz ?
Je trouve que 1 image et 1 shape ça fait un peu crade comme code ^^
Mais sinon, je ne savais pas que les Shapes pouvaient se fusionner avec en dessous !
C'est cool ça ^^ je vais pouvoir m'amuser ^^
Cordialement, Bacterius !
1 oct. 2008 à 14:04
Cordialement, Bacterius !
1 oct. 2008 à 14:03
J'ai fait pareil de mon côté :
100 Images + 100 Shape = 4432 Ko // Mais j'ai pas fait la procédure ni ajouté les bitmaps
100 LEDs = 3762 Ko
Hmm ...
Cordialement, Bacterius !
30 sept. 2008 à 22:47
J'ai ensuite fait 100 shape et 100 timage avec une image transparente dedans et une procedure pour les couleurs : 3200k
Qui est lourd ? ^^
30 sept. 2008 à 21:41
si je ne me trompe pas, le composant est juste une instance du code que j'ai écrit pour la LED ?
C'est à dire que les tableaux constante ne seront pas recréés sur chaque composant, mais appelés par chaque instance ?
Donc sur 40 LEDs sur une form, seul 1 tableau de constante sera déclaré pour tous ?
Je crois que c'est ça mais je ne suis pas sur ...
Cordialement, Bacterius !
30 sept. 2008 à 21:39
Cordialement, Bacterius !
30 sept. 2008 à 21:39
C'est sûr que ça peut aller plus vite avec un shape avec Brush fixé à blending AND, ^^
Evidemment installer un composant c'est lourd, mais avec un projet avec 20 LEDs elle devient vite lourde avec 20 shapes et 20 images :'(
Cordialement, Bacterius !
30 sept. 2008 à 20:15
Oui j'utilise une bitmap, toi aussi non ? ^^
Je donne les couleurs a des TShape sous les bitmap transparents, l'effet est le meme et le choix de couleur est plus grand.
Oui, ma ligne de code ne ferait pas long feu ici ^^ lol
Bien vu pour ton compo néanmoins !
30 sept. 2008 à 18:57
(encore une fois) tu viens de casser ma source ...
[cherche quelque chose à dire]
Ah !
Néanmoins, ta ligne de code présente moins d'intêret, du point de vue de la programmation, que mon composant.
De plus, une ligne de code est assez limite en termes de quantité, pour pouvoir être admis en tant que source.
^^
Sinon, c'est toujours plus simple, pour ceux qui n'auraient pas envie d'utiliser mon composant.
Bien vu JulioDelphi ^^
Cordialement, Bacterius !
30 sept. 2008 à 18:19
Tu aurais vu mon adresse du screen
http://diabloporc.free.fr/delphi/demos/led_sans_compo.jpg
et moi, je vois les meme led que toi ...
30 sept. 2008 à 17:58
C'est ça qui fait de mon composant plus qu'une ellipse avec des bords noirs ...
Sans le reflet de lumière c'est différent ... :'(
Cordialement, Bacterius !
30 sept. 2008 à 14:45
Apres avoir ouvert ton source, tu avais effectivement tout donné dans ton message.
La simplicité a l’état pur !!!
30 sept. 2008 à 14:14
Mon but était d'obtenir un résultat le plus proche possible de son composant SANS son composant, juste les compos de base de delphi.
Reussi ou pas ?
@pascall99 : Euh, si je l'ai même déjà donnée dans mon post au dessus ! Une seule ligne de code.
Voici en plus l'image de la diode et une propriété à modifier :
et tu mets "Transparent=true" sur les 3 TImage.
Les 3 TShape étant des cercles sans bord posés SOUS les TImages transparentes.
Puis pour finir les TShapes sont nommés "ShapeON" "ShapeOFF" et "ShapeDIS".
Ces 3 noms sont le HINT des Colorbox.
Bon ok je fais un zip (l'image est dedans) ...
http://diabloporc.free.fr/delphi/demos/led_sans_compo.zip
30 sept. 2008 à 13:12
JulioDelphi, tu n'aurais pas la source de ce led_sans_compo par hasard ?
a+
30 sept. 2008 à 12:25
DH
30 sept. 2008 à 09:45
Alors moi j'avoue je n'ai pas encore lu le code ni les commentaires mais je propose ça :
Screen : http://diabloporc.free.fr/delphi/demos/led_sans_compo.jpg
Exe : http://diabloporc.free.fr/delphi/demos/led_sans_compo.exe
La même chose que toi mais sans aucun composant externe.
Juste 3 TGroupBox, 3 TShape, 3 TImage, 3 TColorBox, 3 TLabel et une seule ligne de code dans le onchange des colorbox :
(FindComponent((Sender as TColorBox).Hint) as TShape).Brush.Color:= (Sender as TColorBox).Selected;
De plus, on peut mettre toutes les couleurs et pas seulement 9.
Reste à faire 3 procédure si on veut faire des positions on, off, disa...
Des commentaires ? ^^
29 sept. 2008 à 22:52
Cacher le curseur après un délai d'inactivité, et le rétablir après un mouvement !
DH
29 sept. 2008 à 21:46
Ces evenements peuvent être utiles pour une LED ... (quand on pointe la souris dessus on change la LED de couleur ... enfin vous voyez le truc).
Cordialement, Bacterius !
29 sept. 2008 à 20:51
GetLedElementHelp.
J'ai repris ton idée des tableaux constante Cirec, pour écrire directement la définition et le nom.
Voilà ...
Ca ne servira probablement à rien, au fond, mais c'est un entraînement supplémentaire ^^
Cordialement, Bacterius !
29 sept. 2008 à 18:06
(0) Aqua
(1) Pink
(2) Purple
(3) Red
...
C'est sûr que c'est plus pratique, plus besoin d'aller modifier la liste des 3 combos lorsqu'on ajoute une couleur.
Je n'ai pas mis à jour la capture mais je pense que vous avez compris.
Cordialement, Bacterius !
29 sept. 2008 à 00:07
28 sept. 2008 à 22:37
Sinon, il est tard, je mettrai ça demain apres-midi :)
Merci encore Cirec je n'y aurais jamais pensé à Ord.
Cordialement, Bacterius !
28 sept. 2008 à 21:53
TLedColor=(lcAqua, lcPink, lcPurple, lcRed, ...
est de type ordinal, tu peux donc faire : aInt :Ord(lcAqua); // aInt 0 aInt :Ord(lcPurple); // aInt 2
etc. etc.
et sinon regarde ce que tu peux faire avec l'exemple que je t'ai donné:
(vide tes deux ComboBox (OnCombo & OffCombo)et remplace le code du OnCreate par celui-ci)
procedure TMainForm.FormCreate(Sender: TObject);
var I: TLedColor;
begin
for I := Low(TLedColor) to High(TLedColor) do
begin
OnCombo.Items.Add(Format('%d >> %s', [Ord(I), StrLedColor[I]]));
OffCombo.Items.Add(Format('%d >> %s', [Ord(I), StrLedColor[I]]));
end;
DoubleBuffered := True;
OnLedComp := TSwitchLed.Create(Self);
OnLedComp.Left := 6; // Création dynamique du ON
OnLedComp.Top := 14;
OnLedComp.LedState := lsOn;
OnLedComp.Parent := OnBox;
OnCombo.ItemIndex := Ord(OnLedComp.OnColor);
OffLedComp := TSwitchLed.Create(Self);
OffLedComp.Left := 7; // Création dynamique du OFF
OffLedComp.Top := 14;
OffLedComp.LedState := lsOff;
OffLedComp.Parent := OffBox;
OffCombo.ItemIndex := Ord(OnLedComp.OffColor);
end;
voilà plus besoin d'écrire ça en dur ... et c'est tellement plus simple
Les couleurs ne sont plus en Français ... mais là c'est toi qui avait choisi de nommer les ressources en Anglais ^^
28 sept. 2008 à 19:01
On peut maintenant modifier les 3 valeurs (OnColor, OffColor, DisabledColor) des LEDs depuis l'exemple.
Le feu rouge est toujours là :)
Cordialement, Bacterius !
28 sept. 2008 à 18:03
En fait, j'avais besoin d'une de ces fonctions pour une version surchargée de GetBitmap, et j'ai pas pensé à virer l'autre.
Puis après ton message, je me suis rendu compte que la version de GetBitmap avec Index était inutile comparée à celle avec Color.
Donc voilà c'est fait.
J'ai ajouté quelques commentaires en plus ...
Cordialement, Bacterius !
28 sept. 2008 à 15:30
qu'est ce que tu fais ^^
vires moi ces deux procedures "IntToLedColor & LedColorToInt" ... je les ai pas virés pour que tu les remettes à la première occase. Ö
regarde comment j'ai fait dans la procedure "SetLedBmp"
c'est exactement le même principe ;)
28 sept. 2008 à 14:43
Et OffLake tu peux remercier Cirec, qui a fait pas mal d'optimisation (notamment dans le dessin et le stockage des bitmaps LEDs), et te remercier aussi (je n'aurais jamais eu l'idée de faire ce composant sans ta source ^^).
Cordialement, Bacterius !
28 sept. 2008 à 13:03
Place les directement sur ta fiche, car créer 15 composants dynamiquement c'est très pénible et source d'erreurs.
Cordialement, Bacterius !
28 sept. 2008 à 12:45
La prochaine fois nimporte qu'elle LED je vai le créer dynamiquement en suivant te code
merci
Offlake
28 sept. 2008 à 12:09
John Dogget j'ai pensé à toi, je n'ai pas mis le thème WindowsXP dans l'exemple (tu as toujours un écran noir après ...) ^^
"tu as la folie des composants en ce moment ...." oui c'est vrai ... mais je découvre juste, j'ai envie d'approfondir.
Sinon, pour la création des 9 bitmaps à chaque Paint, c'était car j'avais peur que les bitmaps ne soient pas libérés à la destruction du composant, si je les mettait en propriété globale (si jamais on kill une application avec une LED dedans ...), mais je crois que Destroy est appellé de toute façon non ? Même avec un Kill ?
Cordialement, Bacterius !
28 sept. 2008 à 11:30
Surtout pour ceux qui ont des difficultés à installer la JVCL.
Je vais appliquer les idées de Cirec.
Cordialement, Bacterius !
28 sept. 2008 à 09:53
Bon sinon, c'est effectivement très bien de créer ses propres composants pour ses propres besoins.
Mais pour ceux qui comme moi n'ont pas envie de réinventer la roue à chaque fois, les packs e composants sont vraiment très utiles.
La JVCL en particulier est un outils (open-source) extraordinaire qui offre des compos qu'on ne trouve pas ailleurs.
Je comprends très bien qu'il soit preferable de se servir des compos de base Delphi pour poster ici, mais pour d'autres projets il n'y as pas de raisons de s'en priver ...
28 sept. 2008 à 07:50
Comment tirer un trait entre deux TComponents sur un TForm dans l'EDI ?
Si quelqu'un sait...ça m'interresse...
28 sept. 2008 à 01:01
avant que tu fasses une mise à jour je tiens à te dire que la voie utilisée n'est pas la bonne ...
tu recharges continuellement toutes les images pour libérer de suite après (dans la procedure Paint) et il y a pas mal de code inutile.
Je te propose donc une autre version plus efficace dans la gestion des bitmaps et leurs index :
**********************************************************************************
unit SwitchLed;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Graphics, Menus;
type
TLedColor=(lcAqua, lcPink, lcPurple, lcRed, lcYellow, lcGreen,
lcBlue, lcOrange, lcBlack); // Type couleur de la LED
TLedState=(lsOn, lsOff, lsDisabled); // Type état de la LED
TLedBmp = array[TLedState] of TBitmap;
const
StrLedColor : array[TLedColor] of String = ('Aqua', 'Pink', 'Purple', 'Red',
'Yellow', 'Green', 'Blue', 'Orange', 'Black');//
type
TSwitchLed = class(TGraphicControl)
private
{ Déclarations privées }
FOnColor: TLedColor; // Champ objet OnColor
FOffColor: TLedColor; // Champ objet OffColor
FDisabledColor: TLedColor; // Champ objet DisabledColor
FLedState: TLedState; // Champ objet LedState
FAllowChanges: Boolean; // Champ objet AllowChanges
FLedBmp: TLedBmp;
FVersion, FAuthor: String; // Champs objet de la version et de l'auteur
procedure SetOnLedColor(Value: TLedColor); // Procédure définition OnColor
procedure SetOffLedColor(Value: TLedColor); // Procédure définition OffColor
procedure SetDisabledLedColor(Value: TLedColor); // Procédure définition DisabledColor
procedure SetLedState(Value: TLedState); // Procédure définition LedState
procedure SetLedBmp(const Idx: TLedState; Value: TLedColor);
protected
{ Déclarations protégées }
public
{ Déclarations publiques }
constructor Create(AOwner: TComponent); override; // Constucteur hérité
destructor Destroy; override;
procedure Paint; override; // Dessin du composant hérité
property Version: String read FVersion; // Propriétés cachées version et auteur
property Author: String read FAuthor;
published
{ Déclarations publiées }
property OnColor: TLedColor read FOnColor write SetOnLedColor; // Propriété OnColor
property OffColor: TLedColor read FOffColor write SetOffLedColor; // Propriété OffColor
property DisabledColor: TLedColor read FDisabledColor write SetDisabledLedColor; // Propriété DisabledColor
property LedState: TLedState read FLedState write SetLedState; // Propriété LedState
property AllowChanges: Boolean read FAllowChanges write FAllowChanges; // Propriété AllowChanges
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnStartDrag;
property OnDragOver;
property OnEndDrag; // On remet tous les évenements hérités
property OnDragDrop;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock; // Je ne suis pas sûr pour les docks ...
property OnEndDock;
property PopupMenu; // On remet le popupmenu
property ShowHint; // On remet ShowHint
property Visible; // On remet Visible
end;
procedure Register;
implementation
{$R Leds.res}
procedure Register;
begin
RegisterComponents('Bacterius', [TSwitchLed]); // Recensement du composant
end;
constructor TSwitchLed.Create(AOwner: TComponent);
begin
inherited Create(AOwner); // Constructeur hérité
// Parent := TWinControl(AOwner); // Le parent sera un transtypage de AOwner
FOnColor := lcGreen; // Couleur ON par défaut
FOffColor := lcRed; // Couleur OFF par défaut
FDisabledColor := lcBlack; // Couleur DISABLED par défaut
FLedState := lsOff; // Etat de la LED par défaut
FAllowChanges := True; // On autorise la modification des valeurs
FVersion := '1.3'; // On fixe la version
FAuthor := 'Bacterius'; // On fixe l'auteur
Width := 13;
Height := 13; // C'est la taille des bitmaps LEDs
SetLedBmp(lsOn, FOnColor);
SetLedBmp(lsOff, FOffColor);
SetLedBmp(lsDisabled, FDisabledColor);
end;
procedure TSwitchLed.SetOnLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FOnColor then
begin
FOnColor := Value; // On définit
SetLedBmp(lsOn, FOnColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetOffLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FOffColor then
begin
FOffColor := Value; // On définit
SetLedBmp(lsOff, FOffColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetDisabledLedColor(Value: TLedColor);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FDisabledColor then
begin
FDisabledColor := Value; // On définit
SetLedBmp(lsDisabled, FDisabledColor);
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.SetLedBmp(const Idx: TLedState; Value: TLedColor);
begin
if not Assigned(FLedBmp[Idx]) then
begin
FLedBmp[Idx] := TBitmap.Create;
FLedBmp[Idx].TransparentColor := clGreen;
FLedBmp[Idx].Transparent := True; // On fixe la transparence :)
end;
FLedBmp[Idx].LoadFromResourceName(hInstance, StrLedColor[Value]);
end;
procedure TSwitchLed.SetLedState(Value: TLedState);
begin
if not AllowChanges then Exit; // Si on peut modifier
if Value <> FLedState then
begin
FLedState := Value; // On définit
Invalidate; // On redessine le tout
end;
end;
procedure TSwitchLed.Paint;
begin
if Width <> 13 then Width := 13; // On empeche de redimensionner
if Height <> 13 then Height := 13;
// On dessine
Canvas.Draw(0, 0, FLedBmp[LedState]);
end;
destructor TSwitchLed.Destroy;
var I: TLedState;
begin
for I:= Low(TLedState) to High(TLedState) do
FLedBmp[I].Free;
inherited Destroy;
end;
end.
**********************************************************************************
dans l'unité Main il y a aussi des changements
la procedure FormClose est inutile, l'affectation correcte du parent des Leds et la selection des couleurs:
**********************************************************************************
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
OnLedComp := TSwitchLed.Create(Self);
OnLedComp.Left := 6; // Création dynamique du ON
OnLedComp.Top := 14;
OnLedComp.LedState := lsOn;
OnLedComp.Parent := OnBox;
OffLedComp := TSwitchLed.Create(Self);
OffLedComp.Left := 7; // Création dynamique du OFF
OffLedComp.Top := 14;
OffLedComp.LedState := lsOff;
OffLedComp.Parent := OffBox;
end;
procedure TMainForm.ModifyColors(Sender: TObject);
Var
TmpColor: TLedColor;
begin
if Sender is TComboBox then // Si c'est bien un combobox alors ...
begin
if not (TComboBox(Sender).ItemIndex in [0..7]) then Exit;
// Si l'itemindex est incorrect on s'en va
TmpColor := TLedColor(TComboBox(Sender).ItemIndex);
// On définit la couleur selon l'itemindex du combobox sender
case TComboBox(Sender).Tag of
1: OnLedComp.OnColor := TmpColor; // Selon le tag du combobox on modifie le led correspondant
2: OffLedComp.OffColor := TmpColor;
end;
end;
end;
**********************************************************************************
il y a encore d'autres possibilités mais je t'en laisse un peut ^^
27 sept. 2008 à 23:42
Cordialement, Bacterius !
27 sept. 2008 à 22:22
Je ferai ça demain.
Cordialement, Bacterius !
27 sept. 2008 à 22:14
C'est réparé :)
Cordialement, Bacterius !