Tema: Delphi y OO
Ver Mensaje Individual
  #4  
Antiguo 02-03-2011
Paulao Paulao is offline
Miembro
 
Registrado: sep 2003
Ubicación: Rua D 31 Casa 1 - Inhoaíba - Rio de Janeiro - RJ - Brasil
Posts: 637
Reputación: 21
Paulao Va por buen camino
Esta primera Unit es las classes que uso y la otra llamada Main es el programa. Este programa solo tiene un Form(Main). El haz referencia a otras classes, pero solo puzo una por el espacio y creo que una solo es lo suficiente, ok? Voy hacer en dos post, pues estas mui largo en un unico post.

Código Delphi [-]
unit IndexDocument;

interface

uses StdCtrls;

type
  TIndexDocument = class
  private
    fMovedFileName: string;
    fPaginaOK: Boolean;
    fFinishedFileName: string;
    fTipoEdicao: string;
    fDataEdicao: TDateTime;
    fTipoPagina: string;
    fPagina: string;
    fOriginalFileName: string;
    fProximaPagina: string;
    fNumeroEdicao: Integer;
    fRuimFileName: string;
    fIndex: Integer;
    fImagem: TObject;
    fID: Int64;
    fFileMovido: Boolean;
    procedure SetPagina(const Value: string);
    function GetDestinationFileName: string;
  public
    procedure CalcularFileNames(const SrcPath, DstPath: string);
    function MoveFile: Boolean;
    procedure UndoMove;
    property OriginalFileName: string read fOriginalFileName write fOriginalFileName;
    property DataEdicao: TDateTime read fDataEdicao write fDataEdicao;
    property Pagina: string read fPagina write SetPagina;
    property TipoEdicao: string read fTipoEdicao write fTipoEdicao;
    property NumeroEdicao: Integer read fNumeroEdicao write fNumeroEdicao;
    property TipoPagina: string read fTipoPagina write fTipoPagina;
    property PaginaOK: Boolean read fPaginaOK write fPaginaOK;
    // Propriedades calculadas
    property FinishedFileName: string read fFinishedFileName;
    property MovedFileName: string read fMovedFileName;
    property RuimFileName: string read fRuimFileName;
    property ProximaPagina: string read fProximaPagina;
    property DestinationFileName: string read GetDestinationFileName;
    // Propriedades de ligação
    property Index: Integer read fIndex write fIndex;
    property Imagem: TObject read fImagem write fImagem;
    property ID: Int64 read fID write fID;
    // Utilidades
    property FileMovido: Boolean read fFileMovido;
  end;

implementation

uses Util, DateUtils, SysUtils;

{ TIndexDocument }

procedure TIndexDocument.CalcularFileNames(const SrcPath, DstPath: string);
var
  srPath: string;
  Ano, Mes, Dia: string;

  function FileNameNew: string;
  begin
    Result := Ano + Mes + Dia + '-'
      + IntToStr(NumeroEdicao) + '-'
      + TipoEdicao + '-' + Pagina + '-'
      + TipoPagina
      + ExtractFileExt(OriginalFileName);
  end;

  function BuildFileName(const FileName: string; Mv: Boolean): string;
  begin
    if Mv then
      Result := DstPath + 'MV\'
    else
      Result := DstPath + 'RU\';
    Result := FileNewLocation(SrcPath, srPath, Result);
    if Mv then
      Result := Result + FileName
    else
      Result := Result + FileNameNew;
  end;

  function BuildOkFileName: string;
  begin
    Result := DstPath + 'OK\';
    Result := FileNewLocation(SrcPath, srPath, Result);

    Result := Result + Ano + '\' + Mes + '\' + Dia + '\' + Pagina + '\';
    Result := Result + FileNameNew;
  end;

var
  oriName: string;
begin
  Ano := StrZero(YearOf(DataEdicao), 4);
  Mes := StrZero(MonthOf(DataEdicao), 2);
  Dia := StrZero(DayOf(DataEdicao), 2);

  srPath := ExtractFilePath(OriginalFileName);
  oriName := ExtractFileName(OriginalFileName);

  fMovedFileName := BuildFileName(oriName, true);
  fRuimFileName := BuildFileName(oriName, false);
  fFinishedFileName := BuildOkFileName;
end;

function TIndexDocument.GetDestinationFileName: string;
begin
  if PaginaOK then
    Result := FinishedFileName
  else
    Result := RuimFileName;
end;

function TIndexDocument.MoveFile: Boolean;
begin
  if not fFileMovido then
  begin
    ForceDirectories(ExtractFilePath(MovedFileName));
    fFileMovido := Util.MoveFile(OriginalFileName, MovedFileName, true);
  end;
  Result := fFileMovido;
end;

procedure TIndexDocument.SetPagina(const Value: string);
var
  A, B, C: string;
  pagNum: Integer;
begin
  LastNumberParts(Value, A, B, C);
  if not tryStrToInt(B, pagNum) then
    raise Exception.Create('Número da página inválido');

  // Página atual
  B := StrZero(pagNum, 3 - Length(A));
  fPagina := A + B + C;

  // Próxima página
  B := StrZero(pagNum + 1, 3 - Length(A));
  fProximaPagina := A + B + C;
end;

procedure TIndexDocument.UndoMove;
begin
  if PaginaOK then
    Util.DeleteFile(FinishedFileName)
  else
    Util.DeleteFile(RuimFileName);
  if fFileMovido then
    fFileMovido := not Util.MoveFile(MovedFileName, OriginalFileName, true);
end;

end.
Responder Con Cita