FAQ LazarusConsultez toutes les FAQ

Nombre d'auteurs : 17, nombre de questions : 59, dernière mise à jour : 7 juin 2017  Ajouter une question

 

Bienvenue dans la FAQ Lazarus.

Cette base de connaissances a essentiellement été construite avec le contenu de l'ancien forum officiel francophone dédié à Lazarus. Elle sera régulièrement alimentée avec le contenu du forum actuel. Les aspects propres au langage Pascal lui-même se trouvent dans la FAQ Pascal.

Cette FAQ collaborative est avant tout la vôtre ! Pour participer à son développement, vous pouvez directement y ajouter de nouvelles questions/réponses ou encore poster des propositions de corrections sur le forum Contribuez.

Bonne lecture !

L'équipe Pascal.

Commentez


SommaireGénéralités (16)
précédent sommaire suivant
 

Le plus simple des programmes généré par Lazarus pèse par défaut près de 18 Mb. Pour diminuer significativement la taille d'un exécutable, il faut aller dans Projet --> Options du compilateur :

  • Dans l'onglet Code, cocher les cases Table des liens intelligente et Code le plus petit ;
  • Dans l'onglet Édition des liens cocher uniquement Éliminer les symboles de l'exécutable (-Xs) et Lien intelligent (-XX). Décocher Générer les infos pour le débogueur ;
  • Dans l'onglet Faire des commentaires, décocher Insérer un logo FPC (-l).

Recompiler ensuite en allant dans Exécuter --> Construire tout.

P.S. : le point le plus important est de décocher les infos du débogueur.

Mis à jour le 21 avril 2014 Jipété

On peut par exemple utiliser windres, disponible sur Linux et Windows.

On crée l'icône (par exemple sous gimp, icône en 128x128, mode RVB, et enregistrée en "Icône Microsoft Windows", 32bpp, 8bits alpha, no palette).
Ensuite, on crée un fichier nom_fichier.rc qui contient :

Code text : Sélectionner tout
MAINICON ICON "nom_fichier.ico"
Ce fichier doit être placé dans le répertoire de l'application.
Ensuite, on lance à ce même endroit :
Code text : Sélectionner tout
windres -i nom_fichier.rc -o nom_fichier.res
Une fois le fichier res généré, rajouter dans le lpr du projet, juste avant le begin :
Code delphi : Sélectionner tout
{$R nom_fichier.res}
Voilà, l'icône se compile toute seule dans l'exécutable lors d'une compilation pour Windows. La directive n'a pas d'incidence sur la compilation pour Linux, donc pas de souci pour faire du multiplateforme.

Mis à jour le 21 août 2009 Merlin09

Un premier conseil : développez votre application en Anglais, car c'est la langue par défaut de Lazarus.

Dans les options du projet, dans l'onglet i18n, activer i18n et indiquer un chemin pour le répertoire des fichiers .po (par exemple '..\..\languages').
Lazarus va créer automatiquement le fichier .po. Un conseil : ne modifiez pas ce fichier.

Exemple : monfichier.po

Code text : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
msgid "" 
msgstr "" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 
 
#: lzvconst:lzvversionstr 
msgid "%d.%d.%d%d" 
msgstr "" 
 
#: lzvconst:lzvdlgmbabort 
msgid "Abort" 
msgstr ""
Créez une unité dans votre projet qui contiendra les resourcestring utilisées (cela permet d'alléger le code) :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Unit untres; 
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils; 
  
Resourcestring 
  {All} 
  LZTLabVersion            = 'Version :'; 
  LZTVersionStr            = '%d.%d.%d%d'; 
  LZTNoneStr               = 'None'; 
  LZTBuildWith             = 'Builded with Lazarus'; 
  LZTNoImplemented         = 'Not implemented'; 
  LZTStatusInsert          = 'Insert into table'; 
  LZTStatusUpdate          = 'Update table'; 
  LZTStatusTruncate        = 'Truncate table';  
  // etc.... 
  
Implementation 
  
End.
Dans le uses de la Form, ajouter
Code delphi : Sélectionner tout
gettext, Translations
Créer une procédure TranslateVisual dans le projet (le nom importe peu) :
Code delphi : Sélectionner tout
1
2
3
4
5
6
{ Cette procédure affecte les resourcestring aux champs concernés } 
Procedure TFrmlztdbconvert.TranslateVisual; 
Begin 
  BT1.Caption := LZTStatusInsert; // LZTStatusInsert est une ressourcestring dans untres 
  BT2.Caption := LZTStatusUpdate; // LZTStatusUpdate est une ressourcestring dans untres 
End;
Dans le gestionnaire OnCreate de la Form :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
Procedure TFrmlztdbconvert.FormCreate(Sender : TObject); 
Var 
  lg, language : String; 
Begin 
  // Récupère le code langue de la machine mais ont peut s'en passer pour gérer autrement (passage direct issu d'une liste par exemple) 
  GetLanguageIDs(lg,language);  
  
  // Appelle le fichier de traduction via l'unité contenant les resourcestring 
  Translations.TranslateUnitResourceStrings('untres', '.\languages\'+'monfichier.%s.po', lg, language); 
  
  // Affiche les captions et autres ... de type TTranslateString 
  TranslateVisual; 
End;
Traductions

Une fois l'application terminée, il suffit de faire une copie du fichier .po généré par Lazarus.
Exemple : traduction française. Copier monfichier.po en monfichier.fr.po et ajouter les correspondances des ressources dans la langue française :
Code text : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
msgid "" 
msgstr "" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 
 
#: lzvconst:lzvversionstr 
msgid "%d.%d.%d%d" 
msgstr "" 
 
#: lzvconst:lzvdlgmbabort 
msgid "Abort" 
msgstr "Abandonner"
Voilà, en principe vous êtes capable de faire de belles applications disponibles en plusieurs langues.

Mis à jour le 25 août 2009 chris37

Par exemple, on peut créer une Form avec un Label et rajouter une unité language dans laquelle on va définir des resourcestring :

Code delphi : Sélectionner tout
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
Unit Unit1;  
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;  
  
Type 
  TForm1 = class(TForm) 
  private 
    { private declarations } 
  public 
    { public declarations } 
  end;  
  
Var 
  Form1 : TForm1;  
  
Implementation 
  
{ TForm1 } 
Uses 
  gettext; 
  
Procedure TForm1.FormShow (Sender : TObject); 
Begin 
  Label1.Caption := rsLabel1Caption; // Je fixe la valeur de mon texte à la valeur de ma resourcestring 
End; 
  
Initialization 
  {$I main.lrs} 
  TranslateResourcestrings('french.mo'); // Je sélectionne la langue française 
  
End.
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Unit language; 
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils;  
  
resourcestring 
  rsLabel1Caption = 'English text'; 
  
Implementation 
  
End.
Lorsque l'on construit le projet, on obtient un fichier language.rst. On le convertit ensuite en fichier .po :
Code text : Sélectionner tout
rstconv.exe -i language.rst -o english.po
Le fichier rstconv.exe est présent dans C:\lazarus\pp\bin\i386-win32.

Installez poedit. Ouvrez le fichier english.po et indiquez-lui la langue (clic droit sur la zone supérieure dans laquelle il y a les 2 colonnes original - traduction. Quittez poedit et copiez le fichier english.po en french.po que vous traduisez à l'aide de poedit. Celui-ci généra automatiquement des fichiers .mo.
S'il n'y a pas de fichier .mo, cliquez avec le bouton droit sur le fichier .po et sélectionnez l'option Compile to mo file. Copiez ensuite le fichier french.mo vers le fichier .exe et ça marche !!

Amélioration :

Pour les fichiers po en direct, Lazarus utilise les fichiers ..\Lazarus\ide\IDETranslations.pas et ..\Lazarus\lcl\Translations.pas pour la traduction. Le fichier Translations.pas ouvre les .PO. Plus besoin de convertir les fichiers .po en .mo. Par contre, il faut faire attention aux caractères spéciaux comme le ç par exemple. Dans le fichier .po, il faut l'écrire au format UTF-8 (ç).

Voici le fichier french .po :
Code text : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
msgid "" 
msgstr "" 
"Project-Id-Version: \n" 
"POT-Creation-Date: \n" 
"PO-Revision-Date: 2006-09-18 16:54+0100\n" 
"Last-Translator: \n" 
"Language-Team: \n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=utf-8\n" 
"Content-Transfer-Encoding: 8bit\n" 
  
#: rs:rstest 
msgid "English Text" 
msgstr "Texte Français"
Le source principal :
Code delphi : Sélectionner tout
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
Unit Unit1;  
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons; 
  
Type 
  
  { TForm1 } 
  
  TForm1 = class(TForm) 
    Button1 : TButton; 
    Edit1 : TEdit; 
    Label1 : TLabel; 
    Procedure Button1Click (Sender : TObject); 
  private 
    { private declarations } 
  public 
    { public declarations } 
  end;  
  
Var 
  Form1 : TForm1;  
  
Implementation 
  
Uses 
  translations, rs; 
  
{ TForm1 } 
  
Procedure TForm1.Button1Click (Sender : TObject); 
Begin 
  TranslateUnitResourceStrings('rs', Edit1.Text + '.po', 'english', 'english'); 
  Label1.Text := rsTest; 
End; 
  
Initialization 
  {$I unit1.lrs} 
  InitTranslation; 
  
End.
Et le source de rs :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Unit rs; 
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils;  
  
resourcestring 
  rsTest = 'English Text'; 
  
Implementation 
  
End.
A partir de là, il suffit d'ajouter des resourcestring dans le programme. Plus besoin de recréer complètement un fichier .po, il suffit de rajouter les lignes qu'il faut (on fait de la même manière dans les autres fichiers de traduction).

Mis à jour le 25 août 2009 kwaker21

Pour détecter si l'on est en mode conception ou exécution :

Code delphi : Sélectionner tout
1
2
3
if not (csDesigning in ComponentState) 
   then  
     ...

Mis à jour le 21 août 2009 chris37

Aller dans le menu Configuration --> Options du débogueur --> Exceptions de langue : décocher ce qu'on souhaite.

Mis à jour le 20 août 2009 dav999

Voici un exemple :

Code delphi : Sélectionner tout
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
Procedure TForm1.CopierFichier (Source, Destination : String); 
Var 
  Src, Dst : TStream; 
  i, Count : Int64; 
  buffer : Array [0..1023] of Byte; 
Begin 
    // Ouvrir le fichier source 
    Src := TFileStream.Create(Source,fmOpenRead); 
    // Ouvrir le fichier destination 
    Dst := TFileStream.Create(Destination,fmcreate or fmOpenWrite); 
    // Source au début de fichier 
    Src.Position := 0; 
    // Taille du fichier 
    Count := Src.Size; 
    // Début de la copie 
    while Count > 0 do 
      begin 
        // On suit la progression de 0 à 100 % 
        ProgressBar1.Position := trunc(100.0 * (Src.position / Src.size)); 
        // Traitement des messages pour ne pas bloquer tout le système 
        Application.ProcessMessages; 
        // Si count + grand que buffer on lit la taille du buffer 
        if (Count > sizeof(buffer)) then i := sizeof(Buffer) 
           else i:=Count; 
        // On lit i bits 
        i := Src.Read(buffer,i); 
        // On écrit i bits 
        i := Dst.Write(buffer,i); 
       // Si i = 0 plus rien à copier ou erreur 
        if i = 0 then break; 
        dec(count,i); 
      end; 
    // Libération des streams 
    Src.Free; 
    Dst.Free; 
End;

Mis à jour le 24 août 2009 wile64

Solution 1 :

Code delphi : Sélectionner tout
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Unit browserlink; 
  
{$mode objfpc}{$H+} 
  
Interface 
  
Uses 
  Classes, SysUtils, FileUtil, Forms, Dialogs 
{$ifdef linux} 
  ,Unix 
{$endif} 
{$ifdef win32} 
  ,Windows, ShellApi 
{$endif} 
  ; 
  
Type 
  TBrowserLink = class(TComponent) 
  private 
    BrowserDefault : string; 
    BrowserName : Array [0..10] of string; 
    BrowserCount : Integer; 
  public 
    Constructor Create (AOwner :TComponent); override; 
    Destructor Destroy; override; 
    Procedure ShowLink (_url : String); 
    Function SearchExecutable (const ShortFilename : String; var Filename : String) : Boolean; 
    Procedure InitFirst; 
  end; 
  
Implementation 
  
Constructor TBrowserLink.Create (AOwner : TComponent); 
Begin 
  inherited Create(AOwner); 
  BrowserDefault := ''; 
  BrowserName[0] := 'firefox'; 
  BrowserName[1] := 'galeon'; 
  BrowserName[2] := 'konqueror'; 
  BrowserName[3] := 'mozilla'; 
  BrowserName[4] := 'netscape'; 
  BrowserName[5] := 'opera'; 
  BrowserCount := 6; 
End; 
  
Destructor TBrowserLink.Destroy; 
Begin 
  inherited Destroy; 
End; 
  
Function TBrowserLink.SearchExecutable (const ShortFilename : String; var Filename : String) : Boolean; 
Begin 
  Filename := SearchFileInPath(ShortFilename,'',SysUtils.GetEnvironmentVariable('PATH'),PathSeparator,[]); 
  Result := Filename<>''; 
End; 
  
Procedure TBrowserLink.InitFirst; 
Var 
  i1 : Integer; 
  BrowserFileName : String; 
Begin 
  for i1 := 1 to BrowserCount do begin 
    if SearchExecutable(lowercase(BrowserName[i1-1]),BrowserFilename) then begin 
      BrowserDefault := BrowserFileName; 
      Exit; 
    end 
    else begin 
    end; 
  end; 
End; 
  
Procedure TBrowserLink.ShowLink (_url : String); 
Begin 
{$ifdef linux} 
  if BrowserDefault = '' then begin 
    InitFirst; 
  end; 
  Shell(BrowserDefault + ' ' + _url); 
{$endif} 
{$ifdef win32} 
  ShellExecute(0,'open',PChar(_url),'','',SW_SHOW); 
{$endif} 
End; 
  
End.
Appel :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
Procedure TForm1.BitBtn1Click (Sender : TObject); 
Var 
  Link1 : TBrowserLink; 
Begin 
  Link1 := TBrowserLink.Create(Self); 
  Link1.ShowLink('http://www.developpez.com'); 
End;
Solution 2 :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Procedure OpenURL (const URL : String); 
Var 
  TheProcess : TProcess; 
Begin 
  TheProcess := TProcess.Create(nil); 
  try 
    TheProcess.Options := [poNoConsole,poNewProcessGroup]; 
    TheProcess.ShowWindow := swoNone; 
    TheProcess.CommandLine := ExeNavigateur + URL; 
    try 
      TheProcess.Execute; 
      //TheProcess.WaitOnExit; // 
      {$IFDEF LINUX} 
      if TheProcess.ExitStatus <> 0 then begin 
        MessageDlg('Erreur','Erreur lors de l''exécution du programme ' + ExeNavigateur + chariot +'Code de l''erreur : '+IntToStr(TheProcess.ExitStatus),mtError,[mbOk],0); 
      end; 
      {$ENDIF} 
    finally 
      TheProcess.Free; 
    end; 
  except 
    ShowMessage('Erreur !'); 
  end; 
End;

Mis à jour le 21 août 2009

Il faut tout d'abord créer une procédure préfixée du nom de la classe ayant la même signature que l'événement visé :

Code delphi : Sélectionner tout
1
2
3
4
Procedure TForm1.MaProcedure1 (Sender : TObject); 
Begin 
  ... 
End;
Ensuite, on l'affecte à l'événement désiré (par exemple, un OnClick d'un TButton) :
Code delphi : Sélectionner tout
OnClick := @MaProcedure1;
Attention : contrairement à Delphi, l'opérateur @ est indispensable.

Mis à jour le 24 août 2009 chris37

Remarque préalable : sous Linux, pour utiliser les threads, il faut que l'unité cthreads soit la première unité de la première clause uses du programme.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Type 
  TTaskThread = class(TThread) 
  protected 
    Procedure Execute; override; 
  public 
    Constructor Create; 
  end; 
  
Constructor TTaskThread.Create; 
Begin 
  inherited Create(true); // "thread" suspendu à la création 
  FreeOnTerminate := true; 
End; 
  
Procedure TTaskThread.Execute; 
Const 
  LAPS = 180000; // 180000 ms = 3 mn 
Begin 
  while not Terminated do 
  begin 
    Sleep(LAPS); 
    Task; // procédure contenant le code à exécuter toutes les 3 mn 
  end; 
End;
Pour créer le processus :
Code delphi : Sélectionner tout
TaskThread := TTaskThread.Create;
Pour l'activer :
Code delphi : Sélectionner tout
TaskThread.Resume;
Pour le désactiver :
Code delphi : Sélectionner tout
TaskThread.Suspend;
Et pour le tuer :
Code delphi : Sélectionner tout
TaskThread.Terminate;

Mis à jour le 24 août 2009

La solution suivante fonctionne tant sous Windows que sous Linux :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure TForm1.capturer; 
Var 
  Bitmap : TBitmap; 
  ScreenDC : HDC; 
Begin 
  try 
    Bitmap := TBitmap.Create; 
    ScreenDC := GetDC(handle); // récupère le handle de la feuille 
    Bitmap.LoadFromDevice(ScreenDC); 
    ReleaseDC(handle,ScreenDC); 
    if SaveDialog1.Execute then BitMap.SaveToFile(SaveDialog1.FileName); 
  finally 
    Bitmap.free 
  end; 
End;

Mis à jour le 24 août 2009

Nous allons voir comment appeler un script ou plus précisément une fonction Lua depuis un programme Free Pascal.

L'exécution de scripts Lua nécessite une unité qui n'est pas livrée avec le compilateur, ainsi qu'une librairie dynamique (*.dll ou *.so). Les exemples présentés ici ont été testés avec Lua 5.2 et Lua 5.3. Les unités Lua52.pas et Lua53.pas sont incluses dans la pièce jointe à cet article.

Premier exemple, un script Lua contenant une fonction add() qui additionne deux nombres entiers.

Code lua : Sélectionner tout
1
2
3
4
5
-- add.lua 
  
function add(x, y) 
  return x + y 
end

Voici le programme Free Pascal appelant cette fonction :

Code : Sélectionner tout
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
 
program Add; 
{$MODE OBJFPC}{$H+} 
{$DEFINE USE_LUA53} 
 
uses 
{$IFDEF USE_LUA53} 
  Lua53; (* https://github.com/malcome/Lua4Lazarus *) 
{$ELSE} 
  Lua52; (* http://lua-users.org/files/wiki_insecure/FreePascal/lua52.pas *) 
{$ENDIF} 
 
var 
  L: plua_state; 
 
function LuaAdd(x, y: integer): integer; 
begin 
  lua_getglobal(L, 'add');        (* Nom de la fonction Lua. *) 
  lua_pushinteger(L, x);          (* Premier argument. *) 
  lua_pushinteger(L, y);          (* Second argument. *) 
  lua_call(L, 2, 1);              (* Appel de la fonction : deux arguments, un résultat. *) 
  result := lua_tointeger(L, -1); (* Lecture du résultat. *) 
  lua_pop(L, 1);                  (* Le résultat est retiré de la pile. *) 
end; 
 
var 
  script: string;                 (* Nom du script Lua. *) 
  result: integer; 
   
begin 
  script := 'add.lua'; 
  L := luaL_newstate(); 
  luaL_openlibs(L); 
  if luaL_dofile(L, pChar(script)) <> 0 then  
  begin 
    WriteLn(lua_tostring(L, -1)); (* Message d'erreur. *) 
    exit; 
  end; 
  result := LuaAdd(12, 3); 
  lua_close(L); 
  WriteLn(result); 
end.

Deuxième exemple, une fonction Lua qui vérifie si une chaîne de caractères donnée peut être une adresse de messagerie électronique. Cette fois l'argument est une chaîne, et le résultat un booléen.

Code lua : Sélectionner tout
1
2
3
4
5
6
7
-- Fonction qui vérifie si une chaîne donnée peut être une adresse de messagerie 
-- électronique. 
  
function IsEMail(str) 
  local pattern = "^%a[%w%._]*@[%w%._]+%.%a%a%a?%a?$" 
  return string.match(str, pattern) ~= nil 
end

Voici le programme Free Pascal :

Code : Sélectionner tout
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
program EMail; 
{$MODE OBJFPC}{$H+} 
{$DEFINE USE_LUA53} 
 
uses 
{$IFDEF USE_LUA53} 
  Lua53; (* https://github.com/malcome/Lua4Lazarus *) 
{$ELSE} 
  Lua52; (* http://lua-users.org/files/wiki_insecure/FreePascal/lua52.pas *) 
{$ENDIF} 
 
var 
  L: plua_state; 
 
function luaIsEMail(s: string): boolean; 
begin 
  lua_getglobal(L, 'IsEMail'); 
  lua_pushstring(L, s); 
  lua_call(L, 1, 1); 
  result := lua_toboolean(L, -1); 
  lua_pop(L, 1); 
end; 
   
begin 
  L := luaL_newstate(); 
  luaL_openlibs(L); 
   
  if luaL_dofile(L, 'email.lua') = 0 then 
  begin 
    WriteLn(luaIsEMail('berthe.aux_grands_pieds@messagerie.fr')); 
    WriteLn(luaIsEMail('berthe.57@messagerie.fr')); 
    WriteLn(luaIsEMail('57.aux_grands_pieds@messagerie.fr')); 
    lua_close(L); 
  end else 
    WriteLn(lua_tostring(L, -1)); 
end.

Mis à jour le 21 août 2009 Roland Chastain

Supposons que vous souhaitiez utiliser un curseur "pipette" et un curseur "pinceau".

Placez les deux fichiers(pipette.cur, pinceau.cur) dans le répertoire de votre application.

Création d'un fichier ressources au moyen de l'utilitaire LazRes à lancer en ligne de commande ou par l'intermédiaire d'un fichier batch.
La syntaxe est : <LazRes> <Nom du fichier ressources> <Nom du fichier.cur> <Autre fichier.cur>.

C:\lazarus\tools\lazres mycursors.lrs pipette.cur pinceau.cur

Code pour charger les curseurs.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unit MyCursors; 
  
{$mode objfpc}{$H+} 
  
interface 
  
uses 
    Forms, Graphics, LResources; 
  
const 
     // vos constantes cursors 
     CUR_PIPETTE = 1; 
     CUR_PINCEAU = 2; 
  
implementation 
  
initialization 
    {$I mycursors.lrs} 
  
   Screen.Cursors[CUR_PIPETTE]:= LoadCursorFromLazarusResource('pipette'); 
   Screen.Cursors[CUR_PINCEAU]:= LoadCursorFromLazarusResource('pinceau'); 
  
end.
Utilisation : Panel1.Cursor:= CUR_PINCEAU;

Mis à jour le 20 octobre 2014 ThWilliam

Avant toute chose, il faut inclure l'unité lazUTF8 à la clause uses de l'unité qui implémente la fonction suivante :

Code : Sélectionner tout
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
function UTF82HTML(const St : string) : string; 
var 
  Li : integer; 
  LSt: string; 
begin 
  Result := ''; 
  for Li := 1 to UTF8Length(St) do 
  begin 
    LSt := UTF8Copy(St, Li, 1); 
    if Length(LSt) = 1 then 
    begin 
      Result := Result + LSt; 
    end 
    else 
    begin 
      case UTF8Pos(LSt, '™©®ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ¡¢£¤¥¦§¨ª«¬¯°±²³´µ·¸¹º»¼½¾¿×÷€') of 
      1 : Result  := Result  +  '™'; 
      2 : Result  := Result  +  '©'; 
      3 : Result  := Result  +  '®'; 
      4 : Result  := Result  +  'À'; 
      5 : Result  := Result  +  'Á'; 
      6 : Result  := Result  +  'Â'; 
      7 : Result  := Result  +  'Ã'; 
      8 : Result  := Result  +  'Ä'; 
      9 : Result  := Result  +  'Å'; 
      10 : Result  := Result  +  'Æ'; 
      11 : Result  := Result  +  'Ç'; 
      12 : Result  := Result  +  'È'; 
      13 : Result  := Result  +  'É'; 
      14 : Result  := Result  +  'Ê'; 
      15 : Result  := Result  +  'Ë'; 
      16 : Result  := Result  +  'Ì'; 
      17 : Result  := Result  +  'Í'; 
      18 : Result  := Result  +  'Î'; 
      19 : Result  := Result  +  'Ï'; 
      20 : Result  := Result  +  'Ð'; 
      21 : Result  := Result  +  'Ñ'; 
      22 : Result  := Result  +  'Ò'; 
      23 : Result  := Result  +  'Ó'; 
      24 : Result  := Result  +  'Ô'; 
      25 : Result  := Result  +  'Õ'; 
      26 : Result  := Result  +  'Ö'; 
      27 : Result  := Result  +  'Ø'; 
      28 : Result  := Result  +  'Ù'; 
      29 : Result  := Result  +  'Ú'; 
      30 : Result  := Result  +  'Û'; 
      31 : Result  := Result  +  'Ü'; 
      32 : Result  := Result  +  'Ý'; 
      33 : Result  := Result  +  'Þ'; 
      34 : Result  := Result  +  'ß'; 
      35 : Result  := Result  +  'à'; 
      36 : Result  := Result  +  'á'; 
      37 : Result  := Result  +  'â'; 
      38 : Result  := Result  +  'ã'; 
      39 : Result  := Result  +  'ä'; 
      40 : Result  := Result  +  'å'; 
      41 : Result  := Result  +  'æ'; 
      42 : Result  := Result  +  'ç'; 
      43 : Result  := Result  +  'è'; 
      44 : Result  := Result  +  'é'; 
      45 : Result  := Result  +  'ê'; 
      46 : Result  := Result  +  'ë'; 
      47 : Result  := Result  +  'ì'; 
      48 : Result  := Result  +  'í'; 
      49 : Result  := Result  +  'î'; 
      50 : Result  := Result  +  'ï'; 
      51 : Result  := Result  +  'ð'; 
      52 : Result  := Result  +  'ñ'; 
      53 : Result  := Result  +  'ò'; 
      54 : Result  := Result  +  'ó'; 
      55 : Result  := Result  +  'ô'; 
      56 : Result  := Result  +  'õ'; 
      57 : Result  := Result  +  'ö'; 
      58 : Result  := Result  +  'ø'; 
      59 : Result  := Result  +  'ù'; 
      60 : Result  := Result  +  'ú'; 
      61 : Result  := Result  +  'û'; 
      62 : Result  := Result  +  'ü'; 
      63 : Result  := Result  +  'ý'; 
      64 : Result  := Result  +  'þ'; 
      65 : Result  := Result  +  'ÿ'; 
      66 : Result  := Result  +  '¡'; 
      67 : Result  := Result  +  '¢'; 
      68 : Result  := Result  +  '£'; 
      69 : Result  := Result  +  '¤'; 
      70 : Result  := Result  +  '¥'; 
      71 : Result  := Result  +  '¦'; 
      72 : Result  := Result  +  '§'; 
      73 : Result  := Result  +  '¨'; 
      74 : Result  := Result  +  'ª'; 
      75 : Result  := Result  +  '«'; 
      76 : Result  := Result  +  '*'; 
      77 : Result  := Result  +  '¯'; 
      78 : Result  := Result  +  '°'; 
      79 : Result  := Result  +  '±'; 
      80 : Result  := Result  +  '²'; 
      81 : Result  := Result  +  '³'; 
      82 : Result  := Result  +  '´'; 
      83 : Result  := Result  +  'µ'; 
      84 : Result  := Result  +  '·'; 
      85 : Result  := Result  +  '¸'; 
      86 : Result  := Result  +  '¹'; 
      87 : Result  := Result  +  'º'; 
      88 : Result  := Result  +  '»'; 
      89 : Result  := Result  +  '¼'; 
      90 : Result  := Result  +  '½'; 
      91 : Result  := Result  +  '¾'; 
      92 : Result  := Result  +  '¿'; 
      93 : Result  := Result  +  '×'; 
      94 : Result  := Result  +  '÷'; 
      95 : Result  := Result  +  '€'; 
        else 
          Result  := Result  + '?'; 
      end; 
    end; 
  end; 
end;

Mis à jour le 16 juillet 2016 gvasseur58

L'ASCII, puis ASCII étendu, est antérieur à la norme ANSI qui fait l'objet de la fonction de conversion AnsiToUTF8.

La conversion peut être réalisée par la fonction ISO_8859_15ToUTF8 de l'unité LConvEncoding.

La fonction ci-dessous permet également la conversion de l'ASCII étendu vers l'UTF-8.
Elle a été écrite par Andrey Syschikov (http://vk.com/jabber/).

Code Delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function ExtAsciiToUTF8 (AValue : String) : String; 
Var 
  Li, LByte : Integer; 
Begin 
  Result := ''; 
  for Li := 1 to Length(AValue) do 
    begin 
      LByte := Ord(AValue[Li]); 
      if LByte < 128 
         then 
           Result := Result + AValue[Li] 
         else 
           if LByte > 128 
              then 
                Result := Result + Chr($C0 or ((LByte and $C0) shr 6)) + Chr((LByte and $3F) or $80) 
              else 
                Result := Result + Chr($E2) + Chr($82) + Chr($AC); 
    end; 
End;

Mis à jour le 5 novembre 2016 Alcatîz

Il faut savoir qu'un fichier texte ne comportant QUE des caractères ASCII de base (#0 à #127) est tout à la fois UTF-8 (sans BOM) ET ANSI (toute page de code fondée sur l'ASCII étant candidate potentielle) .

Et c'est le cas du fichier qui est créé par Lazarus lorsqu'on ajoute une nouvelle unité au projet. Il ne comporte, au départ, que des mots du langage Pascal ou des commentaires en anglais, pas de lettre accentuée ni autre signe spécial permettant de faire la différence entre UTF-8 et ANSI.

En présence d'un tel fichier, Lazarus l'indique comme étant UTF-8 car c'est son mode d'encodage par défaut.

Par contre un autre éditeur de texte peut avoir une autre stratégie et choisir de l'ouvrir comme étant ANSI.
Par exemple, sous Windows, le Bloc-Notes ou Notepad++ choisiront ANSI (et la page de code par défaut du Système installé).

La distinction ne se fera que lorsqu'on saisira la première lettre accentuée (ou tout autre signe ASCII étendu), celle-ci sera encodée en UTF-8 si c'est l'éditeur de code Lazarus ou, autrement, dans l'encodage choisi par l'éditeur utilisé.

Ceci est valable pour tout fichier texte, qu'il soit créé par Lazarus ou autrement. La reconnaissance exacte de l'encodage d'un fichier existant s'effectue uniquement par analyse de son contenu et seulement dans la mesure où ce contenu permet de distinguer un encodage particulier. C'est d'ailleurs le rôle du BOM, lorsqu'il est utilisé, de créer un embryon de contenu favorisant l'identification de l'encodage UTF8.

Mis à jour le 15 février 2017 DomDA91

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2018 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Lazarus : Alcatîz - Gilles Vasseur -