Bonjour,
@ Roland : oui, c'était ma première idée, mais celle de Cirec a plus de "classe" !
Je serai d'avis de mettre la solution de Cirec dans la Faq
A+
Charly
Bonjour,
@ Roland : oui, c'était ma première idée, mais celle de Cirec a plus de "classe" !
Je serai d'avis de mettre la solution de Cirec dans la Faq
A+
Charly
Bonjour à tous,
j'étais loin de me douter que ça vous intéresserait, en tout cas merci pour vos appréciations
pour le compo ça peut se faire mais je me demande si c'est bien utile
pour la FAQ pourquoi pas
en attendant j'ai mis le tout dans une unité à part ce qui permet une compatibilité de D7 à Tokyo 10.2
les détails et autres explications se trouvent dans l'unité sous forme de commentaires.
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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 unit crCueBanner; interface uses Windows {$if CompilerVersion < 20.00} // à partir de D2009 vous devez activer les styles les options du projet , XPMan {$else} // à partir de D2009 les fonctions "Edit_SetCueBannerText" & "Edit_GetCueBannerText" // existent déjà. Nous les utiliserons par redirection. , CommCtrl {$ifend}; // https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb761703(v=vs.85).aspx // fonction oublié par Delphi permettant le choix ShowOnFocus: Boolean // qui permet ou non de voir le Cue Banner Text quand l'edit à le focus // active pour toutes les versions de Delphi function Edit_SetCueBannerTextFocused(hwnd: HWND; CueText: PWideChar; DrawFocused: Boolean = True): BOOL;{$if CompilerVersion >= 20.00} inline; {$ifend} {$if CompilerVersion < 20.00} //avant D2009 nous devons les déclarer et les implémenter // TEdit // https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb761701(v=vs.85).aspx function Edit_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; // https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb761695(v=vs.85).aspx function Edit_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; // TComboBox // https://msdn.microsoft.com/en-us/library/windows/desktop/bb775931(v=vs.85).aspx function ComboBox_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; // https://msdn.microsoft.com/en-us/library/windows/desktop/bb775927(v=vs.85).aspx function ComboBox_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; {$else} // depuis D2009 elles existent on va donc les utiliser type // comme elles ont la même déclaration de type // pas besoin de déclarer 2 fonctions supplémentaires TSetCueBannerText = function (hwnd: HWND; CueText: PWideChar): BOOL; TGetCueBannerText = function (hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; var // on utilisera les mêmes pour les TEdit que pour les TComboBox Edit_SetCueBannerText, ComboBox_SetCueBannerText: TSetCueBannerText; Edit_GetCueBannerText, ComboBox_GetCueBannerText: TGetCueBannerText; {$ifend} implementation const EM_SETCUEBANNER = $1501; EM_GETCUEBANNER = $1502; CB_SETCUEBANNER = $1703; CB_GETCUEBANNER = $1704; function Edit_SetCueBannerTextFocused(hwnd: HWND; CueText: PWideChar; DrawFocused: Boolean = True): BOOL;{$if CompilerVersion >= 20.00} inline; {$ifend} begin Result := BOOL(SendMessage(hwnd, EM_SETCUEBANNER, wParam(DrawFocused), lParam(CueText))); end; {$if CompilerVersion < 20.00} // TEdit function Edit_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; begin Result := BOOL(SendMessage(hwnd, EM_SETCUEBANNER, wParam(False), lParam(CueText))); end; function Edit_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; begin Result := BOOL(SendMessage(hwnd, EM_GETCUEBANNER, wParam(CueText), lParam(BufLen))); end; // TComboBox function ComboBox_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; begin Result := BOOL(SendMessage(hwnd, CB_SETCUEBANNER, 0, lParam(CueText))); end; function ComboBox_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; begin Result := BOOL(SendMessage(hwnd, CB_GETCUEBANNER, wParam(CueText), lParam(BufLen))); end; {$else} initialization // redirige les fonctions existantes Edit_SetCueBannerText := @CommCtrl.Edit_SetCueBannerText; Edit_GetCueBannerText := @CommCtrl.Edit_GetCueBannerText; ComboBox_SetCueBannerText := @CommCtrl.ComboBox_SetCueBannerText; ComboBox_GetCueBannerText := @CommCtrl.ComboBox_GetCueBannerText; {$ifend} end.
Cordialement,
@+
Merci pour l'unité.
Je viens de réaliser (quoique cela ait été dit au début de la discussion) que pour les dernières versions de Delphi, on n'a pas besoin de tout ça, vu que la propriété TextHint est disponible. L'intérêt pratique des solutions présentées ici serait d'avoir un code compatible avec toutes les versions de Delphi ; ou de pouvoir changer le comportement par défaut (qui est que le champ s'efface dès que curseur y entre, au lieu de s'effacer à la première frappe). Je résume bien la situation ?
très bon résumé
j'ajouterai juste que ce code pourrait avoir un dernier intérêt qui serait didactique:
-sur la compatibilité de D7 à Tokyo(déjà cité)
- sur la redirection de méthodes existantes
maintenant se pose la question de savoir ce qui doit ou mérite d'être posté et où ?
je vous laisse décider
Cordialement,
@+
Bonjour,
pour ma part, avec D7, je préfère la simplicité de la première solution proposée par Cirec et je mettrais ceci dans la FAQ comme une des solutions (à tester si elle fonctionne avec les autres version de Delphi) :
Elle fonctionne parfaitement : le texte ne s'efface que lorsque l'on débute la frappe. Si on efface le contenu du TEdit, le texte par défaut se réaffiche. Il ne s'efface pas quand le TEdit prend le focus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 { ================================================================== } const EM_SETCUEBANNER = $1501; EM_GETCUEBANNER = $1502; // n'oubliez pas de déposer un TXPManifest sur la fiche procedure TForm1.FormShow(Sender: TObject); var Value: WideString; begin Value := 'Entrez votre Texte ici'; SendMessage(Edit1.Handle, EM_SETCUEBANNER, 1, LPARAM(Value)); end; { ================================================================== }
Je conserve cette solution dans mes "cartons" et je pense l'employer dès que l'occasion se présentera.
A+
Charly
En effet.
Vu que c'est vous qui maîtrisez le mieux la question, je propose que vous vous en chargiez.
Il faut rédiger une notice qui reprenne l'ensemble ou l'essentiel des explications et des exemples de code, et ajouter cette notice dans la FAQ, par exemple là (bouton "ajouter une question").
Si vous voulez, vous pouvez poster votre brouillon ici pour bénéficier de notre bienveillante relecture.
Oui, je pense aussi qu'il faut commencer par cette solution.
J'ai testé la deuxième solution
avec Delphi 10.2 et avec Lazarus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.FormCreate(Sender: TObject); begin Edit_SetCueBannerText(Edit1.Handle, 'Entrez votre Texte ici'); Edit_SetCueBannerText(Edit2.Handle, 'Votre nom'); end;
La troisième solution (l'unité crCueBanner) pourrait être mise en pièce jointe.
Bonjour,
et pardon pour le retard
J'accepte volontiers votre aide, j'ai donc préparé un brouillon que je vous soumets :
j'attends vos avis et autres suggestionsComment afficher un CueBanner ou PlaceHolder dans un TEdit ?
Un CueBanner est un texte qui est affiché dans la zone de saisie d'un TEdit quand sa propriété Text est vide.
À partir de Delphi 2009 cette fonctionnalité est présente sous la forme d'une propriété nommée "TextHint".
Mais on peut aussi obtenir le même résultat avec Delphi 7.
Dans tous les cas vous devez activer les Styles Windows, soit en déposant un TXPManifest sur la fiche, soit en choisissant, dans les options du projet, l'option "Activer les thèmes d'exécution."
Pour une utilisation simple et directe :
Voici une deuxième solution réutilisable et compatible de D7 à Tokyo. L'intérêt de cette solution est d'avoir un code compatible avec toutes les versions de Delphi et de pouvoir éventuellement changer le comportement par défaut qui est que le champ s'efface dès que curseur y entre, au lieu de s'effacer à la première frappe, ce qu'il est possible d'obtenir en utilisant la procédure Edit_SetCueBannerTextFocused :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 { ================================================================== } const EM_SETCUEBANNER = $1501; EM_GETCUEBANNER = $1502; // n'oubliez pas de déposer un TXPManifest sur la fiche procedure TForm1.FormShow(Sender: TObject); var Value: WideString; begin Value := 'Entrez votre Texte ici'; SendMessage(Edit1.Handle, EM_SETCUEBANNER, 1, LPARAM(Value)); end; { ================================================================== }
Utilisation de Edit_SetCueBannerText :
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
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 unit crCueBanner; interface uses Windows {$if CompilerVersion < 20.00} // à partir de D2009 vous devez activer les styles dans les options du projet , XPMan {$else} // à partir de D2009 les fonctions "Edit_SetCueBannerText" & "Edit_GetCueBannerText" // existent déjà. Nous les utiliserons par redirection. , CommCtrl {$ifend}; // https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb761703(v=vs.85).aspx // fonction oublié par Delphi permettant le choix ShowOnFocus: Boolean // qui permet ou non de voir le Cue Banner Text quand l'edit à le focus // active pour toutes les versions de Delphi function Edit_SetCueBannerTextFocused(hwnd: HWND; CueText: PWideChar; DrawFocused: Boolean = True): BOOL;{$if CompilerVersion >= 20.00} inline; {$ifend} {$if CompilerVersion < 20.00} //avant D2009 nous devons les déclarer et les implémenter function Edit_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; function Edit_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; {$else} // comme elle existent depuis D2009 type TEdit_SetCueBannerText = function (hwnd: HWND; CueText: PWideChar): BOOL; TEdit_GetCueBannerText = function (hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; // on va les utiliser var Edit_SetCueBannerText: TEdit_SetCueBannerText; Edit_GetCueBannerText: TEdit_GetCueBannerText; {$ifend} implementation const EM_SETCUEBANNER = $1501; EM_GETCUEBANNER = $1502; function Edit_SetCueBannerTextFocused(hwnd: HWND; CueText: PWideChar; DrawFocused: Boolean = True): BOOL;{$if CompilerVersion >= 20.00} inline; {$ifend} begin Result := BOOL(SendMessage(hwnd, EM_SETCUEBANNER, wParam(DrawFocused), lParam(CueText))); end; {$if CompilerVersion < 20.00} function Edit_SetCueBannerText(hwnd: HWND; CueText: PWideChar): BOOL; begin Result := BOOL(SendMessage(hwnd, EM_SETCUEBANNER, wParam(False), lParam(CueText))); end; function Edit_GetCueBannerText(hwnd: HWND; CueText: PWideChar; BufLen: Longint): BOOL; begin Result := BOOL(SendMessage(hwnd, EM_GETCUEBANNER, wParam(CueText), lParam(BufLen))); end; {$else} initialization // redirige les fonctions existantes Edit_SetCueBannerText := @CommCtrl.Edit_SetCueBannerText; Edit_GetCueBannerText := @CommCtrl.Edit_GetCueBannerText; {$ifend} end.
Utilisation de Edit_GetCueBannerText :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 { ================================================================== } procedure TForm1.FormCreate(Sender: TObject); begin Edit_SetCueBannerText(Edit1.Handle, 'Entrez votre Texte ici'); Edit_SetCueBannerText(Edit2.Handle, 'Votre nom'); end; { ================================================================== }
Utilisation de Edit_SetCueBannerTextFocused :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 { ================================================================== } procedure TForm1.Button1Click(Sender: TObject); var aCueTxt: array[0..255] of WideChar; begin if Edit_GetCueBannerText(Edit1.Handle, aCueTxt, 256) then ShowMessage(aCueTxt); end; { ================================================================== }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 { ================================================================== } procedure TForm1.FormCreate(Sender: TObject); begin Edit_SetCueBannerTextFocused(Edit1.Handle, 'Entrez votre Texte ici'); Edit_SetCueBannerTextFocused(Edit2.Handle, 'Votre nom'); end; { ================================================================== }
Cordialement,
@+
@Cirec
Je me suis permis d'éditer ton message, pour rajouter des majuscules et autres corrections mineures. Pour moi c'est bon.
Si les autres n'ont rien à ajouter, tu pourras créer toi-même la nouvelle entrée dans la FAQ.
Bonjour,
à mon avis la phrase
devrait être en mise en valeur (gras/couleur?) pour bien indiquer la nécessitéDans tous les cas vous devez activer les Styles Windows, soit en déposant un TXPManifest sur la fiche, soit en choisissant, dans les options du projet, l'option "Activer les thèmes d'exécution."
Bonjour Cirec,
je ne comprends pas cette phrase :
Car dans mes tests avec la première solution (sous D7) le texte ne s'efface qu'à la première frappe (et non si le TEdit prend le focus) ?Voici une deuxième solution réutilisable et compatible de D7 à Tokyo. L'intérêt de cette solution est d'avoir un code compatible avec toutes les versions de Delphi et de pouvoir éventuellement changer le comportement par défaut qui est que le champ s'efface dès que curseur y entre, au lieu de s'effacer à la première frappe, ce qu'il est possible d'obtenir en utilisant la procédure Edit_SetCueBannerTextFocused :
A+
Charly
PS : @elkader : tu pourrais peut être nous dire ce que tu en penses puisque tu as ouvert ce topic ?
oui et c'est logique, en fait EM_SETCUEBANNER attend 2 paramètres
"WParam" 0: le texte s'efface au focus 1: le texte s'efface à la première frappe
& "LParam" pour le Texte lui même
La fonction la plus simple est écrite de sorte que le texte s'efface à la première frappe "WParam = 1"
SendMessage(Edit1.Handle, EM_SETCUEBANNER, 1, LPARAM(Value));Alors que de base, dans la VCL, la fonction Edit_SetCueBannerText a "WParam = 0"
sans possibilité de le modifier tout comme la macro du même nom décrite sur la MSDN.
Donc pour respecter ceci dans l'unité crCueBanner la fonction "Edit_SetCueBannerText" a le même comportement
Ensuite il existe une autre Macro "Edit_SetCueBannerTextFocused" qui est prévue pour combler ce manque
mais ils n'ont pas jugé utile de l'inclure dans la VCL.
Moi j'ai juste rendu le 3ème paramètre facultatif puisqu'il est par défaut à True.
function Edit_SetCueBannerTextFocused(hwnd: HWND; CueText: PWideChar; DrawFocused: Boolean = True): BOOL;
Voilà j'espère que c'est plus claire pour toi
Merci pour les derniers conseils que je vais appliquer et enfin poster
Cordialement,
EDIT: voilà c'est modifié et posté Merci à tous.
@+
Beau travail !
La validation de la QR est en cours.
EDIT : Voilà, c'est fait.
https://delphi.developpez.com/faq/?p...-dans-un-TEdit
Merci Cirec, c'est parfait
et encore bravo pour cet article qui rend la FAQ de plus en plus complète.
A+
Charly
Juste pour une meilleur clarté à mon sens, j'aurai initialisé en direct les variables pour D2009 dans l'unité crCueBanner :
et donc viré la partie initialization
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // on va les utiliser var Edit_SetCueBannerText: TEdit_SetCueBannerText = CommCtrl.Edit_SetCueBannerText; Edit_GetCueBannerText: TEdit_GetCueBannerText = CommCtrl.Edit_GetCueBannerText;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager