miércoles, 26 de junio de 2019

La ubicación del programa ejecutable.

Vamos a ver tres métodos de hallar o intentar encontrar el path del archivo ejecutable de nuestro programa (me resisto a llamarle aplicación, somos programadores, no aplicadores). Los resultados serán distintos en algunos casos, porque depende desde que ubicación se llame al programa, si es desde la carpeta o directorio donde se encuentra el mismo, entonces no hay problema, como diría ALF, pero si se lo hace a través de un acceso directo desde el escritorio o desde un navegador de archivos llegando al programa abriendo carpetas pero sin entrar en ellas, ahí cambia la cosa. No obstante, hay una forma que no falla nunca y es la correcta:

ExtractFileDir(Application.ExeName)

----> o más simple aún, que encontré después de escribir esta entrada:

Application.Location <---

Ejemplo:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
  Memo1: TMemo;
  procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  elPath:String;
  elPrograma:String;
begin
  elPrograma:=Application.ExeName;
  elPath:=TrimFilename(GetCurrentDir+PathDelim);
  Memo1.Lines.Add('TrimFilename(GetCurrentDir+PathDelim+elPrograma) --> '+elPath);
  elPath:=ExtractFileDir(Application.ExeName);
  Memo1.Lines.Add('ExtractFileDir(Application.ExeName) --> '+elPath);
  elPath:=ExtractFilePath(Application.ExeName);
  Memo1.Lines.Add('ExtractFilePath(Application.ExeName) --> '+elPath);
end;
end.



El primero, es a lo bestia, y falla si no se ejecuta el programa desde su carpeta.
El segundo, ya utilizando Application.ExeName, no es que falle, sino que hace para lo que está programado, ExtractFileDir y no incluye la barra delimitadora o PathDelim.
Finalmente el tercero es el adecuado: ExtractFilePath que a diferencia del anterior, sí incuye la barra delimitadora.
Cabe destacar que ninguno en realidad falla, hablo de falla para lo que se busca, que es el path (completo).


Resultado ejecutando el programa desde la IDE Lazarus.

Resultado desde la carpeta del programa.


Resultado desde la carpeta programas.

Nota: la clase Application se ubica en la unidad Forms.

No hay comentarios:

Publicar un comentario