Je creuse le net depuis quelques jours sans trouver de réponse complète...alors je poste ici sans trop d'espoir mais sait-on jamais.
je cherche à faire un Form Designer spécifique qui utilise un TComponent et non un TForm (ni même un TWinControl ou TDataModule)
Sous Delphi XE2 nous avons deux Form Designer, l'un pour VCL l'autre pour FMX, quand on place un composant sur une fiche, on peut grâce aux méthodes de TObject retrouver pas mal d'informations.
pour la VCL voici l'arborescence des objets qui constituent l'IDE Delphi
sous FMX on retrouve presque la même chose avec à la finTAppBuilder{ in 'AppMain.pas}
- TEditorDockPanel{TEditorDockPanel in 'IDEDockPanel.pas}
- TEditWindow{TEditWindow in 'EditorForm.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
- TPanel{TPanel in 'Vcl.ExtCtrls.pas}
-TEditorFormDesigner{TEditorFormDesigner in 'EmbeddedFormDesigner.pas}
-TFormContainerForm{TFormContainerForm in 'VCLFormContainer.pas}
- TForm1{TForm1} in 'Unit1.pas'
toute la problématique est donc de créer un TFormContainerForm spécique.-TEditorFormDesigner{TEditorFormDesigner in 'EmbeddedFormDesigner.pas}
-TFormContainerForm{TFormContainerForm in 'FmxFormContainer.pas}
- TForm1{TForm1} in 'Unit1.pas'
La première chose à faire est de créer un nouveau Wizard pour avoir un nouveau type de Fiche RegisterPackageWizard.
Cette étape est relativement simple; la méthode IOTAWizard.Execute est invoquée quand on le sélectionne.
Là on utilise IOTAModuleServices pour créer une nouvelle unité, IOTAModuleCreator va permettre de fournir le source PAS et DFM de la fiche. Il ne reste plus qu'à associer une éditeur à ce type de fiche avec RegisterCustomModule.
c'est là que ça se complique...à priori ICustomDesignForm80 permet de définir le container de son choix:
et la doc s'arrête là ! Embarcadero fourni pas mal de sources avec Delphi, mais pas ceux de TFormContainerForm ... du coup c'est difficile de savoir quoi en faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ICustomDesignForm80 = interface ['{525A1DF8-5EF3-4B98-8EE3-4567910A7EA1}'] procedure CreateDesignerForm(const Designer: IDesigner; Root: TComponent; out DesignForm: IHostForm; out ComponentContainer: TWinControl); end;
J'ai bien réussi à créer un TForm container, et un TForm pour IHostForm...j'ai même rusé pour l'intégrer comme enfant de TEditorFormDesigner...mais pour le reste c'est le flou total.
Ma première idée était que sur un clic de la fausse fiche, j'invoque Designer.SelectComponent() pour activer mon dérivé de TComponent...et en fait ça fonctionne ! Sauf que le changement d'onglet fait tout foirer, si j'ai une fiche VCL elle me change les fenêtre Structure, Palette d'outils et me sélectionne la fiche dans l'inspecteur d'objets, et je ne parviens pas à revenir sur mon Tcomponent quand je reviens sur mon onglet.
Bref, j'ai sûrement perdu 90% des lecteurs à la moitié de ce message, mais si dans les 10% restants quelqu'un à une idée sur comment gérer tout cela je suis preneur
ATTENTION ! RegisterCustomModule pour un dérivé de TCustomForm, TWinControl ou TDataModule est relativement simple car on n'a pas besoin d'implémenter ICustomDesignForm80, Delphi sait les gérer...mais le résultat ne me convient pas pour mon arborescence d'objets basés sur TComponent (tout comme les objets FMX d'ailleurs pour qui Embarcadero à créé un designer specifique).
Merci
Partager