[Win32][D7]
Comment référencer en programmation une fenêtre créée dynamiquement dont on a récupéré le nom, la classe et le handle
[Win32][D7]
Comment référencer en programmation une fenêtre créée dynamiquement dont on a récupéré le nom, la classe et le handle
Référencer ? c'est-à-dire ?
créée dynamiquement ? Par TForm.Create ? Par API CreateWindow ?
La fiche de classe TFicheAffTexte est construite à l'aide de l'EDI mais n'est pas créée automatiquement au démarrage de l'application. Elle est créée au besoin à l'exécution par appel au constructeur. On peut la retrouver plus tard via des appels à EnumWindows et récupérer son Handle, sa classe et son nom. Jusque là tout va bien.
Par référencer je veux dire avoir accès à une "variable" (quelle est la syntaxe à utiliser ?) de classe TForm qui me permette à l'exécution d'accéder à la fiche (à la forme) et à ses composants.
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 type TFicheAffTexte = class(TForm) MainMenu1: TMainMenu; MnFichier: TMenuItem; Quitter1: TMenuItem; MnOuvrir: TMenuItem; Edition1: TMenuItem; AfficheurTexte: TMemo; procedure Quitter1Click(Sender: TObject); procedure MnOuvrirClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Déclarations privées } ..... .... public { Déclarations publiques } constructor Cree(AOwner : TComponent; NomFichier : string; OKHS,MenuEditionVisible,AffFin : boolean); ..... ..... end; implementation {$R *.DFM} constructor TFicheAffTexte.Cree(AOwner : TComponent; NomFichier : string; OKHS,MenuEditionVisible,AffFin : boolean); begin inherited Create(AOwner); Parent:=nil; MnOuvrir.Visible:=MenuEditionVisible; AfficheurTexte.LectureSeule:=not MenuEditionVisible; Repaint; if NomFichier <> '' then begin AfficheurTexte.LoadFromFile(NomFichier); if OKHS then AfficheurTexte.ChnComp:='HS;' else AfficheurTexte.ChnComp:=''; end; Show; end;
ah, tu es vraiement pas clair ...
MaVariable peut être une globlale, une locale à une fonction, un membre d'un objet ... c'est comme n'importe quel objet ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaVariable := TFicheAffTexte.Cree(...);
Convertir un handle en TForm, je ne sais pas si c'est possible (j'ai jamais testé).
Le handle te permet d'accéder à l'objet par les API Windows.
Maintenant si tu crées les fiches toi-même, tu aurais meilleur temps de gérer une liste personnelle et de chercher dedans plutôt que de faire un EnumWindows.
Le plus simple serait effectivement de gérer ta propre liste des fenêtres que tu as créées.
Sinon, pour répondre à ta question, on peut envisager différentes solutions :
- Tu pourrais utiliser SetWindowsLong/GetWindowsLong pour associer une donnée utilisateur au handle de la fenêtre. En particulier avec GWL_USERDATA. Il suffirait que cette valeur soit le pointeur sur l'instance.
- Plus simple peut-être : Tu n'as qu'à envoyer un message utilisateur à la fenêtre, pour qu'elle te répond en retournant le pointeur de son instance.
On doit également pouvoir l'extraire directement en remontant le mécanisme utilisé par la VCL pour acheminer les messages windows à l'instance de la form, mais c'est se prendre la tête pour pas grand chose. Autant faire un simple SendMessage au handle, et répondre au message en indiquant le pointeur de l'instance...
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