



Quando estamos criando nossos sistemas, muitas vezes precisamos efetuar a leitura de algum arquivo de configuração, carregar alguma imagem, localizar o banco de dados, enfim várias tarefas que envolvem localizar algum arquivo.
Normalmente optamos por colocar estes arquivos na pasta do nosso sistema, a fim de manter uma organização.
Só que o local onde o nosso sistema está pode várias de computador para computador, por exemplo, em uma máquina ele pode estar na unidade C, em outra pode estar na D, também pode estar dentro de alguma pasta específica, ou seja infinitas possibilidades.
E então, como poderemos encontrar estes arquivos?
Existe uma solução! No Delphi há uma variável globasl que contém o caminho que o executável está no momento e o mesmo é válido para DLLs.
A variável é a: gsAppPath
Até o Delphi 2010 é necessário declarar SWSystem para localiza-lá;
Já a partir do Delphi XE ou superior declare IWSystem.
Muito bem! E como podemos utiliza-la?
Isso é muito simples mesmo. Vamos ao código.
Exemplo de uso da variável gsAppPath:
1 2 3 4 | procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(gsAppPath); end; |
Realmente é simples assim! A própria variável já vai conter o caminho, seja do executável ou uma DLL.
OBS.
Pessoal, recentemente percebi que no Delphi 10.3 Rio, na compilação para Windows 32 bits, o ocorria erro de IWSystem.dcu not found. Então procurei pelo arquivo na instalação do Delphi e realmente não encontrei para Windows 32 bits. O interessante que para Windows 64 bits o arquivo está lá e compilamos normalmente.
Alguém de vocês está com o mesmo problema?
Também podemos citar algumas alternativas ao uso do gsAppPath, Vamos a elas:
Utilizando o ExtractFilePath da unit Forms:
1 2 3 4 | procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ExtractFilePath (Application.ExeName)); end; |
A forma acima funciona para o executável, porém para DLLs vai retornar o caminho do exe princiapal.
Vamos a segunda alternativa, utilizando o ParamStr(0).
É possível utilizar parâmetros para chamar os executáveis. Estes parâmetros podem ser úteis para personalizar diversas tarefas.
O mais interessante é que todos já possuem um parametro de id zero que retorna o caminho que ele está.
E adivinhe, este sim também é compatível com DLLs.
Mas existe outras alternativas, vamos a outro código.
1 2 3 4 5 6 7 8 | function GetModuleName: string; var szFileName: array[0..MAX_PATH] of Char; begin FillChar(szFileName, SizeOf(szFileName), #0); GetModuleFileName(hInstance, szFileName, MAX_PATH); Result := szFileName; end; |
Bem agora é necessário testar.
Vamos ao código!
1 2 3 4 | procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ParamStr(0)); end; |
Agora para facilitar o entendimento colocamos as três opções no mesmo exemplo. Vamos ao código da unit completa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, //<-- Necessário para utilizar o ExtractFilePath Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses IWSystem; //<-- Necessário para utilizar gsAppPath, // porém lembre-se do problema com o Delphi 10.3 Rio procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(gsAppPath); end; procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(ExtractFilePath (Application.ExeName)); end; procedure TForm1.Button3Click(Sender: TObject); begin { Não requer adicionar units } ShowMessage(ParamStr(0)); end; procedure TForm1.Button4Click(Sender: TObject); begin { Não requer adicionar units } ShowMessage( GetModuleName ); end; end. |
Lembrem-se que dúvidas ou sugestões, utilizem os comentários.
Um abraço e até a próxima pessoal. Valeu!