Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Streams mit Fortschritt bearbeiten

  Alt 11. Aug 2003, 07:10
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.
Angehängte Dateien
Dateityp: zip streamprogressadapter.zip (2,5 KB, 120x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat