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

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 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.

SommaireInterface utilisateurGestion de messages Windows (5)
précédent sommaire suivant
 

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.

Mis à jour le 24 janvier 2014 Pierre Castelain

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;

Mis à jour le 24 janvier 2014 Nono40

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;

Mis à jour le 24 janvier 2014 lil_jam63 sjrd

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 1 : Pour les gestionnaires de messages des contrôles VCL, la constante entière doit être l'un des numéros d'identification de message Windows définis, avec les types enregistrement correspondants, dans l'unité Messages.
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;

Mis à jour le 24 janvier 2014 Pascal Jankowski

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 1 : Pour les gestionnaires de messages des contrôles VCL, la constante entière doit être l'un des numéros d'identification de message Windows définis, avec les types enregistrement correspondants, dans l'unité Messages.
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.

Mis à jour le 24 janvier 2014 Pascal Jankowski

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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.