Difference between revisions of "Lazarus Faq/it"

From Lazarus wiki
Jump to navigationJump to search
Line 244: Line 244:
 
Assicuratevi che stia lì e solamente lì; se avete diverse versioni di 'interfaces.ppu' in luoghi diversi, è probabile che la vostra configurazione sia sbagliata (per esempio perché avete aggiunto una directory lcl a un path di ricerca). Cancellate tutte le copie di 'interfaces.ppu' tranne quella nella directory indicata sopra.
 
Assicuratevi che stia lì e solamente lì; se avete diverse versioni di 'interfaces.ppu' in luoghi diversi, è probabile che la vostra configurazione sia sbagliata (per esempio perché avete aggiunto una directory lcl a un path di ricerca). Cancellate tutte le copie di 'interfaces.ppu' tranne quella nella directory indicata sopra.
  
<!--
+
Nota: se avete selezionato un set di widget diverso da quello di default per fare la build di Lazarus, dovete anche ricompilare la LCL con quello stesso set di widget.
  
 +
Se il file sta dove deve stare ma ottenete lo stesso questo errore, significa che state usando, per compilare il vostro progetto, un compilatore/rtl diverso da quello che avevate usato per compilarvi l'IDE di Lazarus. In questo caso dovrete fare una di queste due cose:
 +
* Ricompilare la LCL (o di tutto Lazarus) con il compilatore che avete selezionato nelle Opzioni di Ambiente. Potete farlo andando nel menu Tools -> Build Lazarus. Prima di fare questo, però, verificate le impostazioni in Tools -> Configure Build Lazarus.
 +
* Cambiare il compilatore nelle Opzioni di Ambiente con quello che avete usato per compilare Lazarus. Nelle Opzioni di Ambiente dovrete anche verificare attentamente che il path per le directory di Lazarus e dei sorgenti FPC siano quelli giusti; controllate pure che esista una e una sola versione del file fpc.cfg - dovrebbe trovarsi in /etc/ per sistemi Linux/Unix o nella stessa directory del compilatore per sistemi Windows. Provate a dare il comando "fpc -vt fasullo" per vedere quale versione di fpc.cfg è usata nel vostro sistema; copie vaganti di questo file possono restare in giro dopo l'aggiornamento a una versione superiore del compilatore, nella vostra directory home o in quella del compilatore stesso. CANCELLATELE SPIETATAMENTE.
 +
* Potete anche provare a cambiare il set di widget selezionato per il vostro progetto; per esempio, il progetto di esempio "objectinspector" fornito con Lazarus è impostato di default per usare le gtk. Provate a compilare questo progetto così com'è e sulle piattaforma Windows otterrete sicuramente l'errore "Can't find unit interfaces". Andate in Project | Compiler Options... | LCL Widget Type (various) e cambiatelo in default(win32) e l'errore sparirà.
  
If you selected a different widgetset than you used to build lazarus, you need to build the LCL for this widgetset.  
+
=== Quando cerco di compilare progetti Delphi sotto Lazarus, ottengo un messaggio di errore ===
 +
==== alla riga :{$R *.DFM} Come risolvo il problema? ====
 +
Lazarus (o meglio Linux) non sa nulla di risorse, per cui non potete usarle nel modo in cui lo facevate in Delphi sotto win32. Comunque Lazarus usa un sistema abbastanza compatibile con quello. Potete ancora usare i vostri layout Delphi (i file .dfm), a patto di fare quanto segue:
  
If it is there, but you get this error, you are using a different compiler / rtl for compiling your project than you used for compiling your Lazarus IDE. You can do one of the following
+
* Vi serve una versione testuale dei file .dfm in vostro possesso. Delphi 5 e successori li fanno testuali già di default; se i vostri dfm sono più vecchi, {{keypress|Alt|F12}} per vedere il layout come testo e fate copia/incolla. Quando avete un .dfm in formato testo, copiatelo e rinominatelo con l'estensione .lfm
* Rebuild the LCL (or Lazarus completely) with the compiler selected in the Environmnent Options. You can do this with Tools -> Build Lazarus. Before doing this, check the current settings in Tools -> Configure Build Lazarus.
+
* Create un file con lazres (in lazarus/tools): lazres vostroform.lrs vostroform.lfm
* Change the compiler in the Environment Options to the one you used to compile Lazarus. Look carefully also in the Environment Options to see if you are using the correct paths for the Lazarus Directory and the FPC sources directory. Check that there is only one version of the compiler configuration file fpc.cfg - it should reside in /etc/ for Linux/Unix systems or in the same directory as the fpc compiler for Windows systems. Try to run "fpc -vt bogus" to check which fpc.cfg is being used in your system. Rogue copies often creep in if you have updated your compiler to a new version; they may be found in your home directory or in the same directory as the one in which you built your new compiler.  DELETE THESE!!
+
*Aggiungete la seguente sezione di inizializzazione al file lfm
* You may also try to change the widgetset currently selected for the project. For example, the sample project "objectinspector" that comes with Lazarus is set to gtk by default. Compiling this project will surely give you "Can't find unit interfaces" in Windows platform. Changing widgetset to default(Win32) in Project | Compiler Options... | LCL Widget Type (various) should fix this issue.
 
 
 
=== When I try to compile delphi projects under lazarus, I get an error message ===
 
==== at the line :{$R *.DFM} How can I solve this problem ? ====
 
 
 
Lazarus (or better Linux) doesn't know about resources, so you can't use them in the way Delphi/Win32 does. However Lazarus uses a method pretty compatible with this. You can still use your Delphi layouts (.dfm files) if you use the following steps:
 
 
 
*You need a textual version of the .dfm files. D5 and higher are doing this by default. If you have older files: {{keypress|Alt|F12}} to see the layout as text and paste/copy. When you have a text .dfm file, just copy it to a .lfm file.
 
*Create a file with lazres (in lazarus/tools) lazres yourform.lrs yourform.lfm
 
*Add the following initialization section to
 
  
 
       initialization
 
       initialization
 
       {$I yourform.lrs}
 
       {$I yourform.lrs}
  
Please keep in mind that not all properties in the dfm are supported yet by
+
Ricordatevi che non tutte le proprietà nei .dfm sono ancora supportate da lazarus, per cui potreste causare dei crash.
lazarus, so you might get a crash.
 
  
Edit: Since FPC 2.4.0, Delphi style resources are supported, so you don't need to change anything. Even Lazarus svn already uses it as default projects. Note: it's still advised that you use Lazarus' Delphi project converter as there might still be unsupported properties.
+
Nota: dalla versione 2.4.0 di FPC in poi, le risorse in formato Delphi sono supportate, così non avrete bisogno di cambiare nulla. Perfino Lazarus svn le usa già come default nei suoi progetti. Tuttavia è sempre consigliabile usare il convertitore di risorse di Lazarus, perché potrebbero esserci comunque dei tipi di risorse non ancora pienamente supportati.
  
 
==== 'Identifier not found LazarusResources'. ====
 
==== 'Identifier not found LazarusResources'. ====
  
When creating a form Lazarus automaticaly add some extra units to the uses section of your form unit. During the conversion of a delphi unit to a Lazarus unit this does not happen. So you need to add LResources to the Uses section of your form unit.
+
Quando crea un form, Lazarus aggiunge automaticamente alcune unit aggiuntive alla sezione uses della unit del vostro form: durante la conversione di una unit Delphi in una Lazarus questo non succede, per cui dovrete aggiungere a mano LResources alla sezione Uses della vostra Form unit.
  
=== When accessing events of objects e.g. the onclick event of a button I get the following error. ERROR unit not found: stdCtrls ===
+
=== Quando accedo a eventi oppure oggetti come l'evento onclick di un button, ottengo il seguente errore: ERROR unit not found: stdCtrls ===
  
Make sure, in the Project -> Project Inspector, that your project depends on the package 'LCL' and that you have installed the FPC sources.
+
Andate nel Project inspector (Project -> Project Inspector) e verificate che il vostro progetto dipenda dal package 'LCL' e che avete installati i sorgenti di FPC.
  
Lazarus is the IDE and the visual components library LCL.
+
Lazarus fornisce solo la IDE e la libreria di componenti visuali LCL; tutto il resto, come l'I/O, il supporto ai database, la FCL e la RTL è fornito dal compilatore FPC. Quindi l'IDE di Lazarus deve conoscere i path di tutti i sorgenti di FPC.
All other stuff, like IO, Database, FCL and RTL are provided by FPC.
 
The IDE needs the paths to all sources.
 
  
The FPC source path can be set via:
+
Il path di FPC si imposta in Environment -> Environment Options -> Files -> FPC source directory
Environment -> Environment Options -> Files -> FPC source directory
 
  
===How to embed a small file in the executable, without the need of a separate file? How to embed a resource?===
+
=== Come faccio a incorporare un piccolo file nell'eseguibile in modo da non dover usare file separati? Come incorporo una risorsa? ===
  
For example:
+
Per esempio:
  /your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...
+
  /path/del/vostro/lazarus/tools/lazres sound.lrs sound1.wav sound2.wav ...
will create sound.lrs from sound1.wav and sound2.wav.
+
creerà il file sound.lrs dai file sound1.wav and sound2.wav.
  
Then include it *behind* the form lrs file:
+
Poi lo dovrete includere *dopo* il file lrs del form:
  
 
  ...
 
  ...
 
  initialization
 
  initialization
  {$i unit1.lrs} // this is main resource file (first)
+
  {$i unit1.lrs} // questo è il file di risorse del form (deve venire per primo).
  {$i sound.lrs} // user defined resource file
+
  {$i sound.lrs} // file di risorse definito dall'utente.
 
   
 
   
 
  end.
 
  end.
In your program you can then use:
+
 
 +
Nel vostro programma dovrete poi usare tali risorse così:
 
  Sound1AsString:=LazarusResources.Find('sound1').Value;
 
  Sound1AsString:=LazarusResources.Find('sound1').Value;
  
=== What is the meaning of the various file extensions used by Lazarus? ===
+
=== Che significano le varie estensioni di file usate da Lazarus? ===
  
The [[Lazarus Tutorial#The Lazarus files]] explains some extensions by an example.
+
[[Lazarus Tutorial#The Lazarus files]] spiega il significato di alcune estensioni con degli esempi pratici.
Here is a brief list:
+
Ecco una breve lista:
  
; <code>*.lpi</code> : Lazarus Project Information file (stored in XML; contains project-specific settings)
+
; <code>*.lpi</code> : Lazarus Project Information file (in formato XML; contiene impostazioni specifiche del progetto)
; <code>*.lpr</code> : Lazarus Program file; contains Pascal source of main program
+
; <code>*.lpr</code> : Lazarus Program file; contiene il sorgente Pascal del programma principale
; <code>*.lfm</code> : Lazarus Form file; contains configuration information for all objects on a form (stored in a Lazarus-specific textual format; the actions are described by Pascal source code in a corresponding <code>*.pas</code> file)
+
; <code>*.lfm</code> : Lazarus Form file; contiene informazioni di configurazione per tutti gli oggetti contenuti in un form (immagazzinati in un formato testuale specifico di Lazarus; le azioni sono descritte da codice sorgente Pascal in un corrispondente file <code>*.pas</code>)
; <code>*.pas</code> or <code>*.pp</code> : Unit with Pascal code (typically for a form stored in a corresponding <code>*.lfm</code> file)
+
; <code>*.pas</code> o <code>*.pp</code> : Unit con codice Pascal (di solito per un form memorizzato in un corrispondente file <code>*.lfm</code>)
; <code>*.lrs</code> : Lazarus Resource file (this is a generated file; not to be confused with a Windows resource file).  
+
; <code>*.lrs</code> : Lazarus Resource file (questo è un file generato; non deve essere confuso con un file resource di Windows).  
: This file can be created with lazres tool (in directory Lazarus/Tools) using commandline: lazres myfile.lrs myfile.lfm
+
: Questo file può essere creato con il tool lazres )nella directory Lazarus/Tools) usando la linea di comando: lazres myfile.lrs myfile.lfm
; <code>*.ppu</code> : Compiled unit
+
; <code>*.ppu</code> : Unit compilata
; <code>*.lpk</code> : Lazarus package information file. (stored in XML; contains package-specific settings)
+
; <code>*.lpk</code> : Lazarus package information file. (in formato XML; contiene impostazioni specifiche per il package)
  
  
 +
== Quando scrivo ''var mytext: text;'' per dichiarare un file di testo, ottengo "Unit1.pas(32,15) Error: Error in type definition". Cosa devo fare? ===
 +
 +
La classe TControl ha una proprietà [[doc:lcl/controls/tcontrol.text.html|Text]]; nel metodo di un form, che ha visibilità maggiore, questa collide con il tipo [[doc:rtl/system/text.html|Text]] della unit 'system'. Invece di Text, dovreste usare il tipo [[doc:rtl/system/textfile.html|TextFile]], che è un semplice alias per il tipo Text, oppure includere l'unità nella definizione del tipo:
  
=== When I do ''var mytext: text;'' to declare a text file, I get "Unit1.pas(32,15) Error: Error in type definition". How can I fix this?===
 
The TControl class has a [[doc:lcl/controls/tcontrol.text.html|Text]] property. In a method of a form, that has higher visibility, the [[doc:rtl/system/text.html|Text]] type from the system unit. You can use the [[doc:rtl/system/textfile.html|TextFile]] type, which is just an alias for the Text type or you can add the unit to the type definition.
 
 
  var
 
  var
 
   MyTextFile: TextFile;
 
   MyTextFile: TextFile;
 
   MyText: System.Text;
 
   MyText: System.Text;
A similar name clash exists with assigning and closing a text file. TForm has a ''assign'' and a [[doc:lcl/forms/tcustomform.close.html|Close]] method. You can use [[doc:rtl/objpas/assignfile.html|AssignFile]] and [[doc:rtl/objpas/closefile.html|CloseFile]] or add the unit name ''System''.
 
 
=== I get an error when using Printer.BeginDoc ===
 
  
The unit Printers must be added to the uses section.
+
Un altro conflitto di nomi analogo esiste nell'assegnazione e nella chiusura di un file di testo, fra i metodi 'assign' e '[[doc:lcl/forms/tcustomform.close.html|Close]]' di TForm; dovete o usare [[doc:rtl/objpas/assignfile.html|AssignFile]] e [[doc:rtl/objpas/closefile.html|CloseFile]] oppure aggiungere il nome della unit ''System'' nella dichiarazione.
  
The Printer4Lazarus package must be added to your project requirement in the IDE under:
+
=== Ho un errore quando uso Printer.BeginDoc ===
Project|Project Inspector|Add|New Requirement|Package Name:
 
  
If the package Printer4Lazarus package is not in the list when opening the dropdown box it must be installed. The package is part of the Lazarus installation and can be found in:
+
Dovete aggiungere l'unità Printers  alla sezione uses. Il package Printer4Lazarus deve anche essere aggiunto ai requisiti del vostro progetto nella IDE, il che si fa andando in Project|Project Inspector|Add|New Requirement|Package Name.
[lazarus installed directory]\components\printers
+
Se il package Printer4Lazarus non compare nella lista della dropdown box deve essere installato; esso è parte della installazione Lazarus e si trova in [lazarus installed directory]\components\printers
  
If you used the default installation directories [lazarus installed directory] is:
+
Se usate le normali directory di default [lazarus installed directory] vale:
 
*Windows: c:\lazarus   
 
*Windows: c:\lazarus   
 
*Linux: /usr/lib/lazarus
 
*Linux: /usr/lib/lazarus
  
The same solution also applies to the exception you can get when referencing Printer.Printers
+
La stessa soluzione si applica all'eccezione che potreste ottenere referenziando Printer.Printers
 
 
=== Why are TForm.ClientWidth/ClientHeight the same as TForm.Width/Height ===
 
  
The TForm.Width/Height do no include the frame, because there was no way to retrieve the frame size on all platforms. Without a reliable way, the LCL would move the forms around on the screen or resize them endlessly.
+
=== Perché TForm.ClientWidth/ClientHeight e TForm.Width/Height sono uguali? ===
  
Eventually when there is a reliable way to get the size and position of a window with its frame on all platforms, then it will be changed. To keep compatibility with older LCL forms, a version number and some extra methods will be added.
+
TForm.Width/Height non comprende il bordo, perché non esiste un modo di ottenere lo spessore del bordo su tutte le piattaforme supportate. In mancanza di un sistema affidabile per ottenere questo dato, la LCL muoverebbe e ridimensionerebbe i form a schermo all'infinito. Se in futuro esisterà il modo di ricavare dimensione e posizione di una finestra compresi i suoi bordi su tutte le piattaforme supportate, questo comportamnto verrà cambiato, aggiungendo un numero di versione e/o dei metodi extra per mantenere la compatibilità.
  
 
== Debugger ==
 
== Debugger ==
  
   Please see [[GDB Debugger Tips]]
+
   Vedere [[GDB Debugger Tips]]
  
=== How can I see debug output? ===
+
=== Come vedo l'output del debug? ===
  
The LCL has in the LCLProc unit two procedures to write debug output. They are named:  
+
La LCL ha due procedure nella unit LCLProc per scrivere output di debug. Si chiamano:  
* '''DebugLn:''' which works about the same as WriteLn, but accepts only strings.
+
* '''DebugLn:''' che funziona come la WriteLn, ma accetta solo stringhe.
* '''DbgOut:''' which works about the same as Write, but accepts only strings.
+
* '''DbgOut:''' che funziona come la Write, ma accetta solo stringhe.
  
In normal circumstances the output is written to stdout. If stdout is closed, (for example when the application is {$AppType Gui} or compiled with -WG on Windows), no output is written.
+
In circostanze normali l'output viene scritto sullo stdout, ma se questo è chiuso (per esempio se l'applicazione è {$AppType Gui} o compilata con -WG sotto Windows) nessun output viene scritto.
  
 +
<!--
 
Debug output can also be written to file. The initialization code of the LCLProc unit checks Lazarus.exe's command line parameters for '--debug-log=<file>'. On finding this parameter any subsequent debug output is sent to <file>.
 
Debug output can also be written to file. The initialization code of the LCLProc unit checks Lazarus.exe's command line parameters for '--debug-log=<file>'. On finding this parameter any subsequent debug output is sent to <file>.
  

Revision as of 01:25, 2 March 2011

العربية (ar) Deutsch (de) English (en) español (es) français (fr) magyar (hu) italiano (it) 日本語 (ja) 한국어 (ko) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Questioni generiche

Perché i file binari generati sono così grandi?

Sono grandi perché includono una grande quantità di informazioni di debug necessarie per l'uso di gdb (GNU Debugger). Il compilatore ha un'opzione (-Xs) che toglie le informazioni di debug dagli eseguibili, ma nelle versioni 2.0.2 e precedenti non funzionava a causa di un bug, che è stato corretto a partire dalla versione 2.0.4 e successive del compilatore FreePascal.

Si può usare il programma "strip" per rimuovere i simboli di debug dagli eseguibili; si trova nella directory lazarus\pp\bin\i386-win32\. Basta dare il comando "strip --strip-all <nome e pathname del vostro eseguibile>" dalla linea di comando. Per rendere ancora più piccolo il vostro eseguibile usate UPX, un ottimo exe packer; non causa overhead di memoria perché usa un algoritmo di decompressione in-place, ed ha una velocità di decompressione veramente buona (~10 MB/sec su un Pentium 133).

Per usare upx date il comando "upx <nome e pathname del vostro eseguibile>" dalla linea di comando. Dopo aver usato entrambi questi programmi su un semplice programma GUI creato con Lazarus si ottiene:

  • ~ 700kb su Linux
  • ~ 420kb su Windows

Una discussione più approfondita dei pro e contro dell'uso di UPX si trova nell'articolo Size Matters.

E' inoltre importante notare che anche un semplice hello world creato con Lazarus include già un gran numero di funzioni, fra le quali:

  • librerie di gestione di XML
  • librerie di gestione immagini per file png, xpm, bmp e ico
  • Praticamente tutti i widget della Lazarus Component Library
  • Tutta la libreria di runtime del Free Pascal

Per cui è sì molto grande, ma include quasi tutto quello che serve a un'applicazione reale che sia un minimo complessa. Gli eseguibili generati da Lazarus sono grandi inizialmente, ma crescono molto poco al crescere della complessità dell'applicazione, grazie alle proprietà del Free Pascal e del modo in cui funzionano i form di Lazarus. Un progetto C++ (ma anche in molti altri linguaggi e tool) inizia con dimensioni dell'exe molto piccole, ma che crescono esponenzialmente quando si aggiungono funzionalità realmente utili e non banali.

Lazarus vs cpp.png

Guida rapida alla riduzione della dimensione degli eseguibili generati da Lazarus/FPC (testato con Lazarus 0.9.26)

  • 1. Project|Compiler Options|Code|Smart Linkable (-CX) -> Selezionato
  • 2. Project|Compiler Options|Linking|Debugging| Deselezionare tutto tranne

Strip Symbols From Executable (-Xs) -> Selezionato

  • 3. Project|Compiler Options|Linking|Link Style|Link Smart (-XX) -> Selezionato

La parte più importante sembra essere la 2. Per una semplice applicazione, la dimensione dell'eseguibile dovrebbe ora essere 1-3 MB invece di 15-20 MB. A questo punto potreste provare anche:

  • 4. Project|Compiler Options|Code|Optimizations|smaller rather than faster -> Selezionato (Attenzione: potrebbe penalizzare la velocità di esecuzione)
  • 5. (opzionale) usate UPX <vostro_eseguibile> per comprimere il file binario di un fattore due o tre. (Attenzione: come già detto, ci sono alcuni svantaggi nell'uso di UPX).

Tabella delle dimensioni di una applicazione vuota con varie impostazioni e sistemi operativi

Ho fatto girare i test che ho fatto su Lazarus 0.9.29 con FPC 2.4 (FPC 2.2.4 sotto Windows). Compilatore ottimizzato significa usare i consigli dati qui sopra ma senza usare UPX; Lazarus base significa usando Lazarus con le impostazioni di default che ha appena installato; LCL no debug significa dopo aver ricompilato la LCL e la IDE di Lazarus senza le informazioni di debug (-g-).

    Lazarus base     LCL no debug
Ubuntu 64 bit / Lazarus 64 bit
Applicazione vuota     13,4  Mb     7,5 Mb / 8
Compilatore ottimizzato     4,4 Mb     2,70 Mb (0.29svn FPC2.4 2,5)
   
Ubuntu 32 bit / Lazarus 32 bit
Applicazione vuota     19,6  Mb     5,7 Mb
Compilatore ottimizzato     2,9 Mb     1,6 Mb
   
Windows XP 32 bit / Lazarus 32 bit
Applicazione vuota     11,8 Mb     2,14 Mb
Compilatore ottimizzato     1,62 Mb     1,50 Mb
   
Windows Seven 64 bit / Lazarus 64 bit
Applicazione vuota     12,3  Mb     3,20 Mb
Compilatore ottimizzato     2,14 Mb     2,16 Mb

'Fatal: Circular unit reference between a and b'

Una cosa che capita spesso a un nuovo utente quando crea due unit che fanno riferimento ognuna alle proprietà dell'altra. L'errore di cui sopra avviene quando si mette la clausola uses nella sezione interface, mentre va invece messa nella sezione implementation. Esempio:

Questo codice causerà l'errore:

 unit a;
 
 interface
 
 uses b;
 
 implementation
 
 end.
 ...
 unit b;
 
 interface
 
 uses a;
 
 implementation
 
 end.

Questo invece no:

 unit a;
 
 interface
 
 implementation
 
 uses b;
 
 end.
 ...
 unit b;
 
 interface
 
 implementation
 
 uses a;
 
 end.

Perché il linking è così lento sotto Windows?

Questo problema è stato risolto in FPC 2.2 e Lazarus 0.9.24: per favore aggiornate la vostra versione di Lazarus. Per le versioni più vecchie, leggete il seguito.

In generale, la compilazione sotto Windows è penalizzata a causa del linker GNU, che è molto più lento su questa piattaforma. Questo problema affligge solo Windows, ed è davvero grave solo su macchine relativamente anziane (CPU clock minore di 1 GHz) o con poca RAM (128MB o meno). Ugualmente, se usate lo smartlink per la LCL il linking sarà molto più lento. Potete leggere i dettagli qui: File size and smartlinking.

E' stato sviluppato (ed è pronto) un linker interno parecchio più veloce, ma sarà disponibile solo con il rilascio di Free Pascal 2.2. Se non potete aspettare, è disponibile via subversion.

Nota: Nella versione 2.1.1 Windows usa un linker interno per win32/64/ce che accelera un pò il linking; una riompilazione di Lazarus richiederebbe circa 280MB.

Mi serve ppc386.cfg oppure fpc.cfg?

Vi serve solo fpc.cfg. In questo file sono contenute le informazioni necessarie al compilatore per trovare le librerie.

Come compilo Lazarus?

Così:

$ cd lazarus
$ make clean all


Come faccio la build di altri progetti basati sulla LCL?

Se non puotete usare la IDE per fare la vostra build allora usate lazbuild, che è una versione a linea di comando della IDE appositamente pensata per fare build di di progetti e package Lazarus. Se invece volete fare le build dei vostri progetti senza IDE e senza lazbuild, allora aggiungete queste righe in fondo al vostro file fpc.cfg

  # path del vostro sistema di build (per Linux)
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/{VostroSistemaDiBuild}
  # path del vostro sistema di build (per Windows)
 -Fu/{DirectoryDelVostroLazarus}/components/units/{VostroSistemaDiBuild}
{VostroSistemaDiBuild} può essere gtk2, gnome, qt o win32 e lanciare:
ppc386 your.project.pp

consiglio: non dimenticate di installare il package di sviluppo per il vostro sistema di build, altrimenti potreste ricevere un errore del tipo: Linker message: cannot find -l.

Quale versione di FPC è necessaria?

Lazarus 0.9.28 richiede almeno FPC 2.4.

Non riesco a compilare Lazarus

  1. Accertatevi che la versione del compilatore sia quella giusta
  2. Accertatevi che le librerie (fpc) siano della stessa versione del compilatore
  3. Accertatevi che il path di installazione del compilatore NON contenga spazi!
  4. Accertatevi di avere il file fpc.cfg e non il vecchio ppc386.cfg
  5. Consultate le FAQ dipendenti dal sistema operativo su cui lavorate

Quando cerco di compilare un progetto, ottengo un errore

"Cannot find Unit interfaces". Come lo risolvo?

Significa che il compilatore non trova il file 'interfaces.ppu' oppure lo trova, ma è errato o troppo vecchio.

Questa unit si può trovare in {LazarusDir}\lcl\units\{TargetCPU}-{TargetOS}\{LCLWidgetSet}\interfaces.ppu. Per esempio: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.

Assicuratevi che stia lì e solamente lì; se avete diverse versioni di 'interfaces.ppu' in luoghi diversi, è probabile che la vostra configurazione sia sbagliata (per esempio perché avete aggiunto una directory lcl a un path di ricerca). Cancellate tutte le copie di 'interfaces.ppu' tranne quella nella directory indicata sopra.

Nota: se avete selezionato un set di widget diverso da quello di default per fare la build di Lazarus, dovete anche ricompilare la LCL con quello stesso set di widget.

Se il file sta dove deve stare ma ottenete lo stesso questo errore, significa che state usando, per compilare il vostro progetto, un compilatore/rtl diverso da quello che avevate usato per compilarvi l'IDE di Lazarus. In questo caso dovrete fare una di queste due cose:

  • Ricompilare la LCL (o di tutto Lazarus) con il compilatore che avete selezionato nelle Opzioni di Ambiente. Potete farlo andando nel menu Tools -> Build Lazarus. Prima di fare questo, però, verificate le impostazioni in Tools -> Configure Build Lazarus.
  • Cambiare il compilatore nelle Opzioni di Ambiente con quello che avete usato per compilare Lazarus. Nelle Opzioni di Ambiente dovrete anche verificare attentamente che il path per le directory di Lazarus e dei sorgenti FPC siano quelli giusti; controllate pure che esista una e una sola versione del file fpc.cfg - dovrebbe trovarsi in /etc/ per sistemi Linux/Unix o nella stessa directory del compilatore per sistemi Windows. Provate a dare il comando "fpc -vt fasullo" per vedere quale versione di fpc.cfg è usata nel vostro sistema; copie vaganti di questo file possono restare in giro dopo l'aggiornamento a una versione superiore del compilatore, nella vostra directory home o in quella del compilatore stesso. CANCELLATELE SPIETATAMENTE.
  • Potete anche provare a cambiare il set di widget selezionato per il vostro progetto; per esempio, il progetto di esempio "objectinspector" fornito con Lazarus è impostato di default per usare le gtk. Provate a compilare questo progetto così com'è e sulle piattaforma Windows otterrete sicuramente l'errore "Can't find unit interfaces". Andate in Project | Compiler Options... | LCL Widget Type (various) e cambiatelo in default(win32) e l'errore sparirà.

Quando cerco di compilare progetti Delphi sotto Lazarus, ottengo un messaggio di errore

alla riga :{$R *.DFM} Come risolvo il problema?

Lazarus (o meglio Linux) non sa nulla di risorse, per cui non potete usarle nel modo in cui lo facevate in Delphi sotto win32. Comunque Lazarus usa un sistema abbastanza compatibile con quello. Potete ancora usare i vostri layout Delphi (i file .dfm), a patto di fare quanto segue:

  • Vi serve una versione testuale dei file .dfm in vostro possesso. Delphi 5 e successori li fanno testuali già di default; se i vostri dfm sono più vecchi, Alt+F12 per vedere il layout come testo e fate copia/incolla. Quando avete un .dfm in formato testo, copiatelo e rinominatelo con l'estensione .lfm
  • Create un file con lazres (in lazarus/tools): lazres vostroform.lrs vostroform.lfm
  • Aggiungete la seguente sezione di inizializzazione al file lfm
     initialization
     {$I yourform.lrs}

Ricordatevi che non tutte le proprietà nei .dfm sono ancora supportate da lazarus, per cui potreste causare dei crash.

Nota: dalla versione 2.4.0 di FPC in poi, le risorse in formato Delphi sono supportate, così non avrete bisogno di cambiare nulla. Perfino Lazarus svn le usa già come default nei suoi progetti. Tuttavia è sempre consigliabile usare il convertitore di risorse di Lazarus, perché potrebbero esserci comunque dei tipi di risorse non ancora pienamente supportati.

'Identifier not found LazarusResources'.

Quando crea un form, Lazarus aggiunge automaticamente alcune unit aggiuntive alla sezione uses della unit del vostro form: durante la conversione di una unit Delphi in una Lazarus questo non succede, per cui dovrete aggiungere a mano LResources alla sezione Uses della vostra Form unit.

Quando accedo a eventi oppure oggetti come l'evento onclick di un button, ottengo il seguente errore: ERROR unit not found: stdCtrls

Andate nel Project inspector (Project -> Project Inspector) e verificate che il vostro progetto dipenda dal package 'LCL' e che avete installati i sorgenti di FPC.

Lazarus fornisce solo la IDE e la libreria di componenti visuali LCL; tutto il resto, come l'I/O, il supporto ai database, la FCL e la RTL è fornito dal compilatore FPC. Quindi l'IDE di Lazarus deve conoscere i path di tutti i sorgenti di FPC.

Il path di FPC si imposta in Environment -> Environment Options -> Files -> FPC source directory

Come faccio a incorporare un piccolo file nell'eseguibile in modo da non dover usare file separati? Come incorporo una risorsa?

Per esempio:

/path/del/vostro/lazarus/tools/lazres sound.lrs sound1.wav sound2.wav ...

creerà il file sound.lrs dai file sound1.wav and sound2.wav.

Poi lo dovrete includere *dopo* il file lrs del form:

...
initialization
{$i unit1.lrs} // questo è il file di risorse del form (deve venire per primo).
{$i sound.lrs} // file di risorse definito dall'utente.

end.

Nel vostro programma dovrete poi usare tali risorse così:

Sound1AsString:=LazarusResources.Find('sound1').Value;

Che significano le varie estensioni di file usate da Lazarus?

Lazarus Tutorial#The Lazarus files spiega il significato di alcune estensioni con degli esempi pratici. Ecco una breve lista:

*.lpi
Lazarus Project Information file (in formato XML; contiene impostazioni specifiche del progetto)
*.lpr
Lazarus Program file; contiene il sorgente Pascal del programma principale
*.lfm
Lazarus Form file; contiene informazioni di configurazione per tutti gli oggetti contenuti in un form (immagazzinati in un formato testuale specifico di Lazarus; le azioni sono descritte da codice sorgente Pascal in un corrispondente file *.pas)
*.pas o *.pp
Unit con codice Pascal (di solito per un form memorizzato in un corrispondente file *.lfm)
*.lrs
Lazarus Resource file (questo è un file generato; non deve essere confuso con un file resource di Windows).
Questo file può essere creato con il tool lazres )nella directory Lazarus/Tools) usando la linea di comando: lazres myfile.lrs myfile.lfm
*.ppu
Unit compilata
*.lpk
Lazarus package information file. (in formato XML; contiene impostazioni specifiche per il package)


Quando scrivo var mytext: text; per dichiarare un file di testo, ottengo "Unit1.pas(32,15) Error: Error in type definition". Cosa devo fare? =

La classe TControl ha una proprietà Text; nel metodo di un form, che ha visibilità maggiore, questa collide con il tipo Text della unit 'system'. Invece di Text, dovreste usare il tipo TextFile, che è un semplice alias per il tipo Text, oppure includere l'unità nella definizione del tipo:

var
  MyTextFile: TextFile;
  MyText: System.Text;

Un altro conflitto di nomi analogo esiste nell'assegnazione e nella chiusura di un file di testo, fra i metodi 'assign' e 'Close' di TForm; dovete o usare AssignFile e CloseFile oppure aggiungere il nome della unit System nella dichiarazione.

Ho un errore quando uso Printer.BeginDoc

Dovete aggiungere l'unità Printers alla sezione uses. Il package Printer4Lazarus deve anche essere aggiunto ai requisiti del vostro progetto nella IDE, il che si fa andando in Project|Project Inspector|Add|New Requirement|Package Name. Se il package Printer4Lazarus non compare nella lista della dropdown box deve essere installato; esso è parte della installazione Lazarus e si trova in [lazarus installed directory]\components\printers

Se usate le normali directory di default [lazarus installed directory] vale:

  • Windows: c:\lazarus
  • Linux: /usr/lib/lazarus

La stessa soluzione si applica all'eccezione che potreste ottenere referenziando Printer.Printers

Perché TForm.ClientWidth/ClientHeight e TForm.Width/Height sono uguali?

TForm.Width/Height non comprende il bordo, perché non esiste un modo di ottenere lo spessore del bordo su tutte le piattaforme supportate. In mancanza di un sistema affidabile per ottenere questo dato, la LCL muoverebbe e ridimensionerebbe i form a schermo all'infinito. Se in futuro esisterà il modo di ricavare dimensione e posizione di una finestra compresi i suoi bordi su tutte le piattaforme supportate, questo comportamnto verrà cambiato, aggiungendo un numero di versione e/o dei metodi extra per mantenere la compatibilità.

Debugger

 Vedere GDB Debugger Tips

Come vedo l'output del debug?

La LCL ha due procedure nella unit LCLProc per scrivere output di debug. Si chiamano:

  • DebugLn: che funziona come la WriteLn, ma accetta solo stringhe.
  • DbgOut: che funziona come la Write, ma accetta solo stringhe.

In circostanze normali l'output viene scritto sullo stdout, ma se questo è chiuso (per esempio se l'applicazione è {$AppType Gui} o compilata con -WG sotto Windows) nessun output viene scritto.