Que donne une boucle FindFirst/FindNext sur les fichiers du répertoire ?
Version imprimable
Que donne une boucle FindFirst/FindNext sur les fichiers du répertoire ?
Salut, Y. !
Oh lala, tu vas nous l'embrouiller, là, :mouarf:
Et sinon, en regardant attentivement le message d'erreur, on constate que le nom de fichier est vide :
Pièce jointe 388084
Pourquoi ? That's the good question, :P
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.
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 :
Pièce jointe 388156
qui est en fait le dossier :
Pièce jointe 388159
j'ouvre un autre dossier
Pièce jointe 388160
c'est assez déconcertant comme bug
J'ai donc cherché ce message "unable to open file" il est présent dans :
LazUTF8Classes :
Qui nous renvoi sur FileOpenUTF8Code:
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;
Je parie qu'il y a une erreur avec la fonction UTF8DecodeCode:
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;
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
Pièce jointe 388171
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+
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:
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;
Tout simplement.
Merci.