? Digao Dalpiaz News sur Telegram



25/03/2024 (version 6.7) ( Version minimale DZHTMLText: 6.3 )
16/03/2024 (version 6.6)
03/10/2024 (version 6.5)
23/02/2024 (version 6.4)
22/02/2024 (version 6.3)
20/02/2024 (version 6.2)
Lib{Platform}{Config} . Veuillez consulter vos chemins de bibliothèque.21/01/2024 (version 6.1) ( Version minimale DZHTMLText: 5.2 )
01/12/2024 (version 6.0) ( Version minimale DZHTMLText: 5.1 )
AVERTISSEMENT!!! Veuillez désinstaller complètement la version précédente en supprimant le dossier des composants de barrage précédent, car de nombreux fichiers ont changé leurs noms et emplacements.
12/11/2023 (version 5.2)
29/07/2023 (version 5.1)
04/11/2023 (version 5.0) ( Version minimale DZHTMLText: 4.0 )
DamUnitName09/12/2021 (version 4.16)
24/07/2021 (version 4.15)
13/06/2021 (version 4.14)
21/03/2021 (version 4.13)
14/03/2021 (version 4.12)
13/03/2021 (version 4.11)
03/05/2021 (version 4.10)
02/10/2021 (version 4.9)
18/12/2020 (version 4.8)
27/11/2020 (version 4.7)
11/11/2020 (version 4.6)
31/10/2020 (version 4.5)
27/10/2020 (version 4.4)
26/10/2020 (version 4.3) ( Version minimale DZHTMLText: 2.6 )
26/10/2020 (version 4.2)
18/10/2020 (version 4.1) ( Version minimale DZHTMLText: 2.04 )
14/10/2020 (version 4.0)
Remarques:
24/09/2020
08/11/2020
08/07/2020
08/03/2020
30/07/2020
21/07/2020
25/05/2020
<img:nnn> ). Il est nécessaire de mettre à jour le composant TDZHTMLText.05/03/2020
05/02/2020
DamParams pour remplir les paramètres lors de l'utilisation de méthodes de message DAM. Cela est nécessaire pour les versions Delphi ci-dessous XE8, car il n'avait pas de tableau dynamique comme support de type.System.ImageList de l'unité DAMLIST (Package de conception-temps), car n'est pas pris en charge par les versions Delphi ci-dessous XE8.AutoWidth dans TDAM. Maintenant, il existe une nouvelle propriété FixedWidth dans le composant TDAMMSG, vous pouvez donc spécifier la largeur personnalisée par message. Le composant conservera la fonction interne de largeur automatique si fixewwidth est nul (valeur par défaut).CenterButtons modifiée en False par défaut, car le nouveau style de dialogue Windows a des boutons alignés à droite.26/04/2020
<imgres:{resource_name}> . Ajoutez simplement l'image PNG aux ressources d'application et utilisez la balise pour les référencer dans le message. Cette implémentation se trouve dans le composant dzhtmltext, utilisé par DAM. Il vous suffit de mettre à jour votre composant DZHTMLText et cette fonction sera disponible. Veuillez lire la section DZHTMLText Image Tag pour plus d'informations. Important: les images ne seront pas visibles au moment de la conception .19/04/2020
10/07/2019
10/06/2019
10/05/2019
05/03/2019
02/11/2019
02/08/2019
02/07/2019
02/06/2019
02/05/2019
Ajoutez de nouvelles propriétés MessageColor et ButtonsColor sur le composant TDAM, pour permettre la personnalisation de la boîte de dialogue des messages.
Presque toutes les applications que vous créez, vous devez ajouter des dialogues de messages.
Delphi vous offre quelques options, comme ShowMessage, MessagedLG et MessageBox.
À mesure que votre projet grossir, les dialogues peuvent gâcher votre code, principalement si vous avez besoin d'écrire de nombreuses lignes dans les messages, avec de nombreux paramètres.
Si vous devez formater une partie du message, vous devez ajouter des étiquettes sous une forme personnalisée. C'est peut-être vraiment mauvais.
Regardez ce message:
begin
ShowMessage( ' The task was scheduled to run at the time: ' +aTime+ ' . ' +# 13 # 10 +
# 13 # 10 +
' Please, check the schedule at main board. ' +
' If you want to change schedule, find by ID # ' +IntToStr(IDNumber)+ ' . ' +# 13 # 10 +
# 13 # 10 +
' This task was created by user ' +aUserName+ ' . Only this user can edit this task profile. ' );
end ;Donc, je pense que c'est vraiment moche, tu ne penses pas? ?
Avec le barrage, vous pouvez écrire ce même message comme celui-ci : ?
begin
InfoTaskScheduled([aTime, IDNumber, aUserName]);
end ;Ce composant vous permet de gérer tous vos messages d'application dans un "conteneur". Vous pouvez créer la boîte de dialogue du message avec un créateur de l'assistant, vous permettant de formater le message (gras, italique, soulignement, nom de police, taille de la police, couleur d'arrière-plan de texte, alignement du centre, correction à droite, utilisation de l'alignement de l'onglet, liens cliquables, etc.).
Vous pouvez spécifier les boutons de message, l'icône, le titre de formulaire et bien plus encore.
Ensuite, vous spécifiez un nom pour le message. Ainsi, vous pouvez appeler le message dans n'importe quelle partie de votre application, simplement appeler la méthode par le nom du message!
Si vous spécifiez des paramètres dans le texte du message, lorsque vous appelez la méthode du message, vous pouvez spécifier des paramètres qui seront remplacés dans le texte.
Veuillez lire attentivement cette documentation pour savoir comment fonctionne ce composant. ?
Le conteneur de barrage répertoriant tous les messages créés, stockés sur DFM:

Le créateur de l'assistant de message, pour personnaliser la boîte de dialogue du message:

La boîte de dialogue du message :?

Le raccourci
CTRL+Cest disponible sur le formulaire de message pour copier le message dans le presse-papiers.
Vous devez d'abord installer mon composant dzhtmltext . Obtenez-le ici: https://github.com/digao-dalpiaz/dzhtmltext
Il s'agit d'une étiquette avec composant de formatage HTML. Les messages utilisent ce composant pour afficher le texte formaté.
Si vous installez dzhtmltext et DAM à la fois, en utilisant l'utilitaire d'installation de composants, après l'installation de dzhtmltext, vous devrez ouvrir et fermer Delphi avant d'installer DAM (cela est nécessaire juste pour mettre à jour le fichier de chemin de bibliothèque utilisé par MSBuild).
LibWin32Release .Prend en charge Delphi Xe3..Delphi 12
Accédez à Package Menu> Ouvrir le fichier de package (.lpk) et charger lazdampackage.lpk , puis cliquez sur Compiler .
Allez dans Package de menu> Ouvrez Fichier de package (.lpk) et chargez lazdamdesignpackage.lpk , puis cliquez sur Utiliser> Installer .
Pour le moment, les langues suivantes sont disponibles pour les messages:
La langue définit la légende des boutons dans les boîtes de dialogue du message, comme OK, annuler, oui, non, et le titre du formulaire, lorsque les informations, la question, l'avertissement, l'erreur et le message (personnalisé). Le titre du formulaire peut être modifié dans les propriétés du message et peut être automatiquement défini par d'autres objets, comme le titre du formulaire parent, le titre du formulaire principal et le titre d'application.
Vous pouvez ouvrir un problème pour m'envoyer une nouvelle traduction linguistique ou une traduction actuelle correcte
L'idée principale est de supprimer un TDAM dans la forme principale ou le module de données principal. Le TDAM est un conteneur qui a tout TDAMMSG (boîte de dialogue de message).
Pour gérer les messages, double-cliquez simplement sur le composant TDAM, ou cliquez avec le bouton droit et choisissez Gérer les messages DAM .
Mais comment appeler les messages?
Le TDAM a une propriété appelée DamUnitName . Ici, vous définissez un nom d'unité pour contenir toutes les méthodes de message. Lorsque vous utilisez l' unité de construction de fonction, le composant créera automatiquement cette unité dans le dossier du projet avec les méthodes basées dans tous les messages créés (avec le même nom que le nom de message).
Ainsi, dans n'importe quelle unité, vous ajoutez simplement une utilisation à cette unité et appelez le message que vous souhaitez par nom de message. Si le message a des paramètres, la méthode sera déclarée automatiquement demander des paramètres dans un tableau.
Oui, mais si je suis à la même classe (TForm / Tdatamodule), c'est les messages TDAM et TDAMMSG, si j'appelle la méthode par nom de message, le Delphi pense que je fais référence à l'objet de message!
C'est vrai, et à cause de cela, le composant a une fonction cachée d'objet. Il vous suffit de nommer le message en commençant par _ . Ainsi, le constructeur d'unités supprimera ce caractère pour nommer la méthode et le Delphi ne confondra pas les deux choses.
Je vous recommande de créer tous les messages nommés en commençant par le caractère _ .
Si vous utilisez l'assistant, le nom commencera automatiquement par ce caractère.
Il y a un bouton sur le gestionnaire de barrages pour masquer / détester tous les messages sélectionnés.
N'oubliez pas que chaque fois que vous modifiez les messages, vous devez reconstruire l'unité. Cliquez simplement sur l'unité de construction du bouton pour mettre à jour.
OK, mais je ne veux pas utiliser cette unité! Y a-t-il une autre méthode?
Oui bien sûr. Vous pouvez appeler le message en utilisant les fonctions de l'objet TDAMMSG. RunAsBool Run Dans ce cas, je vous recommande de ne pas masquer le message, afin que vous puissiez appeler par le nom de l'objet tel quel.
Mais je vous recommande honnêtement d'utiliser l'unité car cela aura beaucoup plus de sens.
Puis-je utiliser plus d'un conteneur TDAM dans mon application?
Oui, vous pouvez. Le TDAM vous permet de définir certaines configurations, comme la police et les sons du message. Vous pouvez donc avoir plus d'un TDAM pour avoir ce groupe de configuration. En plus de cela, vous pouvez utiliser divers TDAM pour regrouper les messages par catégorie. Vous pouvez non plus mettre TDAM sous des formes spécifiques, mais n'oubliez pas que le conteneur doit exister pour tirer les messages, bien sûr.
Si vous utilisez plus d'un TDAM, je vous recommande de définir le même DamUnitName à tous les composants TDAM, donc lorsque vous appelez le bouton de l'unité de construction , il sera généré une seule unité avec tous les messages de tous les conteneurs TDAM. Vous pouvez donc utiliser cette unité unique dans toutes les autres unités de votre projet pour appeler n'importe quel message.
Codes de résultats du message:
Si vous appelez le message par méthode de nom de message, la méthode sera une procédure si le message n'a qu'un seul bouton.
Si le message a deux ou trois boutons, la méthode sera une fonction. Lorsqu'il a deux boutons, la fonction renverra toujours la valeur booléenne, le rendement true si le premier bouton à gauche a été cliqué, ou renvoyant faux si le deuxième bouton (dernier bouton à droite) a été cliqué.
Lorsque le message a trois bouton, la fonction renvoie la valeur entière 1, 2 ou 3, selon le bouton appuyé dans la boîte de dialogue du message. Le premier bouton est celui de gauche; Le second est le bouton du milieu; Le troisième bouton est le bouton droit.
Ainsi, lorsque vous utilisez trois boutons, vous pouvez utiliser une variable ou même un case :
case QuestionSaveFile([aFileName]) of
1 : DoSaveFile; // Yes button
2 : { continue } ; // No button
3 : Abort; // Cancel button
end ; Si vous souhaitez utiliser des paramètres remplaçables dans le message, tapez simplement %p . Vous pouvez spécifier plusieurs paramètres dans le même message. Lorsque vous appelez le message, le tableau des paramètres est séquentiellement dans le même ordre qu'ils sont tapés dans le message.
Le tableau des paramètres est de type variant, ils n'ont donc pas besoin de conversions.
Exemple:
// TDamMsg Message property = 'This is a %p message number %p at time %p'
MyCustomMessage([ ' test ' , 123 , Now]);
// or
MsgInfo( ' This is a %p message number %p at time %p ' , [ ' test ' , 123 , Now]); ButtonsColor: TColor = définir la couleur d'arrière-plan de la zone des boutons dans la boîte de dialogue des messages.
ButtonsFont: TFont = définit la police de texte des boutons de dialogue
ButtonsFontColor: TAlphaColor = définit la couleur de la police de texte des boutons de dialogue (uniquement disponible dans l'environnement FMX)
CenterButtons: Boolean = Définir si les boutons au formulaire de message seront alignés au centre. Si cette propriété est fausse, les boutons seront alignés à droite de forme.
DamDefault: Boolean = définit si ce TDAM sera utilisé pour tirer des messages rapides (veuillez lire la section des messages rapides). Vous ne pouvez en avoir qu'un défini comme défaut dans l'application.
DamUnitName: String = Spécifiez le nom de l'unité à créer avec toutes les méthodes de message dans le dossier du projet. Ne spécifiez pas l'extension du fichier, car le composant terminera automatiquement le nom avec l'extension ".pas".
DialogBorder: Boolean = définit si la boîte de dialogue de la fenêtre de message contiendra des frontières. Vous pouvez désactiver cette propriété pour créer des thèmes de dialogue modernes.
DialogPosition: TDamDlgPosition = Définit la position de démarrage du formulaire de dialogue:
HandleExceptions: Boolean = définit ce TDAM pour gérer toutes les exceptions de l'application, affichant le message d'erreur avec la même boîte de dialogue que tous les autres messages de barrage. Un seul TDAM peut être défini pour gérer les exceptions dans l'application.
HideIcon: Boolean = si vrai, l'icône de la boîte de dialogue du message sera supprimée.
Images: TCustomImageList = vous permet de définir un ImageList, en utilisant Tag <img:idx> dans le texte du message, où idx est l'index d'image.
Language: TDamLanguage = Définit la langue utilisée par les boutons de message et le titre de formulaire de message. Lorsque vous placez une instance de composant TDAM, cette propriété sera initialisée en fonction de la langue actuelle du système. S'il n'y a pas de langue disponible selon le système, la langue anglaise sera définie. Cette propriété n'a aucune valeur par défaut, précisément car elle devrait stocker la langue définie.
MessageColor: TColor = définir la couleur d'arrière-plan de la zone de message sur la boîte de dialogue des messages.
MessageFont: TFont = définit la police texte des messages
MessageFontColor: TAlphaColor = définit la couleur de la police de texte des messages (uniquement disponible dans l'environnement FMX)
PlaySounds: Boolean = activer les sons du système lors de la montre des messages d'avertissement, de types de questions et d'erreurs.
OnLinkClick(Sender: TObject; Msg: TDamMsg; const Target: string; var Handled: Boolean; var CloseMsg: Boolean; var MsgResult: TDamMsgRes) Cet événement sera déclenché lorsque vous cliquez sur un lien contenu dans le message.
Par défaut, la cible de liaison sera automatiquement ouverte à l'aide de Shellexcute à partir de l'API Windows, donc si la cible est un lien Web, le navigateur par défaut ouvrira le lien, ou si la cible est un fichier système, le chemin sera exécuté / ouvert par Windows.
Si vous souhaitez contourner ce comportement, utilisez cet événement et définissez Handled sur True. Vous pouvez également définir CloseMsg sur TRUE et MsgResult Flag lorsque vous souhaitez fermer la fenêtre de message.
OnShowMessage(Sender: TObject; Msg: TDamMsg; var MsgText: String; var Handled: Boolean; var MsgResult: TDamMsgRes) tire avant que le message de barrage ne soit affiché, vous permettant d'intercepter les messages et même de contourner l'affichage du message, en utilisant un paramètre géré.
Avertissement! Si vous contournez un message d'exception, le composant ne soulèvera pas d'exception, en poursuivant l'exécution du code (sauf si vous créez votre propre exception à la procédure d'événement).
Button1: String = légende du bouton 1 sur la boîte de dialogue du message. Disponible lorsque les boutons = dbone / dbtwo / dbTree.
Button2: String = légende du bouton 2 sur la boîte de dialogue du message. Disponible lorsque les boutons = dbtwo / dbTree.
Button3: String = légende du bouton 3 sur la boîte de dialogue du message. Disponible lorsque les boutons = dbTree.
Buttons: TDamMsgButtons = Définit les boutons dans la boîte de dialogue Message:
CustomIcon: TIcon = définit une icône personnalisée à afficher dans la boîte de dialogue du message. Cette icône est indiquée uniquement lorsque l'icône = distom.
CustomTitle: String = définit un titre personnalisé pour le formulaire de message. Cette légende est uniquement utilisée puis title = dtCustom.
Dam: TDam = Définit le conteneur des barrages de ce message.
FixedWidth: Integer = définit une largeur fixe de la pièce de texte dans la fenêtre de message, en pixels. Si cette valeur est nul (par défaut), la largeur de la fenêtre sera automatiquement calculée en fonction du texte du message. Il y a une limite fixe minimale et maximale au formulaire de message (minimum = 300px / maximum = 75% de la largeur de l'écran - lorsque Android ou iOS, maximum = 95% de la largeur de l'écran) .
HelpContext: THelpContext = définit le contexte d'aide. Si cette propriété est définie, lorsque la boîte de dialogue du message affichera un bouton d'aide et ouvrira l'aide de l'application sur la cible de contexte. Il est également possible d'utiliser la clé F1.
HelpKeyword: String = définit le mot-clé d'aide. Si cette propriété est définie, lorsque la boîte de dialogue du message affichera un bouton d'aide et ouvrira l'aide de l'application sur la cible de mots clés. Il est également possible d'utiliser la clé F1.
Icon: TDamMsgIcon = définit l'icône dans la boîte de dialogue du message:
Message: String = le texte du message. Veuillez utiliser le créateur de l'assistant de message pour le formatage du texte ou lire la documentation HTLABEL. Les paramètres remplaçables sont définis par %p au texte du message. Utilisez les paramètres du tableau dans la méthode du message dans le même ordre que celle spécifiée dans le texte du message. Vous pouvez également spécifier le littéral {except} pour attraper le message d'exception actuel et remplacer à cette variable dans le texte du message (s'il vous plaît, voir des exemples d'exception).
Name: String = Message Nom de l'objet. Si le nom commence par le caractère _ , signifie que le message est masqué, donc le Delphi ne pense pas que vous appelez cet objet lorsque vous appelez la méthode de message ayant le même nom.
RaiseExcept: Boolean = Définissez ce message en tant que message de relance. Lorsque vous appelez ce message, il sera soulevé une exception avec le texte du message. Dans ce cas, vous devez utiliser au moins un TDAM avec HandleExceptions = True, sinon le message ne sera pas formaté avec la personnalisation des barrages.
SwapFocus: Boolean = par défaut, lorsqu'un message est tiré, le premier bouton de gauche commencera par la mise au point. Si vous activez cette option, ce message démarrera le dernier bouton Focus (le bouton à droite).
Title: TDamMsgTitle = définit le formulaire de message Titre
Tous les paramètres de message sont automatiquement "échappés" par composant.
Exemples:
procedure Test1 ;
begin
MyCustomMessage([ ' This will display <b> literal string ' , ' This will display "%p" literal string ' ]);
end ;
procedure Test2 ;
begin
MsgInfo( ' <b>First message parameter</b>: %p ' , [ ' Here I want to display literal <> characters ' ]);
end ;%p et {except} ).Si vous souhaitez afficher les caractères littéraux HTML dans la partie du message fixe, veuillez consulter les constantes d'échappement à la documentation DZHTMLText.
procedure MsgInfo ( const Msg: String; const Params: TDamParams = nil ); // message with Information icon
procedure MsgWarn ( const Msg: String; const Params: TDamParams = nil ); // message with Warning icon
procedure MsgError ( const Msg: String; const Params: TDamParams = nil ); // message with Error icon
function MsgQuest ( const Msg: String; const Params: TDamParams = nil ): Boolean; // message with Question mark icon
procedure MsgRaise ( const Msg: String; const Params: TDamParams = nil ); // message with Error icon (this raises an exception)
procedure ShowErrorMsg ; // show current error message
function CaptureErrorMsg : String; // get current error message Ces méthodes sont disponibles à l'échelle mondiale, à unité DamUnit ou au nom de l'unité que vous avez spécifié dans la propriété DamunitName.
Vous pouvez afficher des messages rapides directement sur le code, en tapant simplement les messages et les paramètres que vous aimez.
Ces méthodes utiliseront le conteneur TDAM qui est défini par défaut . Vous devez donc avoir un TDAM disponible avec la propriété
DamDefaultdéfinie sur True .
La fonction MsgQuest Résultats True Si le bouton YES a été enfoncé ou renvoie False si aucun bouton n'a été appuyé.
La méthode ShowErrorMsg montre l'exception actuellement. Vous pouvez l'utiliser comme try..except Block.
La fonction CaptureErrorMsg vous permet d'obtenir le message d'erreur à l'exception actuelle. Vous devez l'utiliser à Try..aus Block.
Exemple d'exception de catch:
try
DoSomeStuff;
except
ShowErrorMessage; // will show error message dialog using Dam concept
end ; try
DoSaveFile;
except
MsgError( ' Fatal error saving file: %p ' , [CaptureErrorMsg]);
end ; Si vous spécifiez littéral {except} au texte du message, cela sera remplacé par le message d'erreur actuel:
try
DoSaveFile;
except
MsgError( ' Fatal error saving file: {except} ' ); // don't need to use CaptureErrorMsg function!
end ;Vous pouvez également ré-cours une exception:
try
DoSaveFile;
except
raise EDam.Create( ' Fatal error saving file: {except} ' ); // re-raise a new exception with better text message
end ; Vous pouvez définir le paramètre RaiseExcept sur un objet de message DAM, donc lorsque le message est appelé, une exception sera soulevée.
N'oubliez pas: pour profiter des ressources du barrage, vous devez définir HandleExceptions sur l'objet de conteneur de barrage. Lorsqu'une exception est augmentée, Dam interceptera cette exception et affichera une boîte de dialogue personnalisée.
Exemples:
procedure TestException_Generic ;
begin
raise Exception.Create( ' This is my generic exception ' );
// HTML tags are NOT allowed when using generic exception
end ;
procedure TestException_DamRunTimeCreation ;
begin
raise EDam.Create( ' This is my <b>exception</b> with parameter %p ' , [ ' First parameter ' ]);
end ;
procedure TestException_DamDesignTimeCreation ;
begin
raise EDam.Create(MyCustomMessage, [ ' First parameter ' ]);
// MyCustomMessage represents a TDamMsg object created at design-time
end ;
procedure TestException_DamDesignTimeCreation_ByProperty ;
begin
_MyCustomMessage.Run([ ' First parameter ' ]);
// or
MyCustomMessage([ ' First parameter ' ]);
// MyCustomMessage represents a TDamMsg object created at design-time with property RaiseExcept=True
end ;
procedure TestException_Quick ;
begin
MsgRaise( ' This is my <b>exception</b> with parameter %p ' , [ ' First parameter ' ]);
// This method is for compatibility, but I recommend you to use "raise EDam.Create" instead.
end ;Il existe un fichier appelé damlang.ini (dossier de ressources), qui a toutes les chaînes utilisées sur le composant. Si vous souhaitez modifier du texte sur ce fichier, vous devrez exécuter " Build Dam Resource.bat " après cela. Ce lot créera un nouveau fichier " dam_resource.res " dans le dossier des composants racine.
Après cela, veuillez exécuter le " Afterbuild.bat " pour publier ce nouveau fichier de ressources dans le dossier "lib".
Si vous souhaitez ajouter une nouvelle langue, certaines modifications du code seront nécessaires. Alors, s'il vous plaît, ouvrez un nouveau problème et publiez les chaînes de langue souhaitées, puis je postulerai dans le composant.
Lorsque vous utilisez des versions Delphi ci-dessous XE8, dans toutes les méthodes de barrage qui contiennent le paramètre Tdamparams, vous ne pourrez pas passer directement le paramètre Dynamic Array.
Dans de tels cas, utilisez la fonction globale DamParams . Cette fonction est également disponible dans l'unité générée automatiquement du DAM.
Voici donc quelques exemples d'utilisation de la méthode du message du barrage dans ces versions:
// Quick message:
MsgInfo( ' This is a test message with parameter value = %p ' , DamParams([ 999 ]));
// Custom message:
MyCustomMessage(DamParams([ ' Parameter 1 ' , ' Parameter 2 ' ]));La conception de ce composant est survenue vers 2005 lorsque j'ai coché la nécessité de créer des boîtes de dialogue standardisées pour mes applications.
À ce moment-là, j'ai appelé le composant de "Meilleur dialogue", qui en portugais serait DM ( Diálogo Melhor ).
Après un certain temps, le projet est venu contenir une nouvelle structure avec le conteneur. Ensuite, j'ai renommé le composant "encore mieux dialogue", qui en portugais est le barrage ( Diálogo Ainda Melhor ). ?
Le nom du composant a donc fini par rester comme barrage.
Aujourd'hui, j'utilise ce composant dans presque toutes mes applications Delphi.