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

Delphi Discussion :

Défilement doux dans un label


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de jack554
    Inscrit en
    Février 2003
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 192
    Points : 106
    Points
    106
    Par défaut Défilement doux dans un label
    Bonjour,

    Je ne sais pas trop si le titre de ce sujet est clair ... Je sais faire défiler un texte dans un label, caractère par caractère avec un timer ... mais pixel par pixel ? Possible ?

    Merci par avance de vos idées et suggestions.
    Jack.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pixel par Pixel, utilise une TPaintBox\TImage
    Il suffit de dessiner le texte dans un TBitmap, une seule fois, puis via DrawTo tu dessines dans la TPaintBox\TImage en décalant l'offset, si tu veux un texte rotatif, il suffit de faire un deuxième dessin décaler de la largeur du texte + espacement
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier Avatar de jack554
    Inscrit en
    Février 2003
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Merci ShaiLeTroll, malheureusement mon texte est variable, comme par exemple l'heure ...

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Cela ne change pas grand chose !
    Suffit de changer le texte régulièrement

    C'est baclé mais tu peux tout mettre dans le TScroller et en faire un vrai composant

    Code dfm : 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
     
    object BtnScrollingText: TButton
      Left = 16
      Top = 176
      Width = 75
      Height = 25
      Caption = 'Scrolling Text'
      TabOrder = 0
      OnClick = BtnScrollingTextClick
    end
    object PaintBoxScrollingText: TPaintBox
      Left = 112
      Top = 176
      Width = 297
      Height = 105
      OnPaint = PaintBoxScrollingTextPaint
    end
    object TrackBarScrollingText: TTrackBar
      Left = 16
      Top = 287
      Width = 150
      Height = 26
      Max = 1000
      Min = 1
      PageSize = 20
      Frequency = 100
      Position = 1000
      TabOrder = 1
      ThumbLength = 15
      OnChange = TrackBarScrollingTextChange
    end

    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
     
    type
      TScroller = class(TObject)
      private
        FCache: TBitmap;
        FPosition: Integer;
        FMax: Integer;
        FText: string;
        procedure SetText(const Value: string);
        procedure SetPosition(const Value: Integer);
        procedure SetMax(const Value: Integer);
      public
        procedure DrawTo(ACanvas: TCanvas);
        property Text: string read FText write SetText;
        property Position: Integer read FPosition write SetPosition;
        property Max: Integer read FMax write SetMax;
      end;
     
    { TScroller }
     
    procedure TScroller.DrawTo(ACanvas: TCanvas);
    begin
      if not Assigned(FCache) then
      begin
        FCache := TBitmap.Create();
        FCache.Canvas.Font := ACanvas.Font;
        FCache.Width := FCache.Canvas.TextExtent(FText + ' ').Width;
        FCache.Height := FCache.Canvas.TextExtent(FText + ' ').Height;
        FCache.Canvas.TextOut(0, 0, FText + ' ');
      end;
      ACanvas.Draw(Position - System.Math.Max(FCache.Width, FMax), 0, FCache);
      ACanvas.Draw(Position, 0, FCache);
    end;
     
    procedure TScroller.SetMax(const Value: Integer);
    begin
      FMax := Value;
      if Assigned(FCache) and (FPosition > System.Math.Max(FCache.Width, FMax)) then
        FPosition := 0;
    end;
     
    procedure TScroller.SetPosition(const Value: Integer);
    begin
      FPosition := Value;
      if Assigned(FCache) and (FPosition > System.Math.Max(FCache.Width, FMax)) then
        FPosition := 0;
    end;
     
    procedure TScroller.SetText(const Value: string);
    begin
      if FText <> Value then
      begin
        FText := Value;
        FreeAndNil(FCache);
      end;
    end;
     
    var
      Scroller: TScroller = nil;
     
     
    procedure TZooVCLControlExperimentForm.BtnScrollingTextClick(Sender: TObject);
    begin
      if not Assigned(Scroller) then
      begin
        Scroller := TScroller.Create();
        Scroller.Text := FormatDateTime('dddd d mmmm yyyy, hh:nn:ss', Now());
        Scroller.Max := PaintBoxScrollingText.Width;
      end;
     
      PaintBoxScrollingText.Canvas.Font := BtnScrollingText.Font;
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
    end;
     
    procedure TZooVCLControlExperimentForm.PaintBoxScrollingTextPaint(Sender: TObject);
    begin
      if Assigned(Scroller) then
        Scroller.DrawTo(PaintBoxScrollingText.Canvas);
    end;
     
    procedure TZooVCLControlExperimentForm.TimerScrollingTextTimer(Sender: TObject);
    begin
      if Assigned(Scroller) then
      begin
        Scroller.Text := FormatDateTime('dddd d mmmm yyyy, hh:nn:ss', Now());
        Scroller.Position := Scroller.Position + 1;
      end;
     
      PaintBoxScrollingText.Invalidate();
    end;
     
    procedure TZooVCLControlExperimentForm.TrackBarScrollingTextChange(Sender: TObject);
    begin
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
      TimerScrollingText.Interval := TrackBarScrollingText.Position;
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre régulier Avatar de jack554
    Inscrit en
    Février 2003
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Oh là là, désolé ShaiLeTroll, tu vas rire (ou pas !), mais c'est compliqué pour moi, pauvre développeur niveau 1 que je suis
    Je ne sais pas où mettre tout ce code ...
    J'ai juste créé une form1 avec les trois composants BtnScrollingText (le bouton), PaintBoxScrollingText (la TPaintBox) et TrackBarScrollingText (le TrackBar), puis collé le code en dessous dans la partie implementation de Unit1 comme ci-dessous, mais j'ai (évidemment) une erreur sur la propriété Width de FCache ...

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, ComCtrls;
     
    type
      TForm1 = class(TForm)
        TrackBarScrollingText: TTrackBar;
        BtnScrollingText: TButton;
        PaintBoxScrollingText: TPaintBox;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
     
      TScroller = class(TObject)
      private
        FCache: TBitmap;
        FPosition: Integer;
        FMax: Integer;
        FText: string;
        procedure SetText(const Value: string);
        procedure SetPosition(const Value: Integer);
        procedure SetMax(const Value: Integer);
      public
        procedure DrawTo(ACanvas: TCanvas);
        property Text: string read FText write SetText;
        property Position: Integer read FPosition write SetPosition;
        property Max: Integer read FMax write SetMax;
      end;
     
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TScroller.DrawTo(ACanvas: TCanvas);
    begin
      if not Assigned(FCache) then
      begin
        FCache := TBitmap.Create();
        FCache.Canvas.Font := ACanvas.Font;
        FCache.Width := FCache.Canvas.TextExtent(FText + ' ').Width;
        FCache.Height := FCache.Canvas.TextExtent(FText + ' ').Height;
        FCache.Canvas.TextOut(0, 0, FText + ' ');
      end;
      ACanvas.Draw(Position - System.Math.Max(FCache.Width, FMax), 0, FCache);
      ACanvas.Draw(Position, 0, FCache);
    end;
     
    procedure TScroller.SetMax(const Value: Integer);
    begin
      FMax := Value;
      if Assigned(FCache) and (FPosition > System.Math.Max(FCache.Width, FMax)) then
        FPosition := 0;
    end;
     
    procedure TScroller.SetPosition(const Value: Integer);
    begin
      FPosition := Value;
      if Assigned(FCache) and (FPosition > System.Math.Max(FCache.Width, FMax)) then
        FPosition := 0;
    end;
     
    procedure TScroller.SetText(const Value: string);
    begin
      if FText <> Value then
      begin
        FText := Value;
        FreeAndNil(FCache);
      end;
    end;
     
    var
      Scroller: TScroller = nil;
     
    procedure TZooVCLControlExperimentForm.BtnScrollingTextClick(Sender: TObject);
    begin
      if not Assigned(Scroller) then
      begin
        Scroller := TScroller.Create();
        Scroller.Text := FormatDateTime('dddd d mmmm yyyy, hh:nn:ss', Now());
        Scroller.Max := PaintBoxScrollingText.Width;
      end;
     
      PaintBoxScrollingText.Canvas.Font := BtnScrollingText.Font;
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
    end;
     
    procedure TZooVCLControlExperimentForm.PaintBoxScrollingTextPaint(Sender: TObject);
    begin
      if Assigned(Scroller) then
        Scroller.DrawTo(PaintBoxScrollingText.Canvas);
    end;
     
    procedure TZooVCLControlExperimentForm.TimerScrollingTextTimer(Sender: TObject);
    begin
      if Assigned(Scroller) then
      begin
        Scroller.Text := FormatDateTime('dddd d mmmm yyyy, hh:nn:ss', Now());
        Scroller.Position := Scroller.Position + 1;
      end;
     
      PaintBoxScrollingText.Invalidate();
    end;
     
    procedure TZooVCLControlExperimentForm.TrackBarScrollingTextChange(Sender: TObject);
    begin
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
      TimerScrollingText.Interval := TrackBarScrollingText.Position;
      TimerScrollingText.Enabled := not TimerScrollingText.Enabled;
    end;
     
     
    end.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tient j'ai oublié le Timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    object TimerScrollingText: TTimer
      Enabled = False
      OnTimer = TimerScrollingTextTimer
      Left = 52
      Top = 240
    end
    Tu sais que tu peux aussi copier le texte dfm et le coller directement sur la fiche ?

    Après, une erreur, c'est flou, précise un peu !

    Déjà il semble évident que ta fiche s'appelle TForm1 alors qu'il faut renommer TZooVCLControlExperimentForm en TForm1, si cela ne l'est pas pour toi, ne mets pas la charrue avant les bœufs, je te conseille de compulser Guide Pascal et Delphi avant de vouloir aller plus loin
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    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 Heure qui défile dans un Label
    Bonjour,

    Peut-être que le simple bidouillage suivant pourrait faire l'affaire :

    Avec un premier Timer où l'on actualise l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Timer1Timer(Sender: TObject); // Timer1.interval = 1000
    begin
      LabelDefile.Caption:=' Heure :'+TimeToStr(now);
      LabelDefile.upDate;
    end;
    ... et un deuxième Timer où l'on fait défiler l'heure avec un Timer2.interval égal à une fraction de Timer1.interval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Timer2Timer(Sender: TObject);  // Timer2.interval = 200
    const Saut = 1;
    begin
      LabelDefile.Caption := Copy(labelDefile.Caption, Saut + 1, Length(labelDefile.Caption) - Saut)
        + Copy(labelDefile.Caption, 1, Saut);
    end;
    Le problème avec les trucs qui défilent c'est que ça fatigue les yeux.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/04/2012, 04h58
  2. Modifier la taille, la couleur ... dans un label
    Par Guigui_ dans le forum GTK+ avec Python
    Réponses: 3
    Dernier message: 15/07/2004, 17h09
  3. [C#] Affichage resultat de requete dans 2 Labels
    Par kenzo080 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 02/06/2004, 20h07
  4. Faire defiler Texte dans un label
    Par Techsan dans le forum Composants VCL
    Réponses: 5
    Dernier message: 08/06/2003, 23h29
  5. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 17h06

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