Que donne une boucle FindFirst/FindNext sur les fichiers du répertoire ?
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 !
Salut, Y. !
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 :
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
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 :
qui est en fait le dossier :
j'ouvre un autre dossier
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 FileOpenUTF8
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;
Je parie qu'il y a une erreur avec la fonction UTF8Decode
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;
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
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
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
Tout simplement.
Merci.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager