Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Object-Pascal / Delphi-Language (https://www.delphipraxis.net/35-library-object-pascal-delphi-language/)
-   -   Delphi Streams mit Fortschritt bearbeiten (https://www.delphipraxis.net/7381-streams-mit-fortschritt-bearbeiten.html)

Luckie 11. Aug 2003 07:10


Streams mit Fortschritt bearbeiten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Diese Unit ermöglicht es beliebige Streams mit einer Fortschrittsanzeige zu bearbeiten.

Autor: Hagen Reddmann. Erweiterungen: Aya, Michael Puff

Delphi-Quellcode:
{*******************************************************************************
 Project  : -
 Filename : StreamProgressAdapter
 Date     : 2003-08-11
 Version  : 1.0         Last modified:
 Author   : Hagen Reddmann. Modified by Aya, Michael Puff
 URL      : [url]www.luckie-online.de[/url]
 Copyright : Copyright (c) 2003 Hagen Reddmann, Michael Puff

           When I die I want 'Hello, world' carved on my headstone.

*******************************************************************************}

unit StreamProgressAdapter;

interface

uses
  SysUtils, Classes;

type
  TOnProgress = procedure(Sender: TObject; Index: Integer; Percent: Integer) of
    object;
  TStreamProgressAdapter = class(TStream)
  private
    FStream: TStream;
    FCurrentPos: Integer;
    FIndex, FMax: Integer;
    FPercent: Integer;
    FOnProgress: TOnProgress;
  protected
    procedure SetSize(NewSize: Longint); override;
  public
    constructor Create(AStream: TStream; Index: Integer);
    destructor Destroy; override;
    function Read(var Buffer; Count: Longint): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    function Seek(Offset: Longint; Origin: Word): Longint; override;

    procedure DoProgress(Writing: Boolean); virtual;
    function Progress: Integer;
  published
    property OnProgress: TOnProgress read FOnProgress write FOnProgress;
    property Tag: Integer read FIndex write FIndex;
  end;

implementation

procedure TStreamProgressAdapter.SetSize(NewSize: Longint);
begin
  TStreamProgressAdapter(FStream).SetSize(NewSize);
end;

constructor TStreamProgressAdapter.Create(AStream: TStream; Index: Integer);
begin
  inherited Create;
  FIndex := Index;
  FStream := AStream;
  FMax := FStream.Size;
  FPercent := 0;
end;

destructor TStreamProgressAdapter.Destroy;
begin
  FStream.Free;
  inherited Destroy;
end;

function TStreamProgressAdapter.Read(var Buffer; Count: Longint): Longint;
begin
  Result := FStream.Read(Buffer, Count);
  FCurrentPos := FStream.Position;
  DoProgress(False);
end;

function TStreamProgressAdapter.Write(const Buffer; Count: Longint): Longint;
begin
  Result := FStream.Write(Buffer, Count);
  DoProgress(False);
end;

function TStreamProgressAdapter.Seek(Offset: Longint; Origin: Word): Longint;
begin
  Result := FStream.Seek(Offset, Origin);
end;

procedure TStreamProgressAdapter.DoProgress(Writing: Boolean);
begin
  FPercent := Round(100 / FMax * FCurrentPos);
  if Assigned(OnProgress) then
    OnProgress(self, FIndex, FPercent);
end;

function TStreamProgressAdapter.Progress: Integer;
begin
  result := FPercent;
end;

end.
Anmerkung: Die Eigenschaft "Tag" kann beliebig genutzt werden. Zum Beispiel um eine Zeile in einem Listview zu identifizieren oder dergleichen.

Im Anhang ein kleines Demo-Projekt von mir.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz