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

Langage Delphi Discussion :

Comment détecter qu'une image vient d'entrer dans un répertoire ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Comment détecter qu'une image vient d'entrer dans un répertoire ?
    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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok je teste
    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 ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    malheureusement, non !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Comment utiliser l'évennement NotifyChange ?
    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]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    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;

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok ca marche
    Cela fonctionne, Mille merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ancien sujet Comment détecter qu'une image vient d'entrer dans un répertoire ?
    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 :
    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;
    L'évennement à détecter est l'entrée d'une image dans un répertoire.
    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 :
    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;
    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

    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 ?

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Refresh déjà essayé
    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

Discussions similaires

  1. comment détecter qu'une image N&B est flou?
    Par gronaze dans le forum Traitement d'images
    Réponses: 10
    Dernier message: 26/07/2006, 15h14
  2. Comment verifier qu'une image a été postée ?
    Par maximenet dans le forum Langage
    Réponses: 1
    Dernier message: 08/01/2006, 19h28
  3. Comment écrire sur une image, dans un cadre ?
    Par Nutrino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/05/2005, 00h55
  4. Réponses: 15
    Dernier message: 27/04/2005, 10h41
  5. [Image]comment pre-charger une image
    Par al85 dans le forum 2D
    Réponses: 5
    Dernier message: 28/02/2005, 20h22

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