pwseo Posted March 15, 2012 at 10:20 PM Report #444129 Posted March 15, 2012 at 10:20 PM NOTA: Tópico dividido (mensagem original). Outros compiladores Pascal sem acesso à ExtractFilePath function GetExePath:String;[/quote] var s,r:String; i:integer; Copia:boolean; begin s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável r:=''; // Limpa a variável de resultado Copia:=False; // Assume à partida que não é para copiar caracteres i:=length(s); // Atribui a i o tamanho do caminho completo repeat if s[i]='\' then Copia:=True; // Quando encontrar a primeira '\' activa a cópia (a contar da direita para a esquerda) if Copia then r:=s[i]+r; // Se já tiver encontrado uma '\' (já descartou o ficheiro), copia o caracter lido para a variável de resultado dec(i); // Anda para trás um caracter until i=0; // Pára quando I for 0 GetExePath:=r; // Devolve o resultado end; Coloca-se aqui um problema importante: em sistemas operativos que não sejam Windows, o separador utilizado é a barra / e não a barra invertida \. Eu penso que a SysUtils vem com todos os compiladores e portanto não será necessário recorrer a uma função caseira para isto. Além disso, não sei se o Pascal funciona como em C, onde podemos utilizar / como separador e o compilador trata de traduzir isso para o valor utilizado pelo sistema em questão.
nunopicado Posted March 15, 2012 at 10:26 PM Report #444130 Posted March 15, 2012 at 10:26 PM Pois, noutros sistemas operativos são necessários os devidos ajustes. De qualquer maneira a função é só um exemplo de como usar o ParamStr(0) A ExtractFilePath não existe em todos. Pelo menos no Turbo Pascal não me lembro de existir. Mas altera-se já a função, e já não deverá haver problemas: function GetExePath:String; var s,r:String; i:integer; Copia:boolean; begin s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável r:=''; // Limpa a variável de resultado Copia:=False; // Assume à partida que não é para copiar caracteres i:=length(s); // Atribui a i o tamanho do caminho completo repeat if s[i] in ['\','/'] then Copia:=True; // Quando encontrar a primeira '\' ou '/' activa a cópia (a contar da direita para a esquerda) if Copia then r:=s[i]+r; // Se já tiver encontrado uma '\' ou '/' (já descartou o ficheiro), copia o caracter lido para a variável de resultado dec(i); // Anda para trás um caracter until i=0; // Pára quando I for 0 GetExePath:=r; // Devolve o resultado end; "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
pwseo Posted March 15, 2012 at 10:29 PM Author Report #444131 Posted March 15, 2012 at 10:29 PM Isso continua com o problema de que em *nix os ficheiros podem ter \ como parte do seu nome 😉 É melhor utilizar compilação condicional para isso 🙂
nunopicado Posted March 15, 2012 at 10:33 PM Report #444132 Posted March 15, 2012 at 10:33 PM Isso continua com o problema de que em *nix os ficheiros podem ter \ como parte do seu nome 🙂 É melhor utilizar compilação condicional para isso 🙂 hmmmm Pois é, não me lembrava desse pormenor! lol Não entendo porque raio se usam barras no nome! hehehehe Assim é, usar uma condiçãozinha é o ideal neste caso! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
pwseo Posted March 15, 2012 at 10:36 PM Author Report #444134 Posted March 15, 2012 at 10:36 PM Em *nix podemos utilizar qualquer caractere no nome de um ficheiro excepto a barra / que é utilizada como separador na hierarquia... Por isso a verdadeira questão acaba por ser "porque é que no windows não é da mesma forma que nos outros sistemas operativos?" 😛
nunopicado Posted March 15, 2012 at 10:40 PM Report #444137 Posted March 15, 2012 at 10:40 PM lol Há caracteres que, independentemente do sistema operativo, não deviam pertencer a nome nenhum. Entre eles: \ / | : ; , 🙂 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted March 16, 2012 at 01:17 PM Report #444198 Posted March 16, 2012 at 01:17 PM Informo as almas caridosas que estão com o problema das barras que até em VB.NET se utiliza a barra "normal", /, em vez da invertida. Acho que em Pascal dará igualmente a utilização da barra comum... ? Process.Start("C:\Users\thoga31") ' Tradicional Process.Start("C:/Users/thoga31") ' Funciona na mesma Nota: este trecho de código abre o Explorador do Windos no directório indicado. Knowledge is free!
nunopicado Posted March 16, 2012 at 01:40 PM Report #444199 Posted March 16, 2012 at 01:40 PM Estranho, aqui em casa esse código não funciona... 🙂 Diz assim: "Caminho não Encontrado. . ." Porque será? 😄🙂 :) Já agora, o problema não é usar o \ ou o / com as funções do Pascal. Isso ele cumpre correctamente, mesmo que procures o c:/xpto.txt A questão levantada é na função criada de raiz usar o / ou o \, consoante o sis. oper., porque nessa fase, não é um caminho, mas sim uma string. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
nunopicado Posted March 16, 2012 at 01:53 PM Report #444200 Posted March 16, 2012 at 01:53 PM Pronto, resolve-se a coisa assim: function GetExePath:String; const {$IFDEF Win32} PathDelimiter='\'; {$ENDIF} {$ifdef Unix} PathDelimiter='/'; {$endif} var s,r:String; i:integer; Copia:boolean; begin s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável r:=''; // Limpa a variável de resultado Copia:=False; // Assume à partida que não é para copiar caracteres i:=length(s); // Atribui a i o tamanho do caminho completo repeat if s[i] = PathDelimiter then Copia:=True; // Quando encontrar a primeira '\' ou '/' activa a cópia (a contar da direita para a esquerda) if Copia then r:=s[i]+r; // Se já tiver encontrado uma '\' ou '/' (já descartou o ficheiro), copia o caracter lido para a variável de resultado dec(i); // Anda para trás um caracter until i=0; // Pára quando I for 0 GetExePath:=r; // Devolve o resultado end; "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted March 16, 2012 at 02:05 PM Report #444201 Posted March 16, 2012 at 02:05 PM Estranho, aqui em casa esse código não funciona... 🙂 Estranho, aqui em casa esse código funciona... 🙂 A questão levantada é na função criada de raiz usar o / ou o \, consoante o sis. oper., porque nessa fase, não é um caminho, mas sim uma string. Para quem não tem a SysUtils é uma questão de instalar o Free Pascal em vez de outras maravilhas da natureza informática 🙂 Mas pronto, já resolveste a questão com as Compiler Directives. Knowledge is free!
nunopicado Posted March 16, 2012 at 03:57 PM Report #444238 Posted March 16, 2012 at 03:57 PM E a muito custo diga-se... Tentei fazer uma função o mais basica possível para ver se funcionava até no PascalZIM (não devia ter o que fazer...)... Claro que agora com as Conditional Defines, se alguém for a tentar a dita função, o PZim explode num cogumelo radioactivo e arrasa quem perto dele se encontrar! 🙂 :) É bem feito, prá próxima usam um compilador em condições (ou melhor dizendo, usam um compilador... ?) "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted March 16, 2012 at 06:03 PM Report #444274 Posted March 16, 2012 at 06:03 PM Tópico dividido. E a muito custo diga-se... Tentei fazer uma função o mais basica possível para ver se funcionava até no PascalZIM (não devia ter o que fazer...)... Então não o fizesses 🙂 De qualquer das formas, fica sempre bem uma função caseira para o efeito. 🙂 Knowledge is free!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now