1. #1
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut Comment forcer le rafraîchissement d'un composant visuel ?

    Bonjour,

    Titre pas très clair, deux lignes de textes et ça ira mieux :

    Soit un TShellTreeView qui fonctionne très bien et me lance un diaporama s'il trouve des fichiers .bmp dans les nœuds que je clique. Parfait.
    Il accepte également le drag-n-drop depuis l'explorateur de fichiers et lance aussi le diaporama avec les fichiers du dossier passé en drop MAIS là, son image n'est pas rafraîchie, autant dire qu'un carré subitement vide c'est franchement perturbant et moche :
    Nom : stv_vide.png
Affichages : 104
Taille : 19,2 Ko

    J'ai essayé tout ce que je connaissais :
    stv.Repaint, .Refresh, .Update suivi à chaque fois d'un (ou plusieurs) Application.ProcessMessages, j'ai rajouté un .SetFocus à la liste des fichiers, tout ça ne sert à rien...
    J'ai tenté de déplacer la demande de mise à jour dans la procédure FormDropFiles, pas mieux.

    Pour qu'il soit mis à jour, il me faut arrêter le diaporama (bouton Diaporama Off), ce qui est vraiment nul.

    Une idée pour faire effectuer cette mise à jour ?
    Merci,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Cherchez plus, j'ai bidouillé un truc avec un timer (Interval à 10), et j'ai donc remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.stvSelectionChanged(Sender: TObject);
    begin
      SelectedNode := stv.GetPathFromNode(stv.Selected); 
      ShowDirectory(SelectedNode); // pour lister dans la CheckListBox les fichiers du dossier choisi
      ShowDiaporama(stv);
    // le refresh du stv ne se produit qu'en sortant de la proc, si appelé par FormDropFiles
    end;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TMainForm.stvSelectionChanged(Sender: TObject);
    begin
      SelectedNode := stv.GetPathFromNode(stv.Selected); 
      ShowDirectory(SelectedNode); // pour lister dans la CheckListBox les fichiers du dossier choisi
      Timer4Delai.Enabled := True; // pour sortir proprement de la proc (= refresh du stv) puis appeler la boucle du diaporama
    end;
     
    procedure TMainForm.Timer4DelaiTimer(Sender: TObject);
    begin
      Timer4Delai.Enabled := False;
      ShowDiaporama(stv);
    end;
    Qu'est-ce qu'il faut pas faire, hein !
    C'est mais si quelqu'un a une meilleure idée, je veux bien la lire.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 204
    Points : 436
    Points
    436

    Par défaut

    Salut une autre solution peut-être, serai de passer par l’événement OnDropFiles(Sender: TObject; const FileNames: array of String); de la form. De la tu peux remplir ton "svt" et lancer le diaporama.

    [Edit] Oups j'ai mal lu
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  4. #4
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Salut tout le monde,
    Citation Envoyé par Jipété Voir le message
    C'est mais si quelqu'un a une meilleure idée, je veux bien la lire.
    Hier, en cherchant autre chose, je suis tombé sur cette discussion (comme quoi, il n'y a pas que moi à avoir des soucis de refresh du stv...), tout en bas il y a deux hacks, j'ai testé le premier qui n'a rien changé à mon problème, alors j'ai eu la flemme de tester le second, d'autant plus que j'avais peur d'avoir du flicker à l'écran.

    Si quelqu'un veut s'y coller...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    salut

    de mémoire c'est un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ShellTreeView.Refresh(ShellTreeView.TopItem)
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Yep !

    J'ai tenté, avec .TopItem comme avec .Selected, dans la proc FormDropFiles comme dans stvSelectionChanged, dans tous les cas ça ne fonctionne pas.

    Bah, je reste avec mon timer puisque là ça le fait.

    Si ça peut te rassurer, il y a d'autres choses qui ne fonctionnent pas, comme par exemple stv.Selected.MakeVisible;. C'est lassant, c'est comme ça...

    L'aide dit
    method for rendering a node visible
    c'est bien ça qu'il me faut, mais les gens qui codent ont complètement oublié de prendre en compte la présence des scrollbars.

    Flemme de chercher, fait trop chaud (ça revient...)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    salut

    tu as redéfini le item root ?
    c'est quand même curieux ton truc ou alors c'est du cote de l'interface (UI) que cela ne suit pas sous linux

    as tu essayé sur Windows histoire de voir si le problème existe aussi ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par anapurna Voir le message
    tu as redéfini le item root ?
    Si je le redéfinis, le stv n'affiche qu'une arborescence descendante commençant à FileNames[0] (on parle du drag-n-drop, là) et rien au-dessus ni à côté. C'est pas top.

    Pour circuler dans l'arborescence, le mieux c'est stv.Path.

    Citation Envoyé par anapurna Voir le message
    c'est quand même curieux ton truc ou alors c'est du côté de l'interface (UI) que cela ne suit pas sous linux

    as-tu essayé sur Windows histoire de voir si le problème existe aussi ?
    Exactement le même comportement foireux (Laz 1.6rc1), mais c'est pas bien grave puisqu'avec mon timer je m'en sors.

    Ce qui est vraiment plus gênant c'est le MakeVisible qui fait mal son boulot...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    salut

    tu n'aurais pas oublié un inherited dans la méthode "onSelectionChanged" par hasard ?
    j'essai de reproduire ton probleme mais ne sachant pas ce que tu fait dans tes différentes méthode je ne vois pas le problème
    autre chose je suppose que tu parcourt les fichiers pour afficher ta TcheckList avec
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par anapurna Voir le message
    tu n'aurais pas oublié un inherited dans la méthode "onSelectionChanged" par hasard ?
    Phrase pas claire :
    - j'ai oublié de le mettre alors qu'il le faut ? (Me suis contenté de cliquer dans l'inspecteur d'objets pour qu'il me génère la maquette de la proc.), ou
    - je l'ai mis (à tort) et j'ai oublié de le retirer ?
    Bon, dans les deux cas il n'y est pas.

    Citation Envoyé par anapurna Voir le message
    j'essaie de reproduire ton problème mais ne sachant pas ce que tu fais dans tes différentes méthode je ne vois pas le problème
    Rien de particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SelectedNode := stv.GetPathFromNode(stv.Selected); // SelectedNode c'est une string
      ShowDirectory(SelectedNode, clbFiles); // clbFiles c'est la CheckLitBox
      //stv.Selected.MakeVisible; // marche pas...
      clbFiles.CheckAll(cbChecked,False,False);
      Timer4Delai.Enabled:=True; // ok pour lancer le diaporama car dessous, empêche le rafraîchissement
    //  ShowDiaporama(stv);
    Citation Envoyé par anapurna Voir le message
    autre chose je suppose que tu parcourt les fichiers pour afficher ta TcheckList avec
    Je parcours les fichiers dans ShowDirectory(SelectedNode, clbFiles);. Quel rapport ?

    Citation Envoyé par anapurna Voir le message
    j'essaie de reproduire ton problème
    c'est gentil mais, à moins que tu aies du temps à perdre, encore une fois ne perds pas ton temps avec ça, ma solution à base de timer fonctionne tip-top.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    Salut

    Voici mon projet test, dis-moi si ton problème se reproduit.

    Test 1.zip

    Si c'est le cas dis-moi ce que je n'ai pas vu.
    Par contre, si ce n'est pas le cas c'est donc autre chose qui fout le bordel, c'est peut être là qu'il faut chercher.
    J'aime pas les timers, c'est un truc à ne pas comprendre pourquoi les événements se mélangent. Je préfère cent fois soit utiliser des messages, soit utiliser des callbacks.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par anapurna Voir le message
    j'aime pas les timer c'est un truc à ne pas comprendre pourquoi les événements se mélangent
    Chez moi il n'y a rien qui se mélange : le timer est tout le temps off et n'est activé que le temps que la proc se termine pour avoir la mise à jour du stv.

    Bon, enfin, concernant ton projet, j'ai bien dit que ça se passait lors d'un drag-n-drop, j'ai donc rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.StvSelectionChanged(Sender: TObject);
    begin
      Inherited;
      SelectedNode := stv.GetPathFromNode(stv.Selected);
      ShowDirectory(SelectedNode); // pour lister dans la CheckListBox les fichiers du dossier choisi
      ShowDiaporama(stv); // ligne rajoutée
    end;
     
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String); // proc rajoutée
    begin
      stv.Path:=Filenames[0];
    end;
    et pour ressembler à la vraie vie,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TForm1.ShowDiaporama(aStv : TShellTreeView);
    begin
      While True do begin
        Sleep(300);
        Application.ProcessMessages;
      end;
    end;
    et donc, il me suffit de droper un dossier pour reproduire le phénomène : stv pas mis à jour.

    Si je rajoute un timer enabled = False et interval = 10 et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.StvSelectionChanged(Sender: TObject);
    begin
      Inherited;
      SelectedNode := stv.GetPathFromNode(stv.Selected);
      ShowDirectory(SelectedNode); // pour lister dans la CheckListBox les fichiers du dossier choisi
      //ShowDiaporama(stv);
      timer1.Enabled:=True; //nouvelle manière de faire
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      timer1.Enabled:=False;
      ShowDiaporama(stv);
    end;
    ça fonctionne.

    Si tu veux tester tout ça, n'oublie pas le AllowDropFiles de la Form.

    Tu feras attention car malgré le Application.ProcessMessages, impossible d'arrêter le prog en cliquant sur la croix de fermeture : faut faire Ctrl-F2, incroyable !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    Salut

    J'ai testé... c'est bien ta boucle infinie qui fout la merde dans le showDiaporama.

    Il te suffit de déclarer un boolean.
    Si tu reprends mon exemple et que tu replaces les éléments, tu vas voir que ça marche tout de suite mieux.

    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
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     loopStopped := False;
    end; 
     
    Procedure TForm1.ShowDiaporama(aStv : TShellTreeView);
    begin
      While not(loopStopped)do
      begin
        Sleep(300);
        Application.ProcessMessages;
      end;
    end; 
     
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String
      );
    begin
      LoopStopped := True;
      if trim(Filenames[0]) <> '' Then
       stv.Path:=Filenames[0];
     LoopStopped := false;
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #14
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par anapurna Voir le message
    j'ai testé ... c'est bien ta boucle infinie qui fout la merde dans le showDiaporama
    Le problème d'un diaporama, c'est que justement il tourne dans une boucle infinie, sinon c'est plus un diaporama.

    Alors pour essayer d'en avoir le cœur net et pour faire au plus simple, je me suis dit que j'allais utiliser ta fonction de listage des fichiers, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      RechercherFichiers('/1folder4test_imgs'); // oui, c'est le nom de mon dossier
    end;
    et rien que ça, juste cliquer sur ce bouton, ça ne fonctionne pas : il n'y a rien de listé dans la CheckListBox !
    Je suis sûr du nom du dossier, je suis sûr qu'il contient des images...

    T'aurais pas une fonction qui fonctionne, pour simuler le diaporama ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Bon, on reprend :

    j'ai trouvé pourquoi la fonction de listage de fichiers ne fonctionnait pas : ton code n'est pas multi-plateforme
    J'ai remplacé ta fonction slach par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function AddSlash(s: string): string;
    var
      t: string;
    begin
    {$IFDEF WINDOWS} t := '\'; {$ELSE} t := '/'; {$ENDIF}
      s := trim(s);
      if RightStr(s,1) <> t then result := s+t else result := s;
    end;
    et ça va tout de suite mieux, concernant le listage des fichiers, qui me sert de témoin de fonctionnement pour le système de diaporama :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Procedure TForm1.ShowDiaporama(APath: String);
    begin
      While not loopStopped do begin
        Sleep(700);
        RechercherFichiers(APath);
        Application.ProcessMessages;
      end;
    end;
    Je peux activer le diaporama avec un bête bouton ou avec FormDropFiles sans problèmes à condition d'utiliser ma combine du timer...

    Ensuite, si je veux tester l'appel depuis stvSelectionChanged, c'est la prise de tête :
    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.StvSelectionChanged(Sender: TObject);
    begin
    ////  Inherited;
      SelectedNode := AddSlash(stv.GetPathFromNode(stv.Selected));
      //showmessage(selectednode); // ok, vu, avec "/"
      ShowDiaporama(SelectedNode);
    //  timer1.Enabled:=True;
    end;
     
    Procedure TForm1.ShowDiaporama(APath: String);
    begin
      showmessage(APath); // ok, vu, avec "/"
      While not loopStopped do begin 
      // il faut enlever le 'not' pour que la boucle s'exécute depuis stvSelectionChanged -- truc de ouf !
        Sleep(700);
        RechercherFichiers(APath);
        Application.ProcessMessages;
      end;
    end;
    Sinon, en virant l'appel dans SelectionChanged et en faisant ça, c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
    begin
      Form1.BringToFront;
      LoopStopped := True;
      stv.Path:=Filenames[0];
      LoopStopped := false;
    //  RechercherFichiers(SelectedNode);// ok, vu, avec "/"
    //  RechercherFichiers(AddSlash(stv.Path)); // ok, vu, avec "/"
      ShowDiaporama(AddSlash(stv.Path)); // ok, vu, avec "/"
    end;
    Donc en résumé il y a là un comportement incompréhensible et totalement irrationnel.

    En inversant ta logique (le diaporama tourne en boucle, donc ton LoopStopped devient chez moi un LoopRunning), j'arrive à un fonctionnement correct mais toujours sans rafraichissement du stv...
    Ton inherited ne change rien au problème.

    Pour moi (comportement lié à l'O.S. ?), la bonne manière d'avoir la m-à-j du stv c'est par le timer, point barre.

    Dit autrement, le rafraîchissement du stv intervient à la fin de la proc stvSelectionChanged et donc, si on part ailleurs (ShowDiaporama) avant le end; de fin de proc, pas de rafraîchissement tant que le diaporama tourne.
    En activant le timer juste avant le end;, à charge pour le timer d'activer ensuite le diaporama, le rafraîchissement se fait bien.
    Valà.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Salut,

    Citation Envoyé par Jipété Voir le message
    Ce qui est vraiment plus gênant c'est le MakeVisible qui fait mal son boulot...
    J'avais la solution dans un autre projet ! Dans la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    stvSelectionChanged(Sender: TObject);
    begin
      //stv.Selected.MakeVisible; // fonctionne pas...
      //stv.Selected.Expand(False); stv.Selected.Collapse(False); idem... :-(
      // peut-être avec ?
      stv.TopItem := stv.Selected; // Yes !
    end;
    Si ça peut servir à d'autres...

    Bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Comment crée-t-on simplement un composant visuel composite ?
    Par Didjeko dans le forum Lazarus
    Réponses: 3
    Dernier message: 25/05/2012, 16h11
  2. Comment forcer le rafraîchissement d'une image
    Par sassou2 dans le forum JSF
    Réponses: 8
    Dernier message: 06/09/2011, 14h54
  3. Comment créer un nouveau composant visuel ?
    Par souadmaa dans le forum Débutant
    Réponses: 1
    Dernier message: 22/10/2007, 12h57
  4. Réponses: 2
    Dernier message: 07/03/2007, 09h44
  5. [VS2005/C#] Comment créer un composant visuel .NET ?
    Par TeC_MaN dans le forum Visual Studio
    Réponses: 1
    Dernier message: 31/07/2006, 13h13

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