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;
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;
property Index: Integer read fIndex write fIndex;
property Imagem: TObject read fImagem write fImagem;
property ID: Int64 read fID write fID;
property FileMovido: Boolean read fFileMovido;
end;
implementation
uses Util, DateUtils, SysUtils;
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');
B := StrZero(pagNum, 3 - Length(A));
fPagina := A + B + C;
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.