Конференция "KOL" » Не могу разобраться с TDirChange , посоветуйте что не так... [Delphi, Windows]
 
  • Deff (06.08.11 21:33) [0]
    Пытаюсь сделать маленькую программу для слежения за изменением файлов/папок на компьютере и дальнейшей обработке этих файлов/папок.
    В Google к сожалению очень мало информации по данной теме.
    Проблема в том что я никак не могу назначить свою процедуру на событие PDirChange
    Вот что у меня получилось:

    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    unit Unit1;

    interface

    {$IFDEF KOL_MCK}
    uses Windows, Messages, KOL {$IF Defined(KOL_MCK)}{$ELSE}, mirror, Classes, Controls, mckCtrls, mckObjs, Graphics {$IFEND (place your units here->)}, KOLadd;
    {$ELSE}
    {$I uses.inc}
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;
    {$ENDIF}

    type
     {$IF Defined(KOL_MCK)}
     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} {$I TForm1class.inc} {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
     {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
       Form: PControl;
     {$ELSE not_KOL_MCK}
     TForm1 = class(TForm)
     {$IFEND KOL_MCK}
       KOLProject1: TKOLProject;
       KOLForm1: TKOLForm;
       TrayIcon1: TKOLTrayIcon;
       OpenDirDialog1: TKOLOpenDirDialog;
       Button1: TKOLButton;
       EditBox1: TKOLEditBox;
       Label1: TKOLLabel;
       procedure Button1Click(Sender: PObj);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
     DirChange:PDirChange;
     DirOnChange : TOnDirChange;

    {$IFDEF KOL_MCK}
    procedure NewForm1( var Result: PForm1; AParent: PControl );
    {$ENDIF}

    procedure MyDirOnChange( Dummy: PObj; Sender: PObj );

    implementation

    {$IF Defined(KOL_MCK)}{$ELSE}{$R *.DFM}{$IFEND}

    {$IFDEF KOL_MCK}
    {$I Unit1_1.inc}
    {$ENDIF}

    procedure TForm1.Button1Click(Sender: PObj);
    begin
    if (OpenDirDialog1.Execute) then
    EditBox1.Text:=OpenDirDialog1.Path;

    DirChange:=NewDirChangeNotifier(OpenDirDialog1.Path,[fncDirName],true,DirOnChang e);

    if DirChange = nil then
    Label1.Caption:='!!!!!!!!!!!!!!!!!!!!!!!'
    else
    DirOnChange:= TOnEvent( MakeMethod( nil, @ MyDirOnChange ) ); // Вот тут ошибка....[Error] Unit1.pas(74): Incompatible types: 'PDirChange' and 'PObj'

    end;

    procedure MyDirOnChange( Dummy: PObj; Sender: PObj );
    begin
    //Тут хотелось бы знать что за объект, где лежит, и что с ним случилось
    end;
    end.

  • RusSun © (07.08.11 09:11) [1]
    procedure MyDirOnChange( Dummy: PObj; Sender: PObj );
    begin
    //Òóò õîòåëîñü áû çíàòü ÷òî çà îáúåêò, ãäå ëåæèò, è ÷òî ñ íèì ñëó÷èëîñü
    end;

    procedure TForm1.Button2Click(Sender: PObj);
    begin
    if (OpenDirDialog1.Execute) then
    EditBox1.Text:=OpenDirDialog1.Path;

    DirChange:=NewDirChangeNotifier(OpenDirDialog1.Path,[fncDirName],true,DirOnChang e);

    if DirChange = nil then
    Label1.Caption:='!!!!!!!!!!!!!!!!!!!!!!!'
    else
    DirOnChange:= tOnDirChange( MakeMethod( nil, @MyDirOnChange ) );
    end;

  • Deff (07.08.11 15:12) [2]
    Да спасибо большое! Ошибка исчезла, но процедура MyDirOnChange не вызывалась.
    Немного переделал NewDirChangeNotifier сам на:

    DirChange:=NewDirChangeNotifier(OpenDirDialog1.Path,[fncDirName,fncFileName,fncC reation,fncSize,fncLastWrite],true,
    TOnDirChange(MakeMethod(nil,@MyDirOnChange)));


    Так процедура MyDirOnChange стала вызываться :)
    Возник другой вопрос как в процедуре MyDirOnChange узнать что случилось и с чем (Какой файл/папка создалась/изменилась/переименовалась......)
    Пытался найти соответствующие свойства у DirChange, но кроме задаваемого пути при создании там ничего нет. А в процедуре у Dummy и у Sender ничего рядом стоящего нет.
    Решил покопаться в KOLAdd.pas - но это для меня дремучий лес. Я вижу что относительно PDirChange там много всего но не пойму что за чем и как это использовать.
    Как быть Как узнать...?
  • QAZ (07.08.11 17:07) [3]

    > Как быть Как узнать...?

    никак,афтар задумал это просто как индикатор изменений
    делай сам на апи
 
Конференция "KOL" » Не могу разобраться с TDirChange , посоветуйте что не так... [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]