begin process at 2010 02 10 06:23:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > DELPHI - AJOUT DE POLICES (APP. CONSOLE)

DELPHI - AJOUT DE POLICES (APP. CONSOLE)


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :AJOUT, POLICES, FONTS, AddFontResource, SendMessage Niveau :Débutant Date de création :25/11/2008 Date de mise à jour :04/12/2008 09:45:54 Vu / téléchargé :2 271 / 181

Auteur : FENETRES

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Parce qu'elles diffusent couramment des mises à jour par télétransmission, les DSI réclament souvent des programmes de type console.
Le mini projet actuel avait pour objet de créer un outil permettant d'uniformiser à distance la liste des polices installées sur les postes clients.

Options en ligne de commande :
...\Win32_AddFonts.exe [Adresse du répertoire source] [/M]
Comme indiqué ci-avant, l'adresse du répertoire source peut être déclarée en ligne de commande. Par défaut, un répertoire nommé « Fonts » sera recherché à l'emplacement de l'exécutable. Le second paramètre optionnel correspond à une option d'affichage d'un message d'information précisant le nombre de polices ajoutées ou l'erreur rencontrée.

Source

  • program Win32_AddFonts;
  • {*******************************************************}
  • { }
  • { FENETRES pour Codes-Sources }
  • { Autre publication interdite }
  • { }
  • { Programme de type console d'ajout de polices }
  • { }
  • {*******************************************************}
  • {$APPTYPE CONSOLE}
  • uses
  • Windows, SysUtils, Shlobj, Messages;
  • var
  • FullPath, SrceFolder, DestFolder: string;
  • SrceFile, DestFile: string;
  • Info: TSearchRec;
  • FontsAdded: Integer;
  • isMsgDisplayed: boolean;
  • const
  • FOLDER_NAME_FONTS='Fonts';
  • PATH_DELIMITER='\';
  • OPTION_MSG='/M';
  • function SpecialFolder(AFolder: Integer): string;
  • { Retourne un répertoire système Windows }
  • var
  • PItem: pItemIDList;
  • SpecialPath: array[0..MAX_PATH] of Char;
  • begin
  • if (SHGetSpecialFolderLocation(GetActiveWindow, AFolder, PItem)=0) then begin
  • SHGetPathFromIDList(PItem, SpecialPath);
  • Result:=SpecialPath;
  • end else
  • Result:='';
  • end;
  • begin
  • { Initialisation des variables }
  • FullPath:=''; SrceFolder:=''; DestFolder:='';
  • SrceFile:=''; DestFile:=''; FontsAdded:=0;
  • isMsgDisplayed:=False;
  • try
  • { Option d'affichage en ligne de commande }
  • case ParamCount of
  • 1: if (ParamStr(1)=OPTION_MSG) then isMsgDisplayed:=True;
  • 2: if (ParamStr(2)=OPTION_MSG) then isMsgDisplayed:=True;
  • end;
  • { Répertoire source }
  • if (ParamCount>0) and (ParamStr(1)<>OPTION_MSG) and (DirectoryExists(ParamStr(1))) then
  • FullPath:=ParamStr(1)
  • else
  • FullPath:=ExtractFilePath(ParamStr(0)) + FOLDER_NAME_FONTS;
  • if not DirectoryExists(FullPath) then begin
  • // Le code de sortie est égal à 251 (le répertoire source est manquant)
  • ExitCode:=251;
  • // Supprimer les caractères accentués sous MS-DOS (OEM)
  • raise Exception.Create('le repertoire source est manquant.');
  • end else
  • SrceFolder:=FullPath;
  • { Répertoire de destination }
  • FullPath:='';
  • FullPath:=SpecialFolder(CSIDL_FONTS);
  • if not DirectoryExists(FullPath) then begin
  • // Le code de sortie est égal à 253 (le répertoire de destination est manquant)
  • ExitCode:=253;
  • raise Exception.Create('le repertoire de destination est manquant.');
  • end else
  • DestFolder:=FullPath;
  • { Copie des fichiers (droit d'accès) et ajout des polices }
  • if (FindFirst(SrceFolder + PATH_DELIMITER + '*.ttf', faAnyFile, Info)=0) then begin
  • try
  • repeat
  • if (Info.Attr and faDirectory)=0 then
  • DestFile:= DestFolder + PATH_DELIMITER + Info.FindData.cFileName;
  • if not FileExists(DestFile) then begin
  • SrceFile:=SrceFolder + PATH_DELIMITER + Info.FindData.cFileName;
  • if CopyFile(PChar(SrceFile), PChar(DestFile), False) then
  • if (AddFontResource(PChar(SrceFile))=0) then begin
  • // Supprimer le fichier copié sans création d'une nouvelle police
  • if FileExists(DestFile) then DeleteFile(DestFile);
  • // Le code de sortie est égal à 255 (l'ajout d'une police a échoué)
  • ExitCode:=255;
  • raise Exception.CreateFmt('l''ajout de la police %s a echoue.',[Info.Name]);
  • end else
  • inc(FontsAdded)
  • else begin
  • // Le code de sortie est égal à 254 (la copie d'un fichier a échoué)
  • ExitCode:=254;
  • raise Exception.CreateFmt('la copie du fichier %s a echoue.',[Info.Name]);
  • end;
  • end;
  • until FindNext(Info)<>0;
  • finally
  • FindClose(Info);
  • end;
  • // Diffusion de la mise à jour pour toutes les applications ouvertes
  • if (FontsAdded>0) then SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
  • end else begin
  • // Le code de sortie est égal à 252 (le répertoire source est vide)
  • ExitCode:=252;
  • raise Exception.Create('le repertoire source est vide.');
  • end;
  • { Nombre de polices ajoutées }
  • if isMsgDisplayed then
  • case FontsAdded of
  • 0: WriteLn(ExtractFileName(ParamStr(0)), ' : aucune police n''a ete ajoutee.');
  • 1: WriteLn(ExtractFileName(ParamStr(0)), ' : seule la police ', ExtractFilename(DestFile), ' a ete ajoutee.');
  • else
  • WriteLn(ExtractFileName(ParamStr(0)), ' : ', IntToStr(FontsAdded), ' polices ont ete ajoutees.');
  • end;
  • except
  • on E:Exception do begin
  • if isMsgDisplayed then WriteLn('Erreur : ', E.Message);
  • // Le code de sortie sera égal à 250 si une erreur inattendue se produit
  • if (ExitCode=0) then ExitCode:=250;
  • end;
  • end;
  • end.
program Win32_AddFonts;

{*******************************************************}
{                                                       }
{             FENETRES pour Codes-Sources               }
{             Autre publication interdite               }
{                                                       }
{   Programme de type console d'ajout de polices        }
{                                                       }
{*******************************************************}

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, Shlobj, Messages;

var
  FullPath, SrceFolder, DestFolder: string;
  SrceFile, DestFile: string;
  Info: TSearchRec;
  FontsAdded: Integer;
  isMsgDisplayed: boolean;

const
 FOLDER_NAME_FONTS='Fonts';
 PATH_DELIMITER='\';
 OPTION_MSG='/M';

function SpecialFolder(AFolder: Integer): string;
{ Retourne un répertoire système Windows }
var
  PItem: pItemIDList;
  SpecialPath: array[0..MAX_PATH] of Char;
begin
  if (SHGetSpecialFolderLocation(GetActiveWindow, AFolder, PItem)=0) then begin
    SHGetPathFromIDList(PItem, SpecialPath);
    Result:=SpecialPath;
  end else
    Result:='';
end;

begin
  { Initialisation des variables }
  FullPath:=''; SrceFolder:=''; DestFolder:='';
  SrceFile:=''; DestFile:=''; FontsAdded:=0;
  isMsgDisplayed:=False;

  try
    { Option d'affichage en ligne de commande }
    case ParamCount of
      1: if (ParamStr(1)=OPTION_MSG) then isMsgDisplayed:=True;
      2: if (ParamStr(2)=OPTION_MSG) then isMsgDisplayed:=True;
    end;

    { Répertoire source }
    if (ParamCount>0) and (ParamStr(1)<>OPTION_MSG) and (DirectoryExists(ParamStr(1))) then
      FullPath:=ParamStr(1)
    else
      FullPath:=ExtractFilePath(ParamStr(0)) + FOLDER_NAME_FONTS;
    if not DirectoryExists(FullPath) then begin
      // Le code de sortie est égal à 251 (le répertoire source est manquant)
      ExitCode:=251;
      // Supprimer les caractères accentués sous MS-DOS (OEM)
      raise Exception.Create('le repertoire source est manquant.');
    end else
      SrceFolder:=FullPath;

    { Répertoire de destination }
    FullPath:='';
    FullPath:=SpecialFolder(CSIDL_FONTS);
    if not DirectoryExists(FullPath) then begin
      // Le code de sortie est égal à 253 (le répertoire de destination est manquant)
      ExitCode:=253;
      raise Exception.Create('le repertoire de destination est manquant.');
    end else
      DestFolder:=FullPath;

    { Copie des fichiers (droit d'accès) et ajout des polices }
    if (FindFirst(SrceFolder + PATH_DELIMITER + '*.ttf', faAnyFile, Info)=0) then begin
      try
        repeat
          if (Info.Attr and faDirectory)=0 then
            DestFile:= DestFolder + PATH_DELIMITER + Info.FindData.cFileName;
          if not FileExists(DestFile) then  begin
            SrceFile:=SrceFolder + PATH_DELIMITER + Info.FindData.cFileName;
            if CopyFile(PChar(SrceFile), PChar(DestFile), False) then
              if (AddFontResource(PChar(SrceFile))=0) then begin
                // Supprimer le fichier copié sans création d'une nouvelle police
                if FileExists(DestFile) then DeleteFile(DestFile);
                // Le code de sortie est égal à 255 (l'ajout d'une police a échoué)
                ExitCode:=255;
                raise Exception.CreateFmt('l''ajout de la police %s a echoue.',[Info.Name]);
              end else
                inc(FontsAdded)
            else begin
              // Le code de sortie est égal à 254 (la copie d'un fichier a échoué)
              ExitCode:=254;
              raise Exception.CreateFmt('la copie du fichier %s a echoue.',[Info.Name]);
            end;
          end;
        until FindNext(Info)<>0;
      finally
        FindClose(Info);
      end;
      // Diffusion de la mise à jour pour toutes les applications ouvertes
      if (FontsAdded>0) then SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    end else begin
      // Le code de sortie est égal à 252 (le répertoire source est vide)
      ExitCode:=252;
      raise Exception.Create('le repertoire source est vide.');
    end;

    { Nombre de polices ajoutées }
    if isMsgDisplayed then
      case FontsAdded of
         0: WriteLn(ExtractFileName(ParamStr(0)), ' : aucune police n''a ete ajoutee.');
         1: WriteLn(ExtractFileName(ParamStr(0)), ' : seule la police ', ExtractFilename(DestFile), ' a ete ajoutee.');
      else
        WriteLn(ExtractFileName(ParamStr(0)), ' : ', IntToStr(FontsAdded), ' polices ont ete ajoutees.');
      end;

  except
    on E:Exception do begin
      if isMsgDisplayed then WriteLn('Erreur : ', E.Message);
      // Le code de sortie sera égal à 250 si une erreur inattendue se produit
      if (ExitCode=0) then ExitCode:=250;
    end;
  end;
end.

 Conclusion

Compiler le programme et renommer le répertoire source (Fonts_00 en Fonts) pour exécuter le fichier batch (test.bat) d'ajout de polices (cf. capture).
Par rapport à la source, le fichier « dpr » comprend en plus une fonction qui permet de filter les fichiers à traiter par leurs extensions (ttf, fon, otf...).
Le fichier « DUMMY.TTF » est un faux fichier de fontes permettant de tester la suppression d'un éventuel fichier copié sans création d'une nouvelle police.

Rappel : l'instruction halt provoque une sortie anormale sans libération de la mémoire ni finalisation.

Bibliographie Microsoft (MSDN) :
  1. Recherche du répertoire système « Fonts »
   - Fonction « SHGetSpecialFolderLocation »
     http://msdn.microsoft.com/en-us/library/bb762203(V S.85).aspx
   - Fonction « SHGetPathFromIDList »
     http://msdn.microsoft.com/en-us/library/bb762194(V S.85).aspx
  2. Ajout d'une police
   - Fonction « AddFontResource » (Windows GDI)
     http://msdn.microsoft.com/en-us/library/ms534231.a spx
   - Fonction « SendMessage »
     http://msdn.microsoft.com/en-us/library/ms644950(V S.85).aspx
  3. Informations sur les codes erreurs (MS-DOS)
     http://support.microsoft.com/kb/74463

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Win32 AddFonts
    •   Projet
      •   Fonts
        • DUMMY.TTF
        • raavi.ttfTélécharger ce fichier [Réservé aux membres club]57 348 octets
        • RAGE.TTFTélécharger ce fichier [Réservé aux membres club]132 600 octets
        • RAVIE.TTFTélécharger ce fichier [Réservé aux membres club]74 416 octets
        • REFSAN.TTFTélécharger ce fichier [Réservé aux membres club]220 172 octets
        • REFSPCL.TTFTélécharger ce fichier [Réservé aux membres club]53 288 octets
        • ROCC____.TTFTélécharger ce fichier [Réservé aux membres club]55 824 octets
        • ROCCB___.TTFTélécharger ce fichier [Réservé aux membres club]59 444 octets
        • ROCK.TTFTélécharger ce fichier [Réservé aux membres club]72 272 octets
        • ROCKB.TTFTélécharger ce fichier [Réservé aux membres club]68 780 octets
        • ROCKBI.TTFTélécharger ce fichier [Réservé aux membres club]73 700 octets
        • ROCKEB.TTFTélécharger ce fichier [Réservé aux membres club]49 168 octets
        • ROCKI.TTFTélécharger ce fichier [Réservé aux membres club]76 756 octets
      • test.batTélécharger ce fichier [Réservé aux membres club]Voir ce fichier112 octets
      • Win32_AddFonts.dprTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 120 octets

Télécharger le zip


 Historique

25 novembre 2008 17:28:23 :
Description
25 novembre 2008 17:30:25 :
Conclusion
25 novembre 2008 17:31:23 :
Faute de frappe
25 novembre 2008 17:41:44 :
Idem
25 novembre 2008 19:50:00 :
Nom initial du répertoire source
25 novembre 2008 20:05:52 :
Description
26 novembre 2008 08:26:42 :
Présentation
26 novembre 2008 09:35:03 :
Description (adresse du répertoire source)
26 novembre 2008 10:09:09 :
Faute de frappe
26 novembre 2008 11:07:32 :
Zip
26 novembre 2008 11:09:52 :
Erreur de manip
26 novembre 2008 17:29:14 :
Libération de la mémoire
26 novembre 2008 17:42:40 :
Zip
26 novembre 2008 21:32:17 :
Conclusion (rappel)
26 novembre 2008 23:02:08 :
Commentaire
26 novembre 2008 23:13:17 :
CS (commentaire)
27 novembre 2008 09:36:51 :
Rappel (instruction halt)
27 novembre 2008 11:26:20 :
Code source (instruction ExitCode)
27 novembre 2008 14:20:26 :
Faute de frappe
27 novembre 2008 15:21:36 :
Commentaire CS (code de sortie =1)
27 novembre 2008 16:08:56 :
CS avec msg d'erreur
27 novembre 2008 16:46:10 :
Nouvelle capture
27 novembre 2008 16:51:41 :
Erreur manip.
27 novembre 2008 16:56:50 :
Faute de frappe
27 novembre 2008 17:06:28 :
Trop maladroit !
27 novembre 2008 18:13:33 :
Erreur inattendue = 250 (en dehors de l'intervalle MS-DOS)
28 novembre 2008 10:35:30 :
Ajout d'une option en ligne de commande (afficher message)
28 novembre 2008 10:42:05 :
Zip
28 novembre 2008 10:53:41 :
Err. de frappe
28 novembre 2008 11:11:19 :
Description (options)
28 novembre 2008 12:28:25 :
Présentation
28 novembre 2008 12:37:10 :
Idem
28 novembre 2008 14:14:33 :
Capture avec message
28 novembre 2008 16:17:31 :
dpr sans gestionnaire de mémoire
01 décembre 2008 13:17:56 :
fichier dpr plus générique que la source (ajout de la fonction isListedExt)
01 décembre 2008 14:04:14 :
dpr (erreur de frappe)
01 décembre 2008 14:11:48 :
Idem
01 décembre 2008 15:34:14 :
Conclusion (source & dpr)
01 décembre 2008 16:12:51 :
Condition d'affectation pour code de sortie = 250 (erreur inattendue)
02 décembre 2008 15:07:17 :
MAJ : suppression de la copie du fichier. Sur les versions actuelles de Windows, la copie du fichier déclenche l'ajout de polices.
02 décembre 2008 15:28:03 :
Err manip
02 décembre 2008 16:24:01 :
MAJ précédente erronée. La copie physique des fichiers est nécessaire.
02 décembre 2008 16:38:32 :
Numérotation
02 décembre 2008 16:44:50 :
Trop maladroit
02 décembre 2008 16:48:07 :
zip
02 décembre 2008 17:32:42 :
Purée... j'ai enfin compris. Y pas à dire, sans Microsoft, on s'ennuierait ! Cas particuliers d'un fichiers qui possèderait la bonne extension mais ne serait pas un fichier de fontes (ex. DUMMY.TTF).
02 décembre 2008 17:35:26 :
Purée... j'ai enfin compris. Y pas à dire, sans Microsoft, on s'ennuierait ! Cas particuliers d'un fichiers qui possèderait la bonne extension mais ne serait pas un fichier de fontes (ex. DUMMY.TTF).
02 décembre 2008 19:12:00 :
Condition de branchement. A force, j'en ai perdu la boule !
02 décembre 2008 23:49:34 :
Suppression du fichier copié (fct de la version de Windows) si aucune ressource ajoutée
03 décembre 2008 00:03:20 :
Commentaire CS
03 décembre 2008 12:16:56 :
Conclusion (fichier DUMMY.TTF)
03 décembre 2008 14:45:26 :
Msg : nbre de polices ajoutées
03 décembre 2008 14:58:32 :
Conclusion
03 décembre 2008 15:31:33 :
Présentation
03 décembre 2008 16:25:26 :
Conclusion
04 décembre 2008 09:45:54 :
Description (second paramètre)

 Sources du même auteur

Source avec Zip Source avec une capture DELPHI : SHA-1 EN MODE CHIFFREMENT (SHACAL)
Source avec Zip Source avec une capture DELPHI - CREATION D'UNE COLLECTION D'ENREGISTREMENTS SAGE (T...
Source avec Zip Source avec une capture DELPHI - CHEMIN D'ACCÈS DE STYLE ELLIPTIQUE (GET PATH ELLIPS...
Source avec Zip Source avec une capture DELPHI : PROCEDURE SPLIT SIMILAIRE A LA FONCTION EPONYME EN ...
Source avec Zip Source avec une capture DELPHI - CRÉATION D'UNE FEUILLE DE CALCUL EXCEL (CONTRÔLE TO...

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VFONTS : OUTIL DE VISUALISATION DES POLICES CARACTÈRES INSTA... par bluemandfr
Source avec Zip Source avec une capture AJOUT / SUPPRESSION ODBC SOUS DELPHI par lguez

Commentaires et avis

Commentaire de FENETRES le 26/11/2008 13:46:19

Pas de question ni commentaire... tout est clair et limpide ?

« Etre ignorant de son ignorance est la maladie de l'ignorant. »
Amos Bronson Alcott

Commentaire de Forman le 26/11/2008 15:01:45

> « Etre ignorant de son ignorance est la maladie de l'ignorant. »
Tiens, ça je ne le savais pas...

Si j'ai bien compris ça installe un certain nombre de polices TrueType situées dans un répertoire donné, c'est bien ça? Le code a l'air propre et bien écrit en tout cas (même si un peu trop court à mon gout :-)

Une petite remarque: la procédure Halt est un peu brutale, et peut causer des "memory leaks". Exemple: après ton FindFirst, s'il y a un problème, tu vas quitter avant d'avoir fait FindClose.

À mon avis il doit être possible de réécrire ta procédure principale en utilisant la variable ReturnValue (qui permet de spécifier une valeur de retour pour ton application) et des branchements judicieusement placés pour libérer toutes les resources, même en cas d'échec.

Une autre solution aussi souvent utilisée en Delphi est l'utilisation des exceptions, et try...finally. Exemple:

program Win32_AddFonts;

{*******************************************************}
{                                                       }
{             FENETRES pour Codes-Sources               }
{             Autre publication interdite               }
{                                                       }
{   Programme de type console d'ajout de polices        }
{                                                       }
{*******************************************************}

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, Shlobj, Messages;

var
  FullPath, SrceFolder, DestFolder: string;
  SrceFile, DestFile: string;
  Info: TSearchRec;
  FontsAdded: Integer;

const
FOLDER_NAME_FONTS='Fonts';
PATH_DELIMITER='\';

function SpecialFolder(AFolder: Integer): string;
{ Retourne un répertoire système Windows }
var
  PItem: pItemIDList;
  SpecialPath: array[0..MAX_PATH] of Char;
begin
  if (SHGetSpecialFolderLocation(GetActiveWindow, AFolder, PItem)=0) and SHGetPathFromIDList(PItem, SpecialPath) then
    Result:=SpecialPath
  else
    raise Exception.Create('Impossible de trouver le répertoire système des polices');
end;

begin
  { Initialisation des variables }
  FullPath:=''; SrceFolder:=''; DestFolder:='';
  SrceFile:=''; DestFile:=''; FontsAdded:=0;

  try
    { Répertoire source }
    if (ParamCount=1) and (DirectoryExists(ParamStr(1))) then
      FullPath:=ParamStr(1)
    else
      FullPath:=ExtractFilePath(ParamStr(0)) + FOLDER_NAME_FONTS;
    if not DirectoryExists(FullPath) then begin
      { Le code de sortie est égal à 251 (le répertoire source est manquant.) }
      ExitCode:=251;
      raise Exception.Create('Le répertoire source est manquant');
    end;
    SrceFolder:=FullPath;

    { Répertoire de destination }
    FullPath:='';
    try
      FullPath:=SpecialFolder(CSIDL_FONTS);
      if not DirectoryExists(FullPath) then
        raise Exception.Create('Le répertoire de destination est manquant');
    except
      { Le code de sortie est égal à 253 (le répertoire de destination est manquant.) }
      ExitCode:=253;
      raise;
    end;
    DestFolder:=FullPath;

    { Copie des fichiers (droit d'accès) et ajout des polices }
    if (FindFirst(SrceFolder + PATH_DELIMITER + '*.ttf', faAnyFile, Info)=0) then begin
      try
        repeat
          if (Info.Attr and faDirectory)=0 then begin
            DestFile:= DestFolder + PATH_DELIMITER + Info.FindData.cFileName;
            if not FileExists(DestFile) then begin
              SrceFile:=SrceFolder + PATH_DELIMITER + Info.FindData.cFileName;
              if not CopyFile(PChar(SrceFile), PChar(DestFile), False) then begin
               { Le code de sortie est égal à 254 (la copie d'un fichier a échoué.) }
                ExitCode:=254;
                raise Exception.CreateFmt('La copie du fichier %s a échoué',[Info.Name]);
              end;
              if AddFontResource(PChar(DestFile))=0 then begin
                { Le code de sortie est égal à 255 (l'ajout d'une police a échoué.) }
                ExitCode:=255;
                raise Exception.CreateFmt('L''ajout de la police %s a échoué',[Info.Name]);
              end;
              inc(FontsAdded);
            end;
          end;
        until FindNext(Info)<>0;
      finally
        FindClose(Info);
      end;
      { Diffusion de la mise à jour pour toutes les applications ouvertes }
      if (FontsAdded>0) then SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    end else begin
      { Le code de sortie est égal à 252 (le répertoire source est vide.) }
      ExitCode:=252;
      raise Exception.Create('le répertoire source est vide');
    end;
  except
    on e:Exception do begin
      { Le programme retourne 1 (erreur inattendue) }
      if ExitCode=0 then
        ExitCode:=1;
      WriteLn('Erreur : ',e.Message);
    end else begin
      ExitCode:=1;
      WriteLn('Erreur inattendue');
    end;
  end;
end.

Commentaire de FENETRES le 26/11/2008 15:41:13

Grâce à toi, me voilà guérit d'un mal que j'ignorais !

Effectivement, je n'avais pas vu le problème que tu invoques à juste titre (FindFirst, FindClose).

Merci de ta contribution

PS : je me souviens avoir hésité à l'époque entre l'utilisation de ExitCode et Halt sans avoir vu le risque d'une fuite de mémoire.

Commentaire de FENETRES le 26/11/2008 16:19:55

Je n'ai plus le temps maintenant de corriger la source et de supprimer ce risque potentiel. Ce sera pour ce soir ou demain. Le code de Forman faisait référence ce n'est pas bien urgent.
Par contre dans mon cas, à part le code de sortie, l'erreur doit être silencieuse.

Cordialement,

Commentaire de Forman le 26/11/2008 16:45:59

Dans la version que j'ai mise plus haut l'exception sera silencieuse (le try...except global s'en charge). Tu peux aussi ôter les 2 WriteLn à la fin si tu veux vraiment que rien ne s'affiche.

A bientôt

Commentaire de FENETRES le 26/11/2008 17:33:23

J'ai fait au plus simple en ajoutant l'instruction FindClose avant la sortie anormale mais je retiens la leçon. Il est toujours dangereux de s'écarter des chemins habituels.

Encore merci

Commentaire de FENETRES le 26/11/2008 18:23:49

L'utilisation de l'instruction halt faisant prendre des risques inutiles, je le répète si besoin, la syntaxe proposée par Forman doit être adoptée.

Cordialement,

Commentaire de FENETRES le 27/11/2008 10:13:10

Forman,

  Le danger potentiel est encore plus important que je l'imaginais. En activant le gestionnaire de mémoire, j'ai des fuites de mémoire lorsque le répertoire source est manquant (code de sortie = 251). Cette instruction halt est à proscrire purement et simplement !

Je corrige une nouvelle fois la source en adoptant ExitCode définitivement.

Merci d'avoir éclairé ma lanterne à ce point

Commentaire de FENETRES le 28/11/2008 11:19:19

Autrement dit, même la mémoire allouée aux variables n'est pas libérée.

Sinon dans sa dernière mise à jour, hormis la suppression de l'instruction halt, le projet a été enrichi avec l'ajout d'une option affichage (/M).

Commentaire de FENETRES le 28/11/2008 14:54:36

En raison de l'aimable collaboration de Forman, j'ai fait l'effort de poster une mise à jour irréprochable. J'espère avoir réussi.

Commentaire de Forman le 28/11/2008 15:18:31

Wow ça fait un sacré paquet de mises à jour, bon boulot!

À bientôt et bon courage pour la suite.

Commentaire de FENETRES le 28/11/2008 15:28:57

Les idées d'amélioration me sont venues dans le désordre. Entre nous, je doute que ma prochaine mission me laisse autant de temps à consacrer à codes-sources alors j'en ai profité gouluement.

A bientôt

Commentaire de FENETRES le 02/12/2008 17:56:55

Explication sur le dernière MAJ :
   1. La copie physique d'un fichier est nécessaire. Sans elle, il n'est pas visible dans le répertoire système Fonts.
   2. Malgré sa copie physique effective, une erreur de copie sera retournée si vous tentez de copier un fichier possédant une fausse extension de police (ex. DUMMY.TTF).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Help 2 ! Ajout de retour chariot ! [ par toto ] Salut,Comment faire pour ajouter un retour chariot qd je veux dans un memo SVP ?MErci !toto Mon premier ajout de source !! :o) [ par XJapan ] Voila !!!!! J'ai deposer ma premiere Source !!!!!! :o))))))Mais je me demande si y a pas un soucie avec l'envoie de fichier zip... Parce k'il n'est pa ajout de champs a une requete [ par tgomas ] Bonjour,je voudrais pouvoir modifier une requete dynamiquement. J'arrive a modifier la requete sql, mais je n'arrive pas a ajouter des champs à mon ob Ajout de ligne sur DBGrid [ par webazard ] Bonjour, Voila je commence tout juste sur dephi et je voudrais savoir comment ajouter de lignes dans un DBGrid ou me dire quoi d'autre utiliser, mon s ajout dynamique de menuitems [ par bgK ] Salut à tous,J'ai créé un prog utilisant des plugins et qui ajoute un item dans le menu à chaque plugin trouvé.mais je ne sais pas comment faire pour Ajout dynamique de ToolButton [ par SuperNoizo ] J'aimerais ajouter des ToolButtons pendant l'execution de mon soft qq1 pourrait-il m'aider ?MerciSupeRNoiZo Paramètres par adresse et non par valeur [ par Bruto ] J'utilise qq fonctions et procédures qui ont pour but de de générer un numéro CLSID.Le prob est que je n'arrive pas à passer mes paramêtres par adress ajout/suppression de programme [ par MyC ] Bonjour, je cherche le moyen de pouvoir ajouter un élément dans "ajout/suppression de programme" à partir de code delphi, lors de l'installation d'un URGENT ! Dbase ajout d'enrgistrement [ par kristof708 ] sltComment puis je faire pour ajouter un enregistrement a un endroit precis de ma Dbase Envoi d'un message VK_TAB (Tabulation) [ par seb92 ] BonjourJ'essaye d'envoyer une tabulation à une fenêtre dont je connais le handle. Si les caractères alpha-numériques fonctionnent, il n'en est pas de


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales