Abra o Delphi (neste artigo fora utilizado o Delphi 2007) e adicione uma nova unit e salve-a como untTEAMSystem :
Adicione os tipos a seguir:
TEAMAplication = record
private
public
function GetVersionInfo: string;
function FileVersionInfo(Arquivo: string): string;
procedure AbrirArquivoComNotePad(path: string);
procedure AbrirExplorer(path: string);
function DiretorioAplicacao: string;
function ExecAndWait(const FileName, Params: string; const WindowState:
Word): boolean;
function ListarArquivos(Diretorio, Extencao: string; SubDiretorio: Boolean): TStringList;
function ListarNomesArquivos(Diretorio, Extencao: string; SubDiretorio: Boolean): TStringList;
function AppIsRunning(ActivateIt: boolean): Boolean;
function CriaSubDiretorios(const NomeSubDir: string): boolean;
function GetLocalUserName: string;
function LastModify: string;
end;
Como você pode observar não temos nenhum campo value, por que este dado ira agrupar apenas métodos para operações da aplicação.
vamos a implementação:
unit untTEAMSystem;
interface
uses untTEAMString, Windows, SysUtils, dialogs, Forms, Graphics,
Controls, ShellApi, Classes;
type
{$REGION 'Tipos'}
SizeInt = Integer;
TStatusControle = (Editar, Navegar);
{$ENDREGION}
{$REGION 'Aplicação - TEAMAplication'}
TEAMAplication = record
private
public
function GetVersionInfo: string;
function FileVersionInfo(Arquivo: string): string;
procedure AbrirArquivoComNotePad(path: string);
procedure AbrirExplorer(path: string);
function DiretorioAplicacao: string;
function ExecAndWait(const FileName, Params: string; const WindowState:
Word): boolean;
function ListarArquivos(Diretorio, Extencao: string; SubDiretorio: Boolean): TStringList;
function ListarNomesArquivos(Diretorio, Extencao: string; SubDiretorio: Boolean): TStringList;
function AppIsRunning(ActivateIt: boolean): Boolean;
function CriaSubDiretorios(const NomeSubDir: string): boolean;
function GetLocalUserName: string;
function LastModify: string;
end;
{$ENDREGION}
const
strWindowsNotepade: string = 'c:\windows\notepad.exe';
implementation
{ TCSTSystemExecute }
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.GetLocalUserName
Arguments: None
Result: string
Objetivo: Retornar o usuario logado no windows
-------------------------------------------------------------------------------}
function TEAMAplication.GetLocalUserName: string;
procedure StrResetLength(var S: AnsiString);
var
I: SizeInt;
begin
for I := 1 to Length(S) do
if S[I] = #0 then
begin
SetLength(S, I);
Exit;
end;
end;
var
Count: DWORD;
begin
Count := 256 + 1; // UNLEN + 1
// set buffer size to 256 + 2 characters
{ TODO : Win2k solution }
SetLength(Result, Count);
if GetUserName(PChar(Result), Count) then
StrResetLength(Result)
else
Result := '';
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.AbrirArquivoComNotePad
Arguments: path: string
Result: None
Objetivo: Abrir um arquivo usando o notepad
-------------------------------------------------------------------------------}
procedure TEAMAplication.AbrirArquivoComNotePad(path: string);
begin
ShellExecute(0, 'open', pchar(Strwindowsnotepade), pchar(path), nil, SW_MAXIMIZE);
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.AbrirExplorer
Arguments: path: string
Result: None
Objetivo: Abrir o Explorer mostrando uma pasta
-------------------------------------------------------------------------------}
procedure TEAMAplication.AbrirExplorer(path: string);
begin
ShellExecute(Application.Handle, PChar('open'), PChar('explorer.exe'),
PChar(path), nil, SW_NORMAL);
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.AppIsRunning
Arguments: ActivateIt: boolean
Result: Boolean
Objetivo: Verificar se há uma instancia da aplicação rodando
-------------------------------------------------------------------------------}
function TEAMAplication.AppIsRunning(ActivateIt: boolean): Boolean;
var
hSem: THandle;
hWndMe: HWnd;
AppTitle: string;
begin
Result := False;
AppTitle := Application.Title;
hSem := CreateSemaphore(nil, 0, 1, pChar(AppTitle));
if ((hSem <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) then
begin
CloseHandle(hSem);
Result := True;
end;
if Result and ActivateIt then
begin
Application.Title := 'zzzzzzz';
hWndMe := FindWindow(nil, pChar(AppTitle));
if (hWndMe <> 0) then
begin
if IsIconic(hWndMe) then
begin
ShowWindow(hWndMe, SW_SHOWNORMAL);
end
else
begin
SetForegroundWindow(hWndMe);
end;
end;
end;
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.CriaSubDir
Arguments: const NomeSubDir: string
Result: boolean
Objetivo: Criar um ou vários sub-diretórios
-------------------------------------------------------------------------------}
function TEAMAplication.CriaSubDiretorios(const NomeSubDir: string): boolean;
begin
if DirectoryExists(NomeSubDir) then
Result := true
else
Result := ForceDirectories(NomeSubDir);
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.DiretorioAplicacao
Arguments: None
Result: string
Objetivo: Retornar o diretório da aplicação
-------------------------------------------------------------------------------}
function TEAMAplication.DiretorioAplicacao: string;
begin
result := ExtractFilePath(Application.ExeName);
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.ExecAndWait
Arguments: const FileName, Params: string; const WindowState: Word
Result: boolean
Objetivo: Execultar e esperar o termino da execução de um exe
-------------------------------------------------------------------------------}
function TEAMAplication.ExecAndWait(const FileName, Params: string;
const WindowState: Word): boolean;
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
{ Coloca o nome do arquivo entre aspas. Isto é necessário devido aos espaços contidos em nomes longos }
CmdLine := '"' + Filename + '"' + Params;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;
Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
{ Aguarda até ser finalizado }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Libera os Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
function TEAMAplication.FileVersionInfo(Arquivo: string): string;
begin
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.GetVersionInfo
Arguments: None
Result: string
Objetivo: Retornar a versao da aplicação
-------------------------------------------------------------------------------}
function TEAMAplication.GetVersionInfo: string;
type
PFFI = ^vs_FixedFileInfo;
var
F: PFFI;
Handle: Dword;
Len: Longint;
Data: Pchar;
Buffer: Pointer;
Tamanho: Dword;
Parquivo: Pchar;
Arquivo: string;
begin
Arquivo := Application.ExeName;
Parquivo := StrAlloc(Length(Arquivo) + 1);
StrPcopy(Parquivo, Arquivo);
Len := GetFileVersionInfoSize(Parquivo, Handle);
Result := '';
if Len > 0 then
begin
Data := StrAlloc(Len + 1);
if GetFileVersionInfo(Parquivo, Handle, Len, Data) then
begin
VerQueryValue(Data, '\', Buffer, Tamanho);
F := PFFI(Buffer);
Result := Format('%d.%d.%d.%d',
[HiWord(F^.dwFileVersionMs),
LoWord(F^.dwFileVersionMs),
HiWord(F^.dwFileVersionLs),
Loword(F^.dwFileVersionLs)]
);
end;
StrDispose(Data);
end;
StrDispose(Parquivo);
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.LastModify
Arguments: None
Result: string
Objetivo: Retornar a data da ultima modificação do execultavel
-------------------------------------------------------------------------------}
function TEAMAplication.LastModify: string;
var
FileH: THandle;
LocalFT: TFileTime;
DosFT: DWORD;
LastAccessedTime: TDateTime;
FindData: TWin32FindData;
begin
Result := '';
FileH := FindFirstFile(PChar(Application.ExeName), FindData);
if FileH <> INVALID_HANDLE_VALUE then
begin
// Windows.FindClose(nil);
if (FindData.dwFileAttributes and
FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFT);
FileTimeToDosDateTime(LocalFT, LongRec(DosFT).Hi, LongRec(DosFT).Lo);
LastAccessedTime := FileDateToDateTime(DosFT);
Result := DateTimeToStr(LastAccessedTime);
end;
end;
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.ListarArquivos
Arguments: Diretorio, Extencao: string; SubDiretorio: Boolean
Result: TStringList
Objetivo: Listar os arquivo contidos em um diretório e/ou Subdiretório
-------------------------------------------------------------------------------}
function TEAMAplication.ListarArquivos(Diretorio, Extencao: string;
SubDiretorio: Boolean): TStringList;
function TemAtributo(Attr, Val: Integer): Boolean;
begin
Result := (Attr and Val = Val);
end;
var
F: TSearchRec;
Ret: Integer;
TempNome: string;
begin
Result := TStringList.Create;
Ret := FindFirst(Diretorio + '\*.*', faAnyFile, F);
try
while Ret = 0 do
begin
if TemAtributo(F.Attr, faDirectory) then
begin
if (F.Name <> '.') and (F.Name <> '..') then
if SubDiretorio then
begin
TempNome := Diretorio + '\' + F.Name;
Result.AddStrings(ListarArquivos(TempNome, Extencao, True));
end;
end
else
begin
if Pos(Extencao, LowerCase(f.Name)) > 0 then
Result.Add(Diretorio + '\' + F.Name);
end;
Ret := FindNext(F);
end;
finally
begin
FindClose(F);
end;
end;
end;
{-------------------------------------------------------------------------------
Procedure: TEAMAplication.ListarNomesArquivos
Arguments: Diretorio, Extencao: string; SubDiretorio: Boolean
Result: TStringList
Objetivo: Lista todos os arquivos de um diretório de acordo com a extenção
-------------------------------------------------------------------------------}
function TEAMAplication.ListarNomesArquivos(Diretorio, Extencao: string;
SubDiretorio: Boolean): TStringList;
var
I: Integer;
Arq: TEAMString;
begin
result := self.ListarArquivos(Diretorio, Extencao, SubDiretorio);
for I := 0 to result.Count - 1 do
begin
Arq.text := Result[i];
Result[i] := Arq.SubString(arq.SearchRigth('\') + 1, arq.Count + 1);
end;
end;
{$ENDREGION}
end.
Adicione alguns edits e um TlistBox para o formulário de teste como abaixo:
Adicione o seguinte código no onCLick do botão "ok" :
procedure TForm1.btn1Click(Sender: TObject);
var
APP : TEAMAplication;
begin
edtGetVersionInfo.Text := APP.GetVersionInfo;
edtDiretorioAplicacao.Text := APP.DiretorioAplicacao;
edtGetLocalUserName.Text := APP.GetLocalUserName;
lstListarArquivos.Items.Text := APP.ListarArquivos('c:\windows\system32','.dll',False).Text;
end ;
Execute a aplicação e observe o resultado:
Assim finalizamos está série de posts. Analisamos e apreciamos todo o poder do record em pascal, organizamos mais o nosso código e ganhamos em produtividade. Aprendemos que não precisamos de dezenas de units com várias funções em vários lugares, podemos centralizar tudo em uma unica unit organizada, salva-la em um diretório e apenas adiciona-la ao projeto em que estamos trabalhando e usar.
Agora aproveite para exercitar o seu poder de programador para melhorar alguns métodos e adicionar novos e não deixe de nos enviar o seu código. "Compartilhar atrai amigos. Competir atrai inimigos"





1 comentários:
Muito bom ver um blog assim com conteúdo de qualidade para Delphi. Parabéns kra. Já tô seguindo.
Postar um comentário