2013-10-02 44 views
1

我有一个小应用程序用于处理在另一个程序中创建的某些文件。 我用安格斯·约翰逊的旧组件调用TDirectoryWatchTDirectoryWatch第一次没有触发

在我FORMCREATE如果该程序已启动且有把一个新的文件目录中的一切火灾和运行正常,我有以下代码

DirectoryWatch := TDirectoryWatch.Create(self); 
    DirectoryWatch.OnChange := FileAction; 
    DirectoryWatch.Directory := Folders.Path(dirInput); 
    DirectoryWatch.Active := True; 

。 但是,如果程序启动时目录中有文件,即使我调用FileAction(nil),也不会发生任何事情;

FileAction是处理文件

我必须FileAction将呼叫从弹出菜单和处理在目录中的文件

所以我的问题是过程的名称:如何确保现有文件在程序启动时处理?

还是有更好的方法来处理这个问题。对于FileAction

procedure TfrmMain.FileAction(Sender: TObject); 
var 
    MailFile: string; 
    MailInfo: TMailInfo; 
    ListAttachments: TstringList; 
    i: integer; 
    MailBody: string; 
begin 
    for MailFile in TDirectory.GetFiles(Folders.Path(dirInput), CheckType) do 
    begin 
     if FileExists(MailFile) then 
     begin 
      MailInfo := TMailInfo.Create(MailFile); 
      try 
      if FileProcessing = False then 
       begin 
       Logfile.Event('Behandler fil: ' + MailFile); 
       FileProcessing   := True; 
       MailBody     := ''; 
       Settings.Load; 
       MailInfo.Load; 
       Settings.Mail.Signature := ''; 
       Settings.Mail.Subject  := MailInfo.Subject; 
       ListAttachments   := TStringList.Create; 
       ListAttachments.Clear; 
       for i := 1 to MaxEntries do 
        begin 
        if (MailInfo.Attachment[i] <> '') and (FileExists(MailInfo.Attachment[i])) then 
         ListAttachments.Add(MailInfo.Attachment[i]); 
        end; 
       for i := 1 to MaxEntries do 
        begin 
        MailBody := MailBody + MailInfo.MailBody[i]; 
        end; 
       try 
        if MailBody <> '' then 
        begin 
         if MailInfo.SenderBcc then 
         Mailing.Send(MailInfo.SenderMail, MailInfo.Recipient, MailInfo.SenderMail, MailInfo.Subject, MailBody, ListAttachments, True) 
         else 
         Mailing.Send(MailInfo.SenderMail, MailInfo.Recipient, MailInfo.Subject, MailBody, ListAttachments, True); 
        end; 
       finally 
        ListAttachments.Free; 
       end; 
       FileProcessing := False; 
       DeleteFile(MailFile); 
       end; 
      finally 
      MailInfo.Free; 
      end; 
     end; 
    end; 
end; 
+0

将代码包含在您的'FileAction'中,这似乎是问题所在。 – Johan

+0

我没有看到'FileAction'的实现与组件的行为有什么关系。如果你认为你的代码存在问题,那么你需要了解一下这是什么。当你没有描述你已经完成的调试时,你不能指望别人为你调试你的程序。你观察到什么行为,你期望什么?不过,这不是与*这个问题有关。 –

+0

正如我所说我的问题是文件没有在程序启动时被处理,但是当程序正在运行并且文件被添加到'watch dir'中时,处理开始并且所有文件都被处理OK。 – OZ8HP

回答

4

组件不会通知用户更改时,你的计划,因为在你的程序启动时启动

添加的代码,再也没有出现过任何更改。

您的策略似乎是在您的程序启动时,所有现有文件将被视为“新”或“新更改”,因此您手动调用更改通知处理程序的方法是正确的。

组件检测到更改时唯一做的就是调用更改通知处理程序。如果你明确地调用了这个函数,但你仍然发现“什么都没有发生”,那么你的程序中有更深层次的问题需要调试;这不是组件的问题,也不是这里描述的基本方法。

+0

我认为问题是我从FormShow事件中调用了FileAction,但没有得到执行 - 可能与该事实有关,该程序正在系统托盘中运行 将调用FileAction移动到FormCreate看起来像它可以解决我目前的问题 – OZ8HP

+1

我明白了。您在程序启动时手动调用函数的想法是正确的。问题在于,您选择的调用网站在程序启动时并未实际运行。这就是我提到的深层次问题。很高兴你找到了它。 –

相关问题