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

Lazarus Pascal Discussion :

Actualisation d'une FileListBox [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Que donne une boucle FindFirst/FindNext sur les fichiers du répertoire ?
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

  2. #22
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut, Y. !
    Citation Envoyé par tourlourou Voir le message
    Que donne une boucle FindFirst/FindNext sur les fichiers du répertoire ?
    Oh lala, tu vas nous l'embrouiller, là,

    Et sinon, en regardant attentivement le message d'erreur, on constate que le nom de fichier est vide :
    Nom : nom_fichier_vide.png
Affichages : 153
Taille : 26,4 Ko

    Pourquoi ? That's the good question,
    D'où mon idée, d'ailleurs, de rajouter un TEdit pour faire un suivi visuel du nom du fichier sélectionné dans le FLB.
    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. #23
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut
    bon ton exemple marche très bien, j'ai pu reproduire le bug. C'est très aléatoires et le j'ai eu le même genre de message que toi

    par exemple j'ouvre le dossier :

    Nom : 2018-06-12_145406.jpg
Affichages : 146
Taille : 2,7 Ko
    qui est en fait le dossier :
    Nom : 2018-06-12_150333.jpg
Affichages : 153
Taille : 4,7 Ko

    j'ouvre un autre dossier

    Nom : 2018-06-12_145955.jpg
Affichages : 150
Taille : 15,9 Ko

    c'est assez déconcertant comme bug

    J'ai donc cherché ce message "unable to open file" il est présent dans :

    LazUTF8Classes :

    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
    constructor TFileStreamUTF8.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
    var
      lHandle: THandle;
    begin
      FFileName:=AFileName;
      if (Mode and fmCreate) > 0 then
        lHandle:=FileCreateUTF8(AFileName,Mode,Rights)
      else
        lHandle:=FileOpenUTF8(AFileName,Mode);
     
      if (THandle(lHandle)=feInvalidHandle) then
      begin
        if Mode=fmcreate then
          raise EFCreateError.createfmt({SFCreateError}'Unable to create file "%s"',[AFileName])
        else
          raise EFOpenError.Createfmt({SFOpenError}'Unable to open file "%s"',[AFilename]);
      end
      else
        THandleStream(Self).Create(lHandle);
    end;
    Qui nous renvoi sur FileOpenUTF8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function FileOpenUtf8(Const FileName : string; Mode : Integer) : THandle;
     
    begin
      Result := CreateFileW(PWideChar(UTF8Decode(FileName)), dword(AccessModes[Mode and 3]),
                             dword(ShareModes[(Mode and $F0) shr 4]), nil, OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL, 0);
      //if fail api return feInvalidHandle (INVALIDE_HANDLE=feInvalidHandle=-1)
    end;
    Je parie qu'il y a une erreur avec la fonction UTF8Decode

    En effet (je n'ai pas le temps d'aller voir sous Linux") mais Naute, Jipete et Jurrasik sont tous les trois sous cet environnement et il ne semble pas y avoir de bug
    L'idée de Toulourou est bonne cela permettrai d'être certain que cela vient de là.

    Juste pour tester j'ai supprimer UTF8Decode
    Après recomplitation voila le résultat quand je clique sur le fichier dans la FileListBox

    Nom : 2018-06-12_151747.jpg
Affichages : 191
Taille : 29,4 Ko

    Bref après tout ce bazard, une petite lumière c'est allumée dans ma tête, nous avions déja rencontré ce genre de problème (avec Naute si je me souviens bien et un comboxbox)

    Solution n'utilises pas l'évènement OnChange de la FileListBox, mais utilises OnSelectionChange
    PS : J'ai bien sur remis FileOpenUTF8 dans sont état d'origine

    Je n'ai pas réussi à avoir ce comportement farfelu après ce changement

    A+
    • "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

    Mes projets sur Github - Blog - Site DVP

  4. #24
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Solution n'utilises pas l'évènement OnChange de la FileListBox, mais utilises OnSelectionChange
    Je voulais le proposer en début d'aprème mais je n'ai pas eu le temps.

    Version définitive parfaitement fonctionnelle sous Linux, et plus besoin de proc commune :

    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
        // ... autres procs au-dessus
        procedure FileListBox1SelectionChange(Sender: TObject; User: boolean);
    //    procedure FileListBox1Change(Sender: TObject);
      private
        { private declarations }
        pos: integer;
      public
        { public declarations }
      end;
     
    var
      Visio: TVisio;
     
    implementation
     
    {$R *.lfm}
     
    { TVisio }
     
    {procedure TVisio.FileListBox1Change(Sender: TObject);
    begin
      // réagit au clic de la souris mais PAS au changement d'ItemIndex des boutons
    end;  }
     
    procedure TVisio.DirectoryEdit1Change(Sender: TObject);
    begin
      FileListBox1.Directory:=DirectoryEdit1.Directory;
      EditFileCount.Text := inttostr(FileListBox1.Count);
    end;
     
    procedure TVisio.FileListBox1SelectionChange(Sender: TObject; User: boolean);
    begin // fonctionne avec les boutons, au clic dans la liste et avec les flèches haut-bas du clavier quand la liste a le focus
      pos:=filelistbox1.ItemIndex;
      Image1.Picture.LoadFromFile(FileListBox1.Directory
                                  + DirectorySeparator // multi-plateforme : plus cool
                                  + FileListBox1.Items[pos]);
      EditFileName.Text:=FileListBox1.Directory
                         + DirectorySeparator
                         + FileListBox1.GetSelectedText;
    end;
     
    procedure TVisio.BitBtn1Click(Sender: TObject);// précédent
    begin
      dec(pos);
      if pos<0 then pos:=FileListBox1.Count-1;
      FileListBox1.ItemIndex:=pos;
    end;
     
    procedure TVisio.Button1Click(Sender: TObject);// suivant
    begin
      inc(pos);
      if pos>FileListBox1.Count-1 then pos:=0;
      FileListBox1.ItemIndex:=pos;
    end;
    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. #25
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 924
    Points
    2 924
    Par défaut
    Bonjour .

    Citation Envoyé par BeanzMaster Voir le message
    Solution n'utilises pas l'évènement OnChange de la FileListBox, mais utilises OnSelectionChange
    Bien vu!

    Amicalement,
    naute.

  6. #26
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Août 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité
    Secteur : Service public

    Informations forums :
    Inscription : Août 2017
    Messages : 30
    Points : 17
    Points
    17
    Par défaut rafraichissement
    Citation Envoyé par Jipété Voir le message
    Je voulais le proposer en début d'aprème mais je n'ai pas eu le temps.

    Version définitive parfaitement fonctionnelle sous Linux, et plus besoin de proc commune :

    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
        // ... autres procs au-dessus
        procedure FileListBox1SelectionChange(Sender: TObject; User: boolean);
    //    procedure FileListBox1Change(Sender: TObject);
      private
        { private declarations }
        pos: integer;
      public
        { public declarations }
      end;
     
    var
      Visio: TVisio;
     
    implementation
     
    {$R *.lfm}
     
    { TVisio }
     
    {procedure TVisio.FileListBox1Change(Sender: TObject);
    begin
      // réagit au clic de la souris mais PAS au changement d'ItemIndex des boutons
    end;  }
     
    procedure TVisio.DirectoryEdit1Change(Sender: TObject);
    begin
      FileListBox1.Directory:=DirectoryEdit1.Directory;
      EditFileCount.Text := inttostr(FileListBox1.Count);
    end;
     
    procedure TVisio.FileListBox1SelectionChange(Sender: TObject; User: boolean);
    begin // fonctionne avec les boutons, au clic dans la liste et avec les flèches haut-bas du clavier quand la liste a le focus
      pos:=filelistbox1.ItemIndex;
      Image1.Picture.LoadFromFile(FileListBox1.Directory
                                  + DirectorySeparator // multi-plateforme : plus cool
                                  + FileListBox1.Items[pos]);
      EditFileName.Text:=FileListBox1.Directory
                         + DirectorySeparator
                         + FileListBox1.GetSelectedText;
    end;
     
    procedure TVisio.BitBtn1Click(Sender: TObject);// précédent
    begin
      dec(pos);
      if pos<0 then pos:=FileListBox1.Count-1;
      FileListBox1.ItemIndex:=pos;
    end;
     
    procedure TVisio.Button1Click(Sender: TObject);// suivant
    begin
      inc(pos);
      if pos>FileListBox1.Count-1 then pos:=0;
      FileListBox1.ItemIndex:=pos;
    end;
    Impécable, ça fonctionne parfaitement.
    Cependant, dans mes composants, je ne trouve pas trace d'un EditFileName !

    Merci à tous.

  7. #27
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 924
    Points
    2 924
    Par défaut
    Bonjour .

    Citation Envoyé par bern59 Voir le message
    Impécable, ça fonctionne parfaitement.
    Cependant, dans mes composants, je ne trouve pas trace d'un EditFileName !
    Merci à tous.
    Citation Envoyé par jipété
    et pour y voir bien clair, tu rajouteras un TEdit et dans le FLB.Change tu rajouteras EditX.Text := nom; comme ça tu verras parfaitement le nom du fichier sélectionné, à toi d'analyser ensuite ceux qui partent en erreur.
    Tu rajoutes un TEdit, tu le nommes EditFileName (jipété a changé le nom) et tu l'utilises dans FileListeBox1.SelectionChange.

    Amicalement,
    naute.

    PS : Pense à marquer ton fil résolu.

  8. #28
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Août 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité
    Secteur : Service public

    Informations forums :
    Inscription : Août 2017
    Messages : 30
    Points : 17
    Points
    17
    Par défaut rafraichissement
    Tout simplement.
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. actualisation d'une base de données automatiquement
    Par klimero dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 19/01/2006, 18h07
  2. Site qui vérifie les actualisations d'une page web
    Par LFC dans le forum Autres langages pour le Web
    Réponses: 4
    Dernier message: 01/12/2005, 18h47
  3. Actualisation d'une barre d'outil
    Par zoom61 dans le forum IHM
    Réponses: 2
    Dernier message: 07/03/2005, 10h28
  4. [MFC] Probleme d'actualisation d'une listbox
    Par Robleplongeur dans le forum MFC
    Réponses: 5
    Dernier message: 13/05/2004, 14h15
  5. Actualisation d'une liste "dépendante".
    Par Trilby dans le forum ASP
    Réponses: 6
    Dernier message: 19/11/2003, 18h39

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