FAQ LazarusConsultez toutes les FAQ
Nombre d'auteurs : 17, nombre de questions : 88, dernière mise à jour : 31 décembre 2023 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.
- Comment ajouter une icône à une application ?
- Comment créer une application multilingue ?
- Comment internationaliser une application ?
- Comment déterminer si une application est en train de s'exécuter sous l'IDE ou pas ?
- Comment éviter les erreurs EConvertError lors du débogage ?
- Comment copier un fichier en retournant l'état d'avancement ?
- Comment ouvrir une URL sur un navigateur (solutions multiplateformes) ?
- Comment créer un événement dynamique ?
- Comment créer une tâche s'exécutant à intervalle régulier ?
- Comment capturer une copie d'écran ?
- Comment exécuter un script Lua ?
- Comment ajouter des curseurs personnalisés ?
- Comment traduire une chaîne UTF8 en chaîne HTML ?
- Comment convertir une chaîne en ASCII étendu vers l'UTF-8 ?
- Pourquoi le fichier que je viens de créer est-il UTF8 dans Lazarus et ANSI si je l'ouvre dans un autre éditeur de texte ?
- Comment diminuer la taille de l'exécutable ?
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"
Ensuite, on lance à ce même endroit :
Code text : | Sélectionner tout |
windres -i nom_fichier.rc -o nom_fichier.res
Code delphi : | Sélectionner tout |
{$R nom_fichier.res}
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 "" |
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. |
Code delphi : | Sélectionner tout |
gettext, Translations
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; |
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; |
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" |
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. |
Code text : | Sélectionner tout |
rstconv.exe -i language.rst -o english.po
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" |
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. |
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. |
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 ... |
Aller dans le menu Configuration --> Options du débogueur --> Exceptions de langue : décocher ce qu'on souhaite.
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; |
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. |
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; |
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; |
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; |
Code delphi : | Sélectionner tout |
OnClick := @MaProcedure1;
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; |
Code delphi : | Sélectionner tout |
TaskThread := TTaskThread.Create;
Code delphi : | Sélectionner tout |
TaskThread.Resume;
Code delphi : | Sélectionner tout |
TaskThread.Suspend;
Code delphi : | Sélectionner tout |
TaskThread.Terminate;
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; |
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. |
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>.
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. |
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; |
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; |
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.
L'interface de Lazarus étant en constante évolution, je propose une petite mise à jour pour cette question.
Se déplacer vers Projet / Options du projet.
Dans la liste, dérouler Options du compilateur :
- ouvrir la page Compilation et édition de liens :
- cocher Plus petit plutôt que plus rapide (-Os),
- cocher Lien intelligent (-CX),
- cocher Lier intelligemment (-XX) ;
- ouvrir la page Débogage :
- cocher Éliminer les symboles de l'exécutable (-Xs),
- décocher Generate info for the debugger (slower / increase exe-size)* ;
- ouvrir la page Verbosité :
- décocher Insérer le logo de FPC (-I).
(générer des informations pour le débogueur (ralentissement / augmentation de la taille)
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 çaLes 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 © 2024 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.