Bonjour,
Quelqu'un peut-il me décrire comment paramétrer un TApplicationEvents (ou autre composant plus approprié) qui signale le fait qu'une image vient d'entrer dans un répertoire prédéfini ?
Merci à tous
Bonjour,
Quelqu'un peut-il me décrire comment paramétrer un TApplicationEvents (ou autre composant plus approprié) qui signale le fait qu'une image vient d'entrer dans un répertoire prédéfini ?
Merci à tous
Bonjour,
Personnellement j'utilise cette unit.
OnnotifyChange est l'évènement qui indique qu'une modification (ajout/suppression/Modification de fichiers) à eu lieu.
notifyTime, PriorNotifyTyme indique quand a été reçus la notification précédente, et quand aété reçus la notification en cours.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 unit FolderMonitor; { Run the folder monitor ------------------------ ThreadfolderMonitor:=TThreadfolderMonitor.Create(True); ThreadfolderMonitor.Folder:=Edit1.Text; ThreadfolderMonitor.OnnotifyChange := OnnotifyChange; ThreadfolderMonitor.Resume; Stop the folderMonitor ------------------------ ThreadfolderMonitor.Terminate; FreeAndnil( ThreadfolderMonitor); } interface uses Classes, Windows, sysUtils; type TThreadfolderMonitorOnNotifyChange = procedure(Sender: TObject; notifyTime, PriorNotifyTyme: TDatetime) of object; TThreadfolderMonitor = class(TThread) private { Déclarations privées } HandleNotification : THandle; FTestedFolder : String; FFolder: String; FOnCloseTest: TNotifyEvent; FOnOpenTest: TNotifyEvent; FLastNotifcationTime: TDatetime; FOnnotifychange: TThreadfolderMonitorOnNotifyChange; FPriorNotifcationTime: TDatetime; procedure CloseTest; procedure OpenTest; procedure SyncOnNotifyChange; procedure SyncOnCloseTest; procedure SyncOnOpenTest; protected procedure Execute; override; public property folder: String read FFolder write FFolder; property TestedFolder: String read FTestedFolder; property OnCloseTest: TNotifyEvent read FOnCloseTest write FOnCloseTest; property OnOpenTest: TNotifyEvent read FOnOpenTest write FOnOpenTest; property OnnotifyChange: TThreadfolderMonitorOnNotifyChange read FOnnotifyChange write FOnnotifyChange; property LastNotifcationTime: TDatetime read FLastNotifcationTime; property PriorNotifcationTime: TDatetime read FPriorNotifcationTime; end; implementation procedure TThreadfolderMonitor.Execute; begin // Initialize HandleNotification := INVALID_HANDLE_VALUE; FTestedFolder := ''; // loop While Not Terminated Do Begin // the folder is change and Test is open. I close them. If Folder <> TestedFolder Then Begin If HandleNotification <> INVALID_HANDLE_VALUE Then CloseTest; end; // The test is close, I Open them If HandleNotification = INVALID_HANDLE_VALUE Then begin FTestedFolder := ExcludeTrailingPathDelimiter(Folder); OpenTest; Synchronize(SyncOnNotifyChange); End; If HandleNotification<>INVALID_HANDLE_VALUE Then Begin Case WaitForSingleObject(HandleNotification,200) Of WAIT_OBJECT_0:Begin FLastNotifcationTime := now; Synchronize(SyncOnNotifyChange); FPriorNotifcationTime := FLastNotifcationTime; End; WAIT_TIMEOUT :; End; // Le handle doit être mis à jour pour pouvoir effectuer une nouvelle demande FindNextChangeNotification(HandleNotification); End; End; CloseTest; end; procedure TThreadfolderMonitor.CloseTest; begin FindCloseChangeNotification(HandleNotification); HandleNotification := INVALID_HANDLE_VALUE; Synchronize(SyncOnCloseTest); If Assigned(OnCloseTest) then OnCloseTest(Self); end; procedure TThreadfolderMonitor.OpenTest; Var AFolder :Array[0..255]Of Char; begin If HandleNotification <> INVALID_HANDLE_VALUE Then Exit; if trim(TestedFolder) = '' then Exit; FPriorNotifcationTime := 0; If TestedFolder <> '' Then Begin HandleNotification := FindFirstChangeNotification( StrPCopy(AFolder,TestedFolder), // Chemin à surveiler False, // Ne pas surveiller les sous-répertoires FILE_NOTIFY_CHANGE_FILE_NAME + FILE_NOTIFY_CHANGE_LAST_WRITE); // Surveiller les écriture et changement de noms End; end; procedure TThreadfolderMonitor.SyncOnOpenTest; begin FPriorNotifcationTime := now; If Assigned(OnOpenTest) then OnOpenTest(Self); end; // Cette procédure ne doit être appelée que par l'intermédiaire de Synchronize procedure TThreadfolderMonitor.SyncOnNotifyChange; Begin if PriorNotifcationTime = 0 then SyncOnOpenTest else if Assigned(OnNotifyChange) then OnNotifyChange(Self, LastNotifcationTime, PriorNotifcationTime); End; procedure TThreadfolderMonitor.SyncOnCloseTest; begin If Assigned(OnCloseTest) then OnCloseTest(Self); end; end.
Merci je teste dans la foulée.
A propos je n'arrive pas à me débarasser d'un point d'arret, je me souviens qu'il faut utiliser une combinaison de touche de type Ctrl B, mais je ne retrouve pas la combinaison, la connais-tu ?
Mon problème est de lancer une application qui doit adresser une image dans un répertoire et reprendre la main après que l'image ait été stockée dans le répartoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm1.SpeedButtonShootingClick(Sender: TObject); var ThreadfolderMonitor: TThreadfolderMonitor; begin ThreadfolderMonitor:=TThreadfolderMonitor.Create(True); ThreadfolderMonitor.Folder:= IMGPath; ShellExecute(Form1.Handle,'Open',CameraWindowsPath,nil,nil,SW_SHOWDEFAULT); ..... FreeAndnil( ThreadfolderMonitor); end;
Comment je récupère l'évenement ?
[Hauwke] Prière d'utiliser les balises de code [Hauwke]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Procedure TForm1.CreateThread(RepertoireASurveiller: String); begin ThreadfolderMonitor:=TThreadfolderMonitor.Create(True); ThreadfolderMonitor.Folder := RepertoireASurveiller; ThreadfolderMonitor.OnnotifyChange := OnnotifyChange; // <--- Voir çi dessous ThreadfolderMonitor.Resume; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // Evenement du thread Procedure TForm1. OnnotifyChange(Sender: TObject; notifyTime, PriorNotifyTyme: TDatetime); begin ShowMessage('1 fichier à été ajouter/modifier/Détruit, scanner le repertoire pour voir les modifications S.V.P.'); end;
Bonjour,
Ce sujet a déjà été traité hier et déclaré résolu.
Le problème avait été traité par Tardiff Jean-François.
A la détection de l'évennement le code proposé par Jean-François était le suivant :
L'évennement à détecter est l'entrée d'une image dans un répertoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // Evenement du thread Procedure TForm1. OnnotifyChange(Sender: TObject; notifyTime, PriorNotifyTyme: TDatetime); begin ShowMessage('1 fichier à été ajouter/modifier/Détruit, scanner le repertoire pour voir les modifications S.V.P.'); end;
La procédure OnnotifyChange ci dessus fonctionne parfaitement
Le problème c'est que j'ai changé les instructions de cette procédure comme suit :
Le but de cette procédure étant d'afficher l'image qui vient d'entrer dans le répertoire FileListBoxIMG dont Directory est initialisé à IMGPath
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 // Evenement du thread procedure TForm1.OnnotifyChange(Sender: TObject; notifyTime, PriorNotifyTyme: TDatetime); var Item, FileName: string; k: integer; begin for k := 0 to FileListBoxIMG.Count - 1 do begin Item:= ExtractFileName(FileListBoxIMG.Items[k]); if ExtractFileExt(Item)='.JPG' then FileName:=IMGPath+'/'+Item; end; DisplayImage(FileName); end;
Vérification au pas à pas FileListBoxIMG.Count est à zéro, pourtant quand on sort de cette procédure le fichier image est bien inscrit dans FileListBoxIMG
J'ai même tenté de placer un sleep(2000) avant d'utiliser FileListBoxIMG.Count Rien y fait !
Comment corriger ce léger problème ?
le FileListBoxIMG ne se met pas à jour automatiquement, un petit refresh, ou une réaffectation du répertoire sera nécessaire, sinon, plus léger, FindFirst/FindNext ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Après le sleep(X) j'ai déjà essayé le refresh. Sans succès et je n'avais pas essayé la réafectationon de répertoire, ce que je viens de faire avec un repaint au lieu du refresh toujours sans succès
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