MdDsDir.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MdDsDir;
  2. interface
  3. uses
  4.   SysUtils, Classes, Db, MdDsList, MdDsCustom;
  5. type
  6.   TMdDirDataset = class(TMdListDataSet)
  7.   private
  8.     FDirectory: string;
  9.     procedure SetDirectory(const NewDirectory: string);
  10.   protected
  11.     // TDataSet virtual methdos
  12.     procedure InternalInitFieldDefs; override;
  13.     procedure SetFieldData(Field: TField; Buffer: Pointer); override;
  14.     function GetCanModify: Boolean; override;
  15.     // custom dataset virtual methods
  16.     procedure InternalAfterOpen; override;
  17.   public
  18.     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
  19.   published
  20.     property Directory: string read FDirectory write SetDirectory;
  21.   end;
  22.   TFileData = class
  23.   public
  24.     ShortFileName: string;
  25.     Time: TDateTime;
  26.     Size: Integer;
  27.     Attr: Integer;
  28.     constructor Create (var FileInfo: TSearchRec);
  29.   end;
  30.   procedure Register;
  31. implementation
  32. uses
  33.   TypInfo, Dialogs, Windows, Forms, Controls;
  34. procedure TMdDirDataset.SetDirectory(const NewDirectory: string);
  35. begin
  36.   if FIsTableOpen then
  37.       raise Exception.Create ('Cannot change directory while dataset is open');
  38.   fDirectory := NewDirectory;
  39. end;
  40. procedure TMdDirDataset.InternalAfterOpen;
  41. var
  42.   Attr: Integer;
  43.   FileInfo: TSearchRec;
  44.   FileData: TFileData;
  45. begin
  46.   // scan all files
  47.   Attr := faAnyFile;
  48.   FList.Clear;
  49.   if SysUtils.FindFirst(fDirectory, Attr, FileInfo) = 0 then
  50.   repeat
  51.     FileData := TFileData.Create (FileInfo);
  52.     FList.Add (FileData);
  53.   until SysUtils.FindNext(FileInfo) <> 0;
  54.   SysUtils.FindClose(FileInfo);
  55. end;
  56. procedure TMdDirDataset.InternalInitFieldDefs;
  57. begin
  58.   if fDirectory = '' then
  59.     raise EMdDataSetError.Create ('Missing directory');
  60.   // field definitions
  61.   FieldDefs.Clear;
  62.   FieldDefs.Add ('FileName', ftString, 40, True);
  63.   FieldDefs.Add ('TimeStamp', ftDateTime);
  64.   FieldDefs.Add ('Size', ftInteger);
  65.   FieldDefs.Add ('Attributes', ftString, 3);
  66.   FieldDefs.Add ('Folder', ftBoolean);
  67. end;
  68. // support function
  69. function DateTimeToNative(DataType: TFieldType; Data: TDateTime): TDateTimeRec;
  70. var
  71.   TimeStamp: TTimeStamp;
  72. begin
  73.   TimeStamp := DateTimeToTimeStamp(Data);
  74.   case DataType of
  75.     ftDate: Result.Date := TimeStamp.Date;
  76.     ftTime: Result.Time := TimeStamp.Time;
  77.   else
  78.     Result.DateTime := TimeStampToMSecs(TimeStamp);
  79.   end;
  80. end;
  81. function TMdDirDataset.GetFieldData (
  82.   Field: TField; Buffer: Pointer): Boolean;
  83. var
  84.   FileData: TFileData;
  85.   Bool1: WordBool;
  86.   strAttr: string;
  87.   t: TDateTimeRec;
  88. begin
  89.   FileData := fList [PInteger(ActiveBuffer)^] as TFileData;
  90.   case Field.Index of
  91.     0: // filename
  92.       StrCopy (Buffer, pchar(FileData.ShortFileName));
  93.     1: // timestamp
  94.     begin
  95.       t := DateTimeToNative (ftdatetime, FileData.Time);
  96.       Move (t, Buffer^, sizeof (TDateTime));
  97.     end;
  98.     2:  // size
  99.       Move (FileData.Size, Buffer^, sizeof (Integer));
  100.     3: begin // attributes
  101.       strAttr := '   ';
  102.       if (FileData.Attr and SysUtils.faReadOnly) > 0 then
  103.         strAttr [1] := 'R';
  104.       if (FileData.Attr and SysUtils.faSysFile) > 0 then
  105.         strAttr [2] := 'S';
  106.       if (FileData.Attr and SysUtils.faHidden) > 0 then
  107.         strAttr [3] := 'H';
  108.       StrCopy (Buffer, pchar(strAttr));
  109.     end;
  110.     4: begin // folder
  111.       Bool1 := FileData.Attr and SysUtils.faDirectory > 0;
  112.       Move (Bool1, Buffer^, sizeof (WordBool));
  113.     end;
  114.   end; // case
  115.   Result := True;
  116. end;
  117. // III: Move data from field to record buffer
  118. procedure TMdDirDataset.SetFieldData(Field: TField; Buffer: Pointer);
  119. begin
  120.   // read only: nothing to todo
  121. end;
  122. function TMdDirDataset.GetCanModify: Boolean;
  123. begin
  124.   Result := False; // read-only
  125. end;
  126. { TFileData }
  127. constructor TFileData.Create(var FileInfo: TSearchRec);
  128. begin
  129.   ShortFileName := FileInfo.Name;
  130.   Time := FileDateToDateTime (FileInfo.Time);
  131.   Size := FileInfo.Size;
  132.   Attr := FileInfo.Attr;
  133. end;
  134. procedure Register;
  135. begin
  136.   RegisterComponents ('Md', [TMdDirDataset]);
  137. end;
  138. end.