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

  1. #1
    Membre éprouvé
    Scrol Text avec un TStatusBar Windows 10 64Bits et D6
    Bonsoir à toutes et à tous,

    J'essaye de coder un Scrolling du texte de mon TStatusBar avec un code connu mais sans succès.

    ! Je n'utilise pas la propriété "Simpletext" du TStatusBar.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    chaine := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');
    chaine := copy(chaine, 2, length(chaine)-1) + copy(chaine, 1, 1);
    statusbar.panels[0].text := chaine;
    end;


    Ce n'est peut-être pas possible on ne sait jamais.

    @+,

    cincap

  2. #2
    Membre émérite
    Bonsoir,

    En FMX, c'est très simple : placez le TLabel dans le TStatusBar et placez un TFloatAnimation en tant qu'enfant du TLabel. Cette animation sera à associer à la propriété "positon.x" du TLabel.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par gbegreg Voir le message

    En FMX, c'est très simple
    sauf que cincap indique qu'il utilise D6 (oui même pas D7)

    @cincap il ne manquerait pas un redessin dans la procedure ?
    un statusbar.invalidate (existe t-il en D6 ?), un statusbar.repaint ou quelque chose de similaire ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Futur Membre du Club
    la valeur de chaine est définie à l'intérieur de la fonction Timer (ligne 4)
    donc à chaque fois on refait la même chose
    cela ne devrait-il pas être fait en dehors ? (pas testé)

  5. #5
    Expert éminent sénior
    Pourquoi PChar ?!

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Str: string;
    begin
      Str := statusbar.Panels[0].Text;
      if Length(Str) > 1 then
        statusbar.panels[0].text := Copy(Str, 2, Length(Str) - 1) + Str[1];
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre éprouvé
    Bonjour à toutes et à tous,

    Merci à tous pour vos remarques mais entre temps, j'ai testé la solution du membre gebegreg qui fonctionne (couleur de fond, couleur du texte et scroll) sauf un petit problème de width du Tlabel sur le TStatusBar.

    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
     
    label1.Caption := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');
     
     label1.Parent := StatusBar ;
     
    // on redimensione le ProgressBar à la taille du panel
         label1.Width := StatusBar.Panels.Items[0].Width + 4;
     
    // puis on le place correctement
         label1.Left := StatusBar.Panels.Items[0].Width;
         label1.Top := 3;
     
    // on le rend visible
         label1.Visible := true;
    end;


    Sinon au départ, j'utilisais la procédure pour modifier la couleur du fond et du texte du TStatusBar et je voulais ajouter un Scroll :

    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
     
    procedure TForm1.StatusBarDrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
    chaine := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');
     
    with StatusBar.Canvas do
      begin
        Brush.Color := clblack;
        FillRect(Rect);
        Font.Color := claqua;
        Font.Size := 10;
        //ImageList1.Draw(StatusBar.Canvas,Rect.Left,Rect.Top,Panel.Index);
        TextOut(Rect.left + 30, Rect.top , chaine); //+ IntToStr(Panel.Index));
     end;


    D'où l'origine du topic.

    @ Paul TOTH merci aussi de ta suggestion, j'ai testé et le texte reste figé.

    @+,

    cincap

  7. #7
    Membre émérite
    Bonjour Cincap,

    sinon ta fonction donne un bon résultat si tu mets

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    chaine := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');


    dans le On Create de la Form.

    Sinon tu la redéfinis à chaque fois dans le Timer.

    (et comme dit Paul le PChar est inutile car Copy attend un String comme 1er argument)

    A+
    Charly

    [Edit] je n'avais pas vu ta réponse précédente !
    [ReEdit] Le code de Paul Toth fonctionne parfaitement

  8. #8
    Modérateur

    et le texte reste figé.
    Il suffit de modifier la chaîne à chaque OnTimer et d'affecter sa nouvelle version pour affichage
    Delphi 5 Pro - Delphi 10.3.2 Rio 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 !

  9. #9
    Membre éprouvé
    @ Charly910, Hello et merci de ta suggestion, bien vu :


    sinon ta fonction donne un bon résultat si tu mets

    Code :
    Sélectionner tout - Visualiser dans une fenêtre à part
    chaine := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');
    dans le On Create de la Form.

    Ceci fonctionne bien (fond de couleur, Size et couleur du texte) sans un Tlabel, sauf la largeur du texte qui défile que je vérifie :

    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
     
    procedure TForm1.StatusBarDrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
     
    with StatusBar.Canvas do
      begin
        Brush.Color := clblack;
        FillRect(Rect);
        Font.Color := claqua;
        Font.Size := 10;
        //ImageList1.Draw(StatusBar.Canvas,Rect.Left,Rect.Top,Panel.Index);
        TextOut(Rect.left + 30, Rect.top , chaine); //+ IntToStr(Panel.Index));
     end;
     end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    chaine := pchar('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes');
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    chaine := copy(chaine, 2, length(chaine)-1) + copy(chaine, 1, 1);
    statusbar.panels[0].text := chaine;
    end;


    Sinon ce topic peut être fermé pour ne pas vous faire perdre du temps inutilement.

    Merci à tous j'ai encore appris un +

    @+,

    cincap

  10. #10
    Membre éprouvé
    @ tous,

    Malgré cette modification je n'arrive pas à faire démarrer le texte depuis la droite vers la gauche il reste un espace entre le bord droit de la fiche avant le défilement du texte.

    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
     
    procedure TForm1.StatusBarDrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
     
    var zone_client: tRect;  txt : string;
      begin
     txt:= StatusBar.Panels[0].text ;
     
     with StatusBar.Canvas do
      begin
     
        Brush.Color := clblack;
       // FillRect(Rect);
        Font.Color := claqua;
        Font.Size := 12;   //Height StatusBar = 26
        //ImageList1.Draw(StatusBar.Canvas,Rect.Left,Rect.Top,Panel.Index);
     
        zone_client.Top := StatusBar.ClientRect.Top + 3; //
        zone_client.Bottom := StatusBar.ClientRect.Bottom - 1;
        zone_client.Left := StatusBar.ClientRect.Left + 1;
        zone_client.Right := StatusBar.ClientRect.Right -1;
     
        FillRect(zone_client);
        zone_client := StatusBar.ClientRect ;
     
        TextRect(zone_client, 2,2, txt);
     end;
     end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    chaine := ('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes  ');
    end;


    Gilbert Geyer avait eu le même problème entres autres :

    https://www.developpez.net/forums/d1...texte-tronque/

    Si quelqu'un avait une idée merci d'avance.

    @+,

    cincap

  11. #11
    Membre émérite
    Avec ton code je ne vois rien d'anormal ?

    Le texte est cadré à gauche dans le StatusPanel, est affiché en entier et se déroule normalement de la droite vers la gauche.

    (j'ai ajouté quelques espaces à la fin pour séparer fin et début lors du défilement)

    A+
    Charly

    [Edit] tu voudrais que ton texte soit dupliqué plusieurs fois pour occuper toute la largeur de la fenêtre ?

  12. #12
    Membre éprouvé
    @ Charly910, merci de ta réponse voici un print du problème tu comprendras mieux.

    En effet ton raisonnement est correct mais c'est de cet espace qui pose le problème.

    @+,

    cincap

  13. #13
    Membre émérite
    Citation Envoyé par SergioMaster Voir le message

    sauf que cincap indique qu'il utilise D6 (oui même pas D7)
    Arf, je n'avais pas lu l'objet jusqu'au bout
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #14
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ gebegreg


    Arf, je n'avais pas lu l'objet jusqu'au bout
    Pas de problème tu m'as rappelé que je l'avais déjà fait dans le temps pour ajouter un TProgessBar dans le TStatusBar.

    J'avais d'ailleurs loupé l'intervention du sieur tourlourou que je remercie.

    Maintenant dans les deux cas, le texte démarre à une certaine distance du bord droit de la fiche comme sur mon print screen.

    Je continue à chercher.

    @+,

    cincap

  15. #15
    Rédacteur/Modérateur

    Bonjour,
    ceci
    Citation Envoyé par cincap Voir le message
    Je n'utilise pas la propriété "Simpletext" du TStatusBar.
    Explique peut-être cela
    Citation Envoyé par cincap
    Maintenant dans les deux cas, le texte démarre à une certaine distance du bord droit
    soit tu as deux panels et non un seul ta "distance du bord droit" est en fait le deuxième panel, soit c'est juste un problème de largeur de ton panel
    un simple StatusBar1.Panels[0].width:=width-20; (20 à la louche pour la poignée) à traiter également en cas de resize de la forme
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  16. #16
    Membre éprouvé
    @ SergioMaster, merci de ta réponse :


    soit tu as deux panels et non un seul ta "distance du bord droit" est en fait le deuxième panel, soit c'est juste un problème de largeur de ton panel
    J'ai encore vérifié et c'est bien l'index "0" donc un seul panel à moins que le composant est déjà considéré comme un panel.

    J'avais choisis la méthode de l'ajout d'un panel pour modifier la couleur du fond et du texte ainsi que le choix de la fonte car je n'y étais pas arrivé avec le TStatusBar seul.

    Dans la propriété width j'ai mis "0" et le même problème !

    Normalement ce code indique que mon Tlabel aura la même largeur que mon panel, ce qui est le cas donc soit c'est la largeur du texte soit une inconnue !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    label1.Width := StatusBar.Panels.Items[0].Width ;


    Je continue à faire des tests naturellement.

    @+,

    cincap

  17. #17
    Expert éminent sénior
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  18. #18
    Membre éprouvé
    @ Paul TOTH, merci de ta réponse, je rectifie et je m'excuse car ta suggestion fonctionne, j'ai utilisé la propriété du panel "0" pour ce faire.

    Dans mon test j'avais laissé la variable "string chaine" avec le message d'où ma réponse trop rapide que le message restait figé.

    Mais il y a toujours le décalage du bord droit peut être rajouté un "Textout" propre au panel ?

    Je suis un peu perdu.

    @+,

    cincap

  19. #19
    Membre émérite
    Solution peu élégante, mais qui fonctionne chez moi : le texte occupe toute la largeur de la fenêtre même en wsMaximized :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    chaine := 'Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes   ';
    Chaine := Chaine + Chaine ;
    Chaine := Chaine + Chaine ;
    Chaine := Chaine + Chaine ;
     
    statusbar.Panels[0].Text  := Chaine ;
     
    end;


    C'est peut être parce que ta chaine n'est pas assez longue ?

    A+
    Charly

  20. #20
    Membre éprouvé
    Bonjour,

    oui c'est la longueur de la chaine qui pose problème.

    Autre solution:
    ajouter des espaces à la fin de la chaine.
    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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      aRect: TRect;
      slen,
      blen,
      vLen: Integer;
    begin
      chaine := ('Déclarez votre flamme amoureuse en vous inspirant de 6 poèmes  ');
      with StatusBar1.Canvas do
      begin
        aRect := Rect(0,0,1,1);
        Brush.Color := clblack;
        Font.Color := claqua;
        Font.Size := 12;   //Height StatusBar = 26
        DrawText(StatusBar1.Canvas.Handle, ' ', -1, aRect, DT_VCENTER or DT_CALCRECT);
        blen := aRect.Right;
        aRect := Rect(0,0,1,1);
        DrawText(StatusBar1.Canvas.Handle, PChar(Chaine), -1, aRect, DT_VCENTER or DT_CALCRECT);
        slen := aRect.Right;
        vlen := StatusBar1.panels[0].Width - slen;
        if vlen >= blen then
          Chaine := Chaine + DupeString(' ', vlen div blen + 1);
        StatusBar1.panels[0].Text := Chaine;
      end;
    end;


    Cordialement,

    @+

###raw>template_hook.ano_emploi###