Bonsoir à tous
J'utilise la version RC2, mais la fréquence de clignotement de BGRALED ne change pas quel que soit le nombre attribué à BlinkInterval.
Une idée ?
Merci pour votre aide.
Bonsoir à tous
J'utilise la version RC2, mais la fréquence de clignotement de BGRALED ne change pas quel que soit le nombre attribué à BlinkInterval.
Une idée ?
Merci pour votre aide.
Bonjour,
RC2 correspond à une ancienne version de Lazarus (qu'il est conseillé de ne plus utiliser puisqu'elle a été largement corrigée par la version stable 1.6) alors que BGRALed correspond à un composant de BGRAControls dont il faut aussi fournir la version (la toute dernière est la 4.2) pour obtenir une éventuelle aide. Le composant en question ne figure plus sur la palette des BGRAControls : il doit y avoir une raison...
Cordialement,
GIlles
Re-Bonjour,
Je suis allé voir dans le code de BGRALed (conservé avec une version de Sparta). En fait, BlinkInterval n'est utilisé qu'au moment de la création de la Led. Les changements suivants ne sont tout simplement pas pris en compte : le faire aurait conduit à des réactions étranges, car le temps de dessiner aurait pu alors être supérieur à celui décompté par le timer . Bref, ce n'était pas un composant au point...
Bonsoir
Merci pour ton éclaircissement Gilles.
De toutes façon je continuerai à utiliser le BGRALED du paquet bgracontrols 3.6 malgré sa haute fréquence (300 ms) puisque je n'ai pas
d'autres choix
Rebonjour
J'ai réussi à diminuer la fréquence en augmentant la valeur de FBlinkInterval de 300 ms à 2000 ms dans l'unité BGRALED.
malheureusement toutes les BGRALEDs ont assignés cette valeur donc il manque un code qui permis de configurer toute LED à part.
si quelqu'un saura écrire ce code?
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 constructor TBGRALED.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csReplicatable, csCaptureMouse, csClickEvents, csDoubleClicks]; Bitmap:=TBGRABitmap.Create(0,0); with GetControlClassDefaultSize do SetInitialBounds(0, 0, CX, CY); FChanging:=False; FActive:=true; FOn:=true; OnStatus:=FOn; FReflection:=true; FColor:=clRed; FBackgroung:=clMaroon; FLedType:=ledRound; FBlinking:=False; FBlinkInterval:=2000; BlinkTimer:=TTimer.Create(Nil); BlinkTimer.Enabled:=False; BlinkTimer.Interval:=FBlinkInterval; BlinkTimer.OnTimer:=@BlinkTimerTimer; end;
ajouter un constructeur paramétré qui ajusterait BlinkInterval lors de ce Create ?
Bonjour,
C'est ce que j'avais vu en examinant le code. fBlinkInterval n'est alors plus utilisée qu'avec le timer, sans possibilité de changer sa valeur.
Comme l'a écrit tourlourou, si chaque led doit avoir une valeur de clignotement spécifique, il suffit de créer un autre constructeur déclaré avec la directive overload. Un truc du genre :
Chaque Led aura bien sa valeur spécifique de clignotement, mais elle ne pourra toujours pas être modifiée.
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 constructor TBGRALED.Create(AOwner: TComponent; ABlinkInterval: QWord); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csReplicatable, csCaptureMouse, csClickEvents, csDoubleClicks]; Bitmap:=TBGRABitmap.Create(0,0); with GetControlClassDefaultSize do SetInitialBounds(0, 0, CX, CY); FChanging:=False; FActive:=true; FOn:=true; OnStatus:=FOn; FReflection:=true; FColor:=clRed; FBackgroung:=clMaroon; FLedType:=ledRound; FBlinking:=False; FBlinkInterval:= ABlinkInterval; // ligne changée BlinkTimer:=TTimer.Create(Nil); BlinkTimer.Enabled:=False; BlinkTimer.Interval:=FBlinkInterval; BlinkTimer.OnTimer:=@BlinkTimerTimer; end
La modification demande des efforts plus importants : il ne faut pas que le timer soit plus rapide que le temps de dessiner la led ou que le programme soit ralenti par un dessin répété et intensif de cette même led ! Il est par conséquent nécessaire de créer les leds dans des threads séparés...
Cependant, tu peux tenter un code comme ce qui suit, à condition que l'utilisateur final ne puisse pas modifier la valeur du clignotement :
Puis de définir simplement cette méthode par quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 TBGRALED = class(TGraphicControl) [...] protected procedure SetBlinking(AValue: Boolean); virtual; procedure SetBlinkInterval(AValue: QWord); virtual; // ajout
Cordialement,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TBGRALED.SetBlinkInterval (AValue: QWord); begin if FBlinkInterval = AValue then exit; FBlinkInterval := AValue;[/TD] end;
Gilles
Bonjour
@Gilles
merci pour l'aide qui a résolu mon problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part FBlinkInterval: QWord;
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure SetBlinkInterval(AValue: QWord); virtual;
Code : Sélectionner tout - Visualiser dans une fenêtre à part property BlinkInterval: QWord read FBlinkInterval write SetBlinkInterval;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TBGRALED.SetBlinkInterval(AValue: QWord); begin if FBlinkInterval = AValue then exit; FBlinkInterval := AValue; BlinkTimer.Enabled:=False; BlinkTimer.Interval:=FBlinkInterval; BlinkTimer.Enabled:=True; end;
D'accord : c'est en gros le code que j'ai proposé. Cependant, il y a une partie qui n'a rien à voir avec la vitesse du clignotement et qui est déjà traitée par la propriété Blinking :
Mais as-tu explicitement affecté une nouvelle valeur à la propriété BlinkInterval dans ton code ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TBGRALED.SetBlinkInterval(AValue: QWord); begin if FBlinkInterval = AValue then exit; FBlinkInterval := AValue; // BlinkTimer.Enabled:=False; // a priori c'est inutile // BlinkTimer.Interval:=FBlinkInterval; // BlinkTimer.Enabled:=True; // DrawLED; end;
Par exemple, sur un clic de bouton :
Encore mieux, en liant cette valeur à un TSpinEdit ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part BlinkInterval := 800;
Bonjour
Effectivement le code suivant fonctionne
Cependant le code précédent a fonctionné ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.Button1Click(Sender: TObject); begin BGRALED1.BlinkInterval:=SpinEdit1.Value*200 ; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TBGRALED.SetBlinkInterval(AValue: QWord); begin if FBlinkInterval = AValue then exit; FBlinkInterval := AValue; BlinkTimer.Enabled:=False; BlinkTimer.Interval:=FBlinkInterval; BlinkTimer.Enabled:=True; end;
Tant mieux .
Le second code fonctionnera, mais il est en grande partie inutile dans le cas où il s'agit simplement de faire varier la vitesse de clignotement.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager