FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 933, dernière mise à jour : 28 septembre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
Le mécanisme permettant à une fenêtre d'être informée qu'un ou plusieurs fichiers ont été lâchés sur elle est assez simple. Windows envoie un message de type WM_DROPFILES à la fenêtre pour lui signifier cette action. Ensuite, libre à elle de le traiter ou non. Le message envoyé (TWMDropFiles) contient un handle qui va nous permettre de récupérer le nombre et le nom des fichiers :
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 | unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } procedure DroppedFiles(var msg : TWMDropFiles) ; message WM_DROPFILES; public { Public declarations } end; var Form1: TForm1; implementation uses ShellAPI; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin { Nous devons tout d'abord informer le système que la fenêtre accepte le lâcher de fichiers. } DragAcceptFiles(self.Handle, True); end; procedure TForm1.FormDestroy(Sender: TObject); begin { Le système doit également être informé que la fenêtre n'accepte plus le lâcher de fichiers.} DragAcceptFiles(self.Handle, false); end; procedure TForm1.DroppedFiles(var msg: TWMDropFiles); var i: integer; nombreDeFichiers: integer; nomDuFichier: string; tailleDuBuffer: integer; begin { Ce gestionnaire de message est appelé lorsque l'utilisateur lâche un ou plusieurs fichiers sur la fenêtre. Nous devons commencer par récupérer le nombre de fichiers lâchés avant de les énumérer pour avoir leur nom.} // Récupération du nombre de fichiers déposés sur la fenêtre nombreDeFichiers:= DragQueryFile(msg.Drop, $FFFFFFFF, nil, 0); // Affichage des noms des fichiers dans un TListBox tailleDuBuffer:= MAX_PATH; SetLength(nomDuFichier, tailleDuBuffer); for i:= 0 to nombreDeFichiers - 1 do begin DragQueryFile(msg.Drop, i, PChar(nomDuFichier), tailleDuBuffer); ListBox1.Items.Add(nomDuFichier); end; end; end. |
Pour récupérer le texte du contrôle situé sous le curseur (de la souris), il faut procéder en deux étapes :
- récupérer le handle du composant se trouvant en dessous de la souris
- envoyer un message à ce composant pour récupérer son texte
La première étape nécessite de retrouver le handle du composant se situant en dessous de la position du curseur de la souris. Pour cela, on utilise la fonction WindowFromPoint.
Pour réaliser la seconde étape, il est nécessaire de connaître à l'avance la taille du texte afin allouer la mémoire nécessaire pour le stocker. Pour éviter d'avoir des scintillements, nous utilisons un timer pour mettre à jour le contenu de Edit1 (Edit1 contient le texte du contrôle).
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 | procedure TForm1.Timer1Timer(Sender: TObject); var Hand : THandle; c : PChar ; L : Cardinal; begin Hand:=WindowFRomPoint(Mouse.CursorPos); //handle du composant L := SendMessage(HAND,WM_GETTEXTLENGTH,0,0);//la longueur du texte If L<>0 Then Begin GetMem(C,L+1); //on alloue la mémoire. // L+1 parce que les chaînes sont à zéro terminal, il faut prévoir la place du #0 Try SendMessage(HAND,WM_GETTEXT,L+1,Integer(C));//on recupère le texte Edit1.Text:=c; Finally FreeMem(c); End; End Else Edit1.Text:=''; end; |
Si votre contrôle possède une propriété Transparent, il suffit de positionner celle-ci à True.
Dans le cas contraire, vous devez dériver un nouveau composant à partir de celui-ci, surcharger la méthode CreateParams et intercepter le message WM_ERASEBKGND comme ci-dessous :
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 | type TConteneur = class(TScrollBox) private { Déclarations privées } public { Déclarations publiques } constructor Create(AOwner: TComponent); override; procedure CreateParams(var Params: TCreateParams); override; procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; end; procedure TConteneur.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT; end; procedure TConteneur.WMEraseBkgnd(var Msg: TWMEraseBkgnd); begin SetBkMode(Msg.DC, TRANSPARENT); Msg.Result := 1; end; |
On peut interdire la fermeture d'une fiche à l'écran en utilisant le gestionnaire de messages de Windows et plus particulièrement en interceptant le Message WM_CLOSE de la façon suivante :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | TForm1 = class(TForm) private { Déclarations privées } procedure WMWindowClose(var Message: TWMWindowPosMsg); message WM_CLOSE; public { Déclarations publiques } end; implementation procedure TForm1.WMWindowClose(var Message: TWMWindowPosMsg); begin showMessage('Cette fiche ne peut être refermée'); end; |
Note 2 : Il est possible de réaliser le même effet en définissant le code de l'événement OnCloseQuery de la fiche et de la façon suivante :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 | procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin showMessage('Cette fiche ne peut être refermée'); CanClose := false; end; |
On peut interdire le déplacement d'une fiche à l'écran en utilisant le gestionnaire de messages de Windows et plus particulièrement en interceptant le Message WM_MOVE de la façon suivante :
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 | type TForm1 = class(TForm) private { Déclarations privées } procedure WMWindowMoving(var Message: TWMWindowPosMsg); message WM_MOVE; public end; implementation {$R *.DFM} procedure TForm1.WMWindowMoving(var Message: TWMWindowPosMsg); begin if not Visible then Exit; with Message do begin WindowPos.X:= Self.Left; WindowPos.Y:= Self.Top; Result:=0; end; end; end; |
Note 2 : Dans l'exemple ci-dessus, nous interdisons tout déplacement de la fiche à l'écran. Par contre si vous ne désirez que limiter les déplacements et les dimensionnements de la fiche nous vous renvoyons vers le code suivant, développé par Nono40.
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.