>
SaveToFile 에 ProgressBar를 사용하는 방법  방법? 실제로 리소스를 파일에 저장하고 진행률 표시 줄을 저장하면 0 %에서 100 %로 업데이트하려고합니다. 어떻게합니까?

  • 답변 # 1

    아래 코드와 같이 자신 만의 TResourceStream 자손을 만들 수 있습니다. 그러나 큰 리소스의 경우 (아마도 그렇지 않으면 진행 상황을 볼 필요가 없습니다)이를 별도의 스레드로 "랩핑"하는 것이 좋습니다. 도움이 필요하면 소리 치세요.

    type
      TForm1 = class(TForm)
        Button: TButton;
        ProgressBar: TProgressBar;
        procedure ButtonClick(Sender: TObject);
      private
        procedure StreamProgress(Sender: TObject; Percentage: Single);
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    type
      TStreamProgressEvent = procedure(Sender: TObject;
        Percentage: Single) of object;
      TProgressResourceStream = class(TResourceStream)
      private
        FOnProgress: TStreamProgressEvent;
      public
        procedure SaveToFile(const FileName: TFileName);
        property OnProgress: TStreamProgressEvent read FOnProgress
          write FOnProgress;
      end;
    { TProgressResourceStream }
    procedure TProgressResourceStream.SaveToFile(const FileName: TFileName);
    var
      Count: Int64;
      Stream: TStream;
      BlockSize: Int64;
      P: PAnsiChar;
      WriteCount: Int64;
    begin
      if Assigned(FOnProgress) then
      begin
        Count := Size;
        if Count <> 0 then
        begin
          Stream := TFileStream.Create(FileName, fmCreate);
          try
            if Count < 500 then
              BlockSize := 5
            else
              BlockSize := Count div 50;
            P := Memory;
            WriteCount := 0;
            while WriteCount < Count do
            begin
              if WriteCount < Count - BlockSize then
                Inc(WriteCount, Stream.Write(P^, BlockSize))
              else
                Inc(WriteCount, Stream.Write(P^, Count - WriteCount));
              Inc(P, BlockSize);
              FOnProgress(Self, WriteCount / Count);
            end;
          finally
            Stream.Free;
          end;
        end;
      end
      else
        inherited SaveToFile(FileName);
    end;
    { TForm1 }
    procedure TForm1.ButtonClick(Sender: TObject);
    var
      Stream: TProgressResourceStream;
    begin
      ProgressBar.Min := 0;
      Stream := TProgressResourceStream.Create(HInstance, 'TFORM1', RT_RCDATA);
      try
        Stream.OnProgress := StreamProgress;
        Stream.SaveToFile('TForm1.dat');
      finally
        Stream.Free;
      end;
    end;
    procedure TForm1.StreamProgress(Sender: TObject; Percentage: Single);
    begin
      with ProgressBar do
        Position := Round(Percentage * Max);
    end;
    
    

  • 답변 # 2

    TStream에서 상속되므로 Size 속성을 사용하여 전체 크기를 얻고 Position을 사용하여 현재 위치를 얻을 수 있습니다. 이를 사용하여 진행률 표시 줄을 '구동'할 수 있습니다. 그런 다음 SaveToFile을 사용하여 파일에 쓰지 않고 별도의 TFileStream을 사용하고 TResourceStream에서 블록별로 쓰십시오. 마지막 부분에 TStream.CopyFrom 메소드를 사용할 수 있습니다.

  • 이전 macOS에서 awk 버전을 얻는 방법은 무엇입니까?
  • 다음 javascript - 스크롤을 기반으로 div 높이를 동적으로 조정