IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Pascal Discussion :

Fonction de substitution à MessageDlg


Sujet :

Contribuez Pascal

  1. #1
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut Fonction de substitution à MessageDlg
    Bonjour à tous.

    Comme je n'ai pas trouvé de code existant, voici une petite unité avec une fonction pouvant se substituer à MessageDlg si vous souhaitez personnaliser vos messages.

    Avantages:
    * Les boutons n'ont pas de Caption définie. C'est à vous de définir le texte du bouton.
    * Les images sont personnalisables (p.ex en liant l'unité à un fichier ressources).
    * Le type de message est re-implémenté. Ce qui permet d'ajouter d'autres types et donc d'autres images.
    * Possibilité de modifier le style et la couleur du texte du message.
    * Possibilité d'afficher un composant (TEdit, TComboBox...) ou un conteneur de composants (TPanel, TGroupBox). Le composant doit être préalablement créé. Ceci permet d'interagir avec d'éventuels événements sans quitter la boite de dialogue (ex: contrôle du texte d'un TEdit).

    Voici un exemple
    Nom : ThDialog.png
Affichages : 387
Taille : 49,0 Ko

    Et le code
    thdialogs.zip

    Merci d'avance pour vos remarques, suggestions...

    Cordialement
    Thierry

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Excellent, à la fois comme outil et comme exemple de code à étudier. Merci pour le partage.

    Personnellement, j'aurais bien aimé un exemple pour l'utilisation des ressources et des composants.

    Une autre suggestion serait de placer l'unité dans les sources Lazarus, ce qui vous permettrait de faire des modifications sans limite de temps.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir ou bonjour Roland.

    Je te remercie pour ton appréciation.

    Concernant l'utilisation des composants, j'ai donné, dans les commentaires de début d'unité, un exemple avec un TCheckBox.
    En voici un autre avec un TEdit : cette fonction pourrait d'ailleurs être intégrée dans l'unité, car elle peut remplacer InputQuery.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function MyInputText(ACaption, AMsg: string; X: integer = -1; Y: integer = -1): string;
    var
       Edit: TEdit;
    begin
       Edit:= TEdit.Create(nil);
       try
          Edit.Text:= '';
          Edit.Width:= 150;
          if MyMessage(ACaption, AMsg, mmtCustom, [mbOk, mbCancel],
                             ['Valider', 'Annuler'], mbOk, X, Y, Edit) = mrOk then
                Result:= Edit.Text
          else
               Result:= '';
       finally
         Edit.Free;
       end;
    end;
    Evidemment, si vous voulez créer un groupe de composants, dynamiquement, il y aura pas mal de lignes de code. Si cela vous rebute, une solution est de placer en design-time les composants qui seront utilisés sur une TForm que vous ne rendez jamais visible. Moins élégant, mais plus pratique. J'avoue l'avoir fait pour mon GroupBox dans la capture d'écran.

    A noter que j'ai utilisé dans la fonction le type mmtCustom qui, dans l'unité actuelle, n'affiche pas d'image.
    Pour en afficher une, il faut compléter la ligne 221.

    Pour ce faire, vous pouvez évidemment prendre la solution la plus simple qui consiste à ouvrir un fichier (bmp, png...) ou à assigner un bitmap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mmtCustom: Fimage.Picture.Bitmap.LoadFromFile('Monbitmap.bmp');
    mais ceci vous oblige à déployer les fichiers images avec votre application.

    Sinon, vous stockez les images dans un fichier ressources : un fichier .RC ou .LRS
    Un fichier RC est un simple fichier texte, mais on ne peut plus utiliser la fonction "LoadFromLazarusResource".
    Il faut l'inclure au début de l'unité (directive $R thdialogs.rc).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mmtCustom : Fimage.Picture.Bitmap.LoadFromResourceName('Image_Texte');
    Sinon, il faut créer un fichier LRS.
    Dans ce cas :
    1) dans la clause uses : ajouter l'unité "LRessources".
    2) à la fin de l'unité, créer la section initialization et ajouter {$I thdialogs.lrs}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mmtCustom : Fimage.Picture.LoadFromLazarusResource('Image_Texte')
    Image_Texte étant ici le nom du fichier (l'extension n'est pas obligatoire). Veillez à donner un nom assez compliqué pour ne pas faire de duplicate avec une resssource Lazarus déjà déclarée.

    Pour ceux qui ont du mal avec les fichiers ressources, ceci est un bon début :
    http://wiki.freepascal.org/Lazarus_Resources
    Attention : "Image.Picture.LoadFromResourceName" n'est pas reconnu par Lazarus (voir fin du lien).

    Remarque : vous pouvez ajouter d'autres types de messages : mmtCustom2, mmtCustom3... et ajouter d'autres images.

    [oubli] : Si vos images réclament de la transparence : pour les images Bitmap, il faut que la propriété Transparent de FImage = true (pas nécessaire pour les PNG).

    Cordialement
    Thierry

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/05/2011, 19h23
  2. Fonction avec substitution de code
    Par geekforever dans le forum Langage
    Réponses: 9
    Dernier message: 11/12/2009, 12h00
  3. fonction MessageDlg Delphi :changer la langue
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/06/2003, 17h44
  4. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo