⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preximclasses.pas

📁 一个很好的学习例子,有需要的请下载研究,
💻 PAS
📖 第 1 页 / 共 5 页
字号:

      AFileStream := TFileStream.Create(FStoredPath+FFilename, fmCreate or fmShareDenyWrite);
      try
        // read file size and allocate memory for storing data
        ASize := Reader.ReadInt64;
        while ASize > 0 do
        begin
          if ASize<=Sizeof(Buf) then
          begin
            Reader.Read(Buf, ASize);
            AFileStream.Write(Buf, ASize);
          end
          else begin
            Reader.Read(Buf, Sizeof(Buf));
            AFileStream.Write(Buf, Sizeof(Buf));
          end;

          Dec(ASize, Sizeof(Buf));
          
          //ProcessWindowsMessageQueue;
        end;
      finally
        FreeAndNil(AFileStream);
      end;

{      if NeedCompare then
        if CompareFiles(OldFileName, FStoredPath+FFilename) then
        begin
          SysUtils.DeleteFile(FStoredPath+FFilename);
          FileName := OldFileName;
        end;        }
    end;
//  ResetOperateStatus;
  end;
  inherited;
end;

{-------------------------------------------------------------------------------
  ProceName:  TPage.SaveToStream
  Purpose:    Write file data to a stream
  Author:     Licwing
  Date:       08-15-2003
-------------------------------------------------------------------------------}
procedure TPage.SaveToStream(Stream: TStream);
var
  Writer: TWriter;
begin
  Writer := TWriter.Create(Stream, $FF);
  try
    WriteData(Writer);
  finally
    FreeAndNil(Writer);
  end;
end;

procedure TPage.SetCaption(const Value: string);
begin
  if FCaption<>Value then
  begin
    FCaption := Value;
    ChangeOperateStatus;
  end;
end;

procedure TPage.SetFilename(const Value: TFilename);
begin
  FFilename := ExtractFileName(Value);
  FStoredPath := IncludeTrailingPathDelimiter(ExtractFilePath(Value));
  ChangeOperateStatus;
end;

procedure TPage.SetParent(const Value: TDocument);
begin
  if (FParent <> Value) and (Value is TDocument) then
    FParent := Value;
end;

procedure TPage.SetStoredPath(const Value: string);
begin
  FStoredPath := IncludeTrailingPathDelimiter(Value);
  ChangeOperateStatus;
end;

{-------------------------------------------------------------------------------
  ProceName:  TPage.WriteData
  Purpose:    Write page's filename to a stream
  Author:     Licwing
  Date:       08-15-2003
-------------------------------------------------------------------------------}
procedure TPage.WriteData(Writer: TWriter);
var
  //AFileStream: TFileMappingStream;
  AFileStream: TFileStream;
  Buf: array[0..511] of byte;
  ReadCount: integer;
begin
  // write TPage's signature
  Writer.WriteSignature;
//  inherited;

  // We don't need to save path to stream, because of the stream may be transferred
  // to another PC.
  with Writer do
  begin
    WriteString(FFilename);
    WriteString(FCaption);
    WriteBoolean(FKeepPageInStream);

    // We need to store page into stream if FKeepPageInStream is true
    if FKeepPageInStream then
    begin
      //AFileStream := TFileMappingStream.Create(FStoredPath+FFilename, fmOpenRead or fmShareDenyWrite);
      AFileStream := TFileStream.Create(FStoredPath+FFilename, fmOpenRead);
      try
        // Store file size
        Writer.WriteInteger(AFileStream.Size);
        // Store file data
        ReadCount := AFileStream.Read(Buf, Sizeof(Buf));
        while ReadCount > 0 do
        begin
          Writer.Write(Buf, ReadCount);
          ReadCount := AFileStream.Read(Buf, Sizeof(Buf));

          //ProcessWindowsMessageQueue;
        end;
      finally
        FreeAndNil(AFileStream);
      end;
    end;
  end;
  inherited;
end;

{ TFolderList }

function TFolderList.Add(AFolder: TFolder): Integer;
begin
  Result := inherited Add(AFolder);
end;

function TFolderList.Extract(Item: TFolder): TFolder;
begin
  Result := TFolder(inherited Extract(Item));
end;

function TFolderList.First: TFolder;
begin
  Result := TFolder(inherited First);
end;

function TFolderList.GetItem(Index: Integer): TFolder;
begin
  Result := TFolder(inherited Items[Index]);
end;

function TFolderList.IndexOf(AFolder: TFolder): Integer;
begin
  Result := inherited IndexOf(AFolder);
end;

procedure TFolderList.Insert(Index: Integer; AFolder: TFolder);
begin
  inherited Insert(Index, AFolder);
end;

function TFolderList.Last: TFolder;
begin
  Result := TFolder(inherited Last);
end;

function TFolderList.New: TFolder;
begin
  Result := TFolder.Create;
  Result.PageStoredPath := PageStoredPath;
  Result.OperateStatus := opInsert;
  Add(Result);
end;

procedure TFolderList.ReadData(Reader: TReader);
var
  AFolder: TFolder;
  cName: string;
  FldsCount: integer;
begin
  // read TFolder signature
  Reader.ReadSignature;
  inherited;

  // clear all old items
  Clear;

  with Reader do
  begin
    // read beginning of file and beginning of object list markers
    FldsCount := ReadInteger;
    //loop through file list of objects
    while FldsCount > 0 do
    begin
      //Load ClassName and use it to get ClassType
      cName := ReadString;

      // If a ClassType was found create an instance and
      // add object to this list
      if cName = TFolder.ClassName  then
      begin
        AFolder := New;
        AFolder.ReadData(Reader);
      end;
      Dec(FldsCount);

      //ProcessWindowsMessageQueue;
    end;
  end;
end;

function TFolderList.Remove(AFolder: TFolder): Integer;
begin
  Result := inherited Remove(AFolder);
end;

procedure TFolderList.SetItem(Index: Integer; const Value: TFolder);
begin
  inherited Items[Index] := Value;
end;


procedure TFolderList.WriteData(Writer: TWriter);
var
  Idx: integer;
begin
  // write TFolderList signature;
  Writer.WriteSignature;
  inherited;

  with Writer do
  begin
    // mark beginning of file and beginning of object list
    WriteInteger(Count);

    for Idx := 0 to Count - 1 do
    begin
      //Store any TDocument objects
      if TObject(Items[Idx]) is TFolder then
      begin
        WriteString(TFolder(Items[Idx]).ClassName);
        //Call WriteData() for TFolder objects}
        TFolder(Items[Idx]).WriteData(Writer);
      end;

      //ProcessWindowsMessageQueue;
    end;
  end;
end;


{ TStreamObjectList }

constructor TStreamObjectList.Create;
begin
  inherited Create;
  fKeepPageInStream := true;
end;

procedure TStreamObjectList.LoadFromStream(Stream: TStream);
var
  Reader: TReader;
begin
  Reader := TReader.Create(Stream, $FF);
  try
    ReadData(Reader);
  finally
    FreeAndNil(Reader);
  end;
end;

function TStreamObjectList.Modified: boolean;
var
  Idx: integer;
begin
  Result := false;
  for Idx:=0 to Count-1 do
  begin
    Result := TCustomStorageObject(Items[Idx]).Modified;
    
    if Result then break;
  end;
end;

procedure TStreamObjectList.ResetOperateStatus;
var
  Idx: integer;
begin
  for Idx:=0 to Count-1 do
  begin
    TCustomStorageObject(Items[Idx]).ResetOperateStatus;

    //ProcessWindowsMessageQueue;
  end;
end;

procedure TStreamObjectList.SaveToStream(Stream: TStream);
var
  Writer: TWriter;
begin
  Writer := TWriter.Create(Stream, $FF);
  try
    WriteData(Writer);
  finally
    FreeAndNil(Writer);
  end;
end;

procedure TStreamObjectList.SetKeepPageInStream(const Value: boolean);
var
  Idx: integer;
  AObject: TObject;
begin
  if fKeepPageInStream <> Value then
  begin
    fKeepPageInStream := Value;
    for Idx:=0 to Count-1 do
    begin
      AObject := Items[Idx];
      if AObject is TCustomStorageObject then
        with TCustomStorageObject(AObject) do
          if (OperateStatus<>opMove) or (OperateStatus<>opMoveFax) or
             (OperateStatus<> opInsert) then KeepPageInStream := Value;

       //ProcessWindowsMessageQueue;
    end;
  end;
end;
{ TPageList }

function TPageList.Add(APage: TPage): Integer;
begin
  Result := inherited Add(APage);
end;

function TPageList.Extract(Item: TPage): TPage;
begin
  Result := TPage(inherited Extract(Item));
end;

function TPageList.First: TPage;
begin
  Result := TPage(inherited First);
end;

function TPageList.GetItem(Index: Integer): TPage;
begin
  Result := TPage(inherited Items[Index]);
end;

function TPageList.IndexOf(APage: TPage): Integer;
begin
  Result := inherited IndexOf(APage);
end;

procedure TPageList.Insert(Index: Integer; APage: TPage);
begin
  inherited Insert(Index, APage);
end;

function TPageList.Last: TPage;
begin
  Result := TPage(inherited Last);
end;

function TPageList.New: TPage;
begin
  Result := TPage.Create;
  Result.StoredPath := PageStoredPath;
  Result.OperateStatus := opInsert;
  Add(Result);
end;

procedure TPageList.ReadData(Reader: TReader);
var
  APage: TPage;
  cName: string;
  PagesCount: integer;
begin
  // read TPageList signature
  Reader.ReadSignature;
  inherited;

  // clear all old items
  Clear;

  with Reader do
  begin
    // read beginning of file and beginning of object list markers
    PagesCount := ReadInteger;
    //loop through file list of objects
    while PagesCount > 0 do
    begin
      //Load ClassName and use it to get ClassType
      cName := ReadString;

      // If a ClassType was found create an instance and
      // add object to this list
      if cName = TPage.ClassName  then
      begin
        APage := New;
        APage.PageStoredPath := fPageStoredPath;
        APage.ReadData(Reader);
      end;
      Dec(PagesCount);

      //ProcessWindowsMessageQueue;
    end;
  end;
end;

function TPageList.Remove(APage: TPage): Integer;
begin
  Result := inherited Remove(APage);
end;

procedure TPageList.SetItem(Index: Integer; const Value: TPage);
begin
  inherited Items[Index] := Value;
end;

procedure TPageList.WriteData(Writer: TWriter);
var
  Idx: integer;
begin
  // write TPageList signature;
  Writer.WriteSignature;
  inherited;

  with Writer do
  begin
    // mark beginning of file and beginning of object list
    WriteInteger(Count);

    for Idx := 0 to Count - 1 do
    begin
      //Store any TDocument objects
      if TObject(Items[Idx]) is TPage then
      begin
        WriteString(TPage(Items[Idx]).ClassName);
        //Call WriteData() for TFolder objects}
        TPage(Items[Idx]).WriteData(Writer);
      end;

      //ProcessWindowsMessageQueue;
    end;
  end;
end;

{ TTransactionList }

function TTransactionList.Add(ATransaction: TTransaction): Integer;
begin
  Result := inherited Add(ATransaction);
end;

function TTransactionList.Extract(Item: TTransaction): TTransaction;
begin
  Result := TTransaction(inherited Extract(Item));
end;

function TTransactionList.First: TTransaction;
begin
  Result := TTransaction(inherited First);
end;

function TTransactionList.GetItem(Index: Integer): TTransaction;
begin
  Result := TTransaction(inherited Items[Index]);
end;

function TTransactionList.IndexOf(ATransaction: TTransaction): Integer;
begin
  Result := inherited IndexOf(ATransaction);
end;

procedure TTransactionList.Insert(Index: Integer; ATransaction: TTransaction);
begin
   inherited Insert(Index, ATransaction);
end;

function TTransactionList.Last: TTransaction;
begin
  Result := TTransaction(inherited Last);
end;

function TTransactionList.New: TTransaction;
begin
  Result := TTransaction.Create;
  Result.PageStoredPath := PageStoredPath;
  Result.OperateStatus := opInsert;
  Add(Result);
end;

procedure TTransactionList.ReadData(Reader: TReader);
var
  ATxn: TTransaction;
  cName: string;
  TxnsCount: integer;
begin
  Reader.ReadSignature;
  inherited;

  // clear all old items
  Clear;

  with Reader do
  begin
    // read beginning of file and beginning of object list markers
    TxnsCount := ReadInteger;
    //loop through file list of objects
    while TxnsCount > 0 do

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -