Bonjour à tous,
est-il possible d'afficher un RicheEdit comme un PopupMenu ?
Le style de chose que l'on retrouve dans delphi lorsque l'on fait CTRL+ESPACE
Merci à vous.
Bonjour à tous,
est-il possible d'afficher un RicheEdit comme un PopupMenu ?
Le style de chose que l'on retrouve dans delphi lorsque l'on fait CTRL+ESPACE
Merci à vous.
Tu fais une form avec ton TRichEdit et tu l'affiches sur l'évènement OnKey.
Bonjour,
je fais comme cela aussi, ça marche très bien - tu calcules la position de la fenêtre par rapport aux coordonnées de la souris avant d'ouvrir une fenêtre sans bords
Charly
C'est aussi comme ça qu'on fait tous les composants Dropdown qui affichent autre chose que la bête liste prévue par les combos (par exemple, pour afficher une grille avec plusieurs colonnes...).
En fait, tu n'as même pas besoin de mettre une Form. Tu peux afficher le RichEdit directement. Le plus délicat, c'est de trouver le bon moment pour cacher automatiquement le composant popup et de ne pas rater un événement.
Sinon, tu te retrouve avec des popup qui ne se ferment jamais.
Un RichEdit c'est une fenêtre windows comme une autre. En fait, tu crées le contrôle, tu définis son Parent et ses coordonnées.... Comme si tu créais n'importe quel contrôle dynamiquement.
Un petit exemple vite fait :
Ici, dès que tu cliques dans la form à la souris, j'affiche un RichEdit à l'endroit où on a cliqué.
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 type TForm3 = class(TForm) Edit1: TEdit; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } procedure DoOnExit(sender : TObject); procedure KillCtrl(var msg : TMessage); message WM_USER; end; var Form3: TForm3; implementation {$R *.dfm} procedure TForm3.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var edt : TRichEdit; begin edt := TRichEdit.Create(self); edt.SetBounds(X, Y, 100, 100); edt.Parent := self; edt.Visible := true; edt.OnExit := DoOnExit; edt.SetFocus; end; procedure TForm3.DoOnExit(sender: TObject); begin PostMessage(Handle, WM_USER, cardinal(sender), 0); end; procedure TForm3.KillCtrl(var msg: TMessage); begin TObject(msg.WParam).Free; end;
Je lui définit un événement OnExit pour le détruire dès qu'il perd le focus.
La méthode DoOnExit est alors appelée par le RichEdit lorsqu'il faut le détruire. Pour éviter qu'il ne se détruise lui-même dans son propre gestionnaire d'événement, je poste un message à la Form pour lui demander de détruire le contrôle lorsqu'on sera sorti du traitement du OnExit.
En détruisant le RichEdit il disparait tout seul de la form.
Après tu peux surcharger le CreateParams du RichEdit pour lui donner un style WS_POPUP au lieu de WS_CHILD et lui permettre de dépasser des limites de la form...
Super génial...
Alors, je viens d'essayer de l'afficher en Popupwindows
Mais évidemment je suis pas du tout qualifié pour faire cela. Voici le code que j'ai fais :
Mon RichEdit qui s'affichage en popup est affichable dans un richeedit,..lol
Mais je ne maitrise pas tout ces concepts, j'essai toutefois de proposé quelquechose, pour que tu m'aide à le faire fonctionner sans bug !
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 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; Type TMonRichEdit = Class(THintWindow) Private Protected Procedure CreateParams(var Params: TCreateParams); Override; Public end; type TForm1 = class(TForm) Edit1: TEdit; RichEdit1: TRichEdit; procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } procedure DoOnExit(sender : TObject); procedure KillCtrl(var msg : TMessage); message WM_USER; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.DoOnExit(sender: TObject); begin PostMessage(Handle, WM_USER, cardinal(sender), 0); end; procedure TForm1.KillCtrl(var msg: TMessage); begin TObject(msg.WParam).Free; end; Procedure TMonRichEdit.CreateParams(var Params: TCreateParams); Begin inherited CreateParams(Params); Params.Style := WS_POPUP; end; procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var edt : TMonRichEdit; Begin edt := TMonRichEdit.Create(self); edt.SetBounds(TRichEdit(Sender).left+X, TRichEdit(Sender).top+Y, 100, 100); edt.Parent := self; edt.Visible := true; edt.OnExit := DoOnExit; edt.SetFocus; end; end.
La déjà il s'affiche pas au bonne endroit (bon je devrais m'en sortir)
ensuite une fois afficher il reste afficher et si je fais ALT+F4, j'ai plus aucnu focus nul par... lol
est-ce que tu pourrais me guider ?
Bonjour
Mes essais plantent toujours autant, dés que le richedit se show..boom...
@@@+
Pour commencer je te conseille de rajouter une Tform dans ton projet, classiquement et de l'afficher avec on showmodal.
Tu vérifies si tout est OK en ouverture et fermeture et quand ça marche tu rajoutes un TRichEdit dans ta TForm.
OK, c'est pas le plus élégant mais c'est le plus facile pour commencer.
Bon,
je n'arrive pas du tout à mes fins.
Même en essayant avec une form ou pas....
Je recherche toujours le moyen d'y arriver, le but étant toujours le même et s'apparente à ce que l'on retrouve dans delphi (CTRL+ESPACE) un composant apparait avec une proposition de propriety et autre procedure et lorsqu'on tape des caractères sa filtre automatiquement.
Je veux pas aller jusque là, moi j'aimerais juste affiche une liste de mot (pré-rempli) l'utilisateur tape du text et cela filtre, puis il fait entrée et le mot se colle dans le richeEdit.
Merci pour votre aide.
Partager