PDA

View Full Version : [free pascal] ho bisogno di un paio di mani..


kikkas
13-02-2010, 08:58
allora, apro questo post per un duplice motivo, il pimo è un errore di lazarus abbastanza scomodo, l'altra è domanda di programmazione (chiaramente la seconda è + importante)

devo scrivere un programmino per windows, solo che facendolo con i lfree pascal pensavo di farlo sotto linux e poi compilarlo su un pc windows.

se però faccio un programma qualsiasi (hello world) che su linux funziona, duranta la compilazione su windows ottengo un errore strano:

project1.lpr(20,1)Error: Error while linking

dalla linea 15 alla linea 20 vi è scritto questo:
begin
{$I project1.lrs}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


togliendo/commentando la riga {$I project1.lrs}

il problema non si risolve, però ho notato che se faccio lo stesso programma da 0 su windows ottengo lo stesso errore, se faccio lo stesso programma e salvo tutto in una cartella allora l'errore non me lo da +. Controllando nella cartella del salvataggio vi è un file project1.lrs, che però vi è anche nella cartella di salvataggio del programma scritto in linux (che su linux funziona, indipendentemente dal fatto che abbia salvato il progetto o meno)....

idee? al momento quindi programmerò in macchina virtuale, anche se un poco mi secca...


e poi la parte importante:
1)come faccio ad inserire un link ad un sito internet?
2)nella cartella dell'eseguibile (facciamo che sia /programma), vi sia una cartella con un file .exe (/programma/file.exe) come faccio a fare in modo che cliccando su un button del programma in lazarus venga eseguito l'eseguibile? notate che non posso mettere percorsi tipo C:.... perchè la cartella la potrei mettere su una chiavetta, quindi devo fare in modo di dirgli di partire dalla cartella in cui si trova lui!
3)se programmo su ubuntu il programmino ha una interfaccia stile gnome, quindi in tema con il resto del sistema, su windows xp invece sembra fatto per windows 95 il programma, contando che pensavo un utilizzo anche su vista/seven mi seccava un poco avere un'interfaccia così sgradevole....sapete come possa cambiarla/fare in modo che si adatti al sistema operativo???

ringrazio tutti in anticipo per le risposte

das
13-02-2010, 12:54
Problema 1.
Fai una cosa, crea un programma da 0 in windows e salvalo in una cartella. A quel punto confronta il file project1.lpr di quella versione con quella fatta sotto linux e guarda in che cosa sono diversi. Probabilmente si tratta di una scemata.

Problema 2
Usa la classe TProcess. Ecco un esempio:
Process1:=Tprocess.Create(nil);
Process1.CommandLine:='FileCheTiPare.exe';
Process1.Options := Process1.Options+[poWaitOnExit];
process1.ShowWindow:=swoHide;
try
Process1.Execute;
except
Process1.Free;

Problema 3

E' una cosa strana, a me non succede.

kikkas
13-02-2010, 23:33
ti ringrazio per la risposta, in questi giorni faccio allora un poco di prove, sopratutto con tprocess, posso chiederti un po' di cose su come funziona?

Process1:=Tprocess.Create(nil); //in pratica avvia il processo, giusto?
Process1.CommandLine:='FileCheTiPare.exe'; //esegue il programma come se lo lanciassi da terminale, giusto?
Process1.Options := Process1.Options+[poWaitOnExit]; //cosa è?
process1.ShowWindow:=swoHide; //ma così non "nasconde" la finestra? non dovrebbe essere swoShowNormal
try
Process1.Execute;
except
Process1.Free; //e qui prova a far partire il processo a patto che non sia libero??

das
15-02-2010, 11:28
ti ringrazio per la risposta, in questi giorni faccio allora un poco di prove, sopratutto con tprocess, posso chiederti un po' di cose su come funziona?

Process1:=Tprocess.Create(nil); //in pratica avvia il processo, giusto?
Process1.CommandLine:='FileCheTiPare.exe'; //esegue il programma come se lo lanciassi da terminale, giusto?
Process1.Options := Process1.Options+[poWaitOnExit]; //cosa è?
process1.ShowWindow:=swoHide; //ma così non "nasconde" la finestra? non dovrebbe essere swoShowNormal
try
Process1.Execute;
except
Process1.Free; //e qui prova a far partire il processo a patto che non sia libero??

Process1:=Tprocess.Create(nil); Crea un'istanza della classe TProcess chiamata Process1


Process1.CommandLine:='FileCheTiPare.exe'; //esegue il programma come se lo lanciassi da terminale, giusto?

Esatto, puoi inserire anche delle opzioni, ad esempio: 'FileCheTiPare.exe /o /d file.txt'

Process1.Options := Process1.Options+[poWaitOnExit]; //cosa è?

Trovi le opzioni quì
http://www.freepascal.org/docs-html/fcl/process/tprocess.options.html
In questo caso vuol dire che finchè il programma chiamato non è terminato, il thread chiamante rimane bloccato.

process1.ShowWindow:=swoHide; //ma così non "nasconde" la finestra? non dovrebbe essere swoShowNormal
http://community.freepascal.org:10000/docs-html/fcl/process/tprocess.showwindow.html

try
Process1.Execute;
except
Process1.Free; //e qui prova a far partire il processo a patto che non sia libero??

Prova a far partire il processo, nel caso si verifichi un errore (ad esempio il file .exe non esiste) libera la memoria assegnata all'istanza.