1

J'ai un contrôle FireMonkey personnalisé (TComboBox) qui a également un TComponentEditor personnalisé. Quand je substituez la méthode ExecuteVerb et tenter d'ajouter un composant enfant (sur mesure TListBoxControl) la coutume TComboBox qu'il ne soit pas montré au moment de la conceptionComposant Firemonkey personnalisé qui implémente TComponentEditor. Ajouter un contrôle enfant à parent au moment du design

Par défaut TComboBox Comportement:

Default TComboBox behavior

sur mesure TComboBox

Custom TComboBox

Mon code ExecuteVerb:

var 
    PpComboItem : TPpListBoxItem; 
    PpCombo: TPpComboBox; 
begin 
    if (Component is TPpComboBox) then 
    PpCombo := (Component as TPpComboBox) else 
     exit; 

    PpComboItem := TPpListBoxItem.Create(PpCombo); 
    PpComboItem.Parent := PpCombo; 
end 

J'ai essayé de retracer la façon dont le TComboBox essaie de le faire, mais cant semblent trouver l'unité avec la mise en œuvre correcte

** Modifier **

Bon - j'ai réussi d'avoir un regard sur la façon dont les gars de TMS y sont parvenus avec leurs composants (achetés et payés) et je l'ai réussi à extrapoler les éléments suivants

var 
    PpComboItem : TPpListBoxItem; 
    PpCombo: TPpComboBox; 
begin 
    inherited; 
    if (Component is TPpComboBox) then 
    PpCombo := (Component as TPpComboBox) else 
     exit; 

    PpComboItem := (TPpListBoxItem(Designer.CreateComponent(TPpListBoxItem, PpCombo, 10, 10, 100, 100))); 
    PpComboItem.Parent := PpCombo; 
    Designer.Modified; 
end; 

Mais quand je clique sur le AddTPpListBoxItem dans le ComponentEditor-je obtenir le followin erreur:

Class TPpListBoxItem is not applicable to this module

+0

Je ne sais pas s'il pourrait être plus facile d'étendre l'éditeur d'élément TCustomListbox pour avoir un nouveau TListBoxItem dans la liste déroulante avec tous les autres types de TListBoxItem? –

Répondre

1

J'ai trouvé ma réponse. Pour obtenir ce travail, vous devez

Assurez-vous que le composant que vous essayez d'ajouter un enfant au parent est également enregistré:

USES TPpListBoxItem.pas, TPpComboBox.pas, DesignIntf, DesignEditors 

//TComponentEditor Type Decleration // 

procedure Register; 
begin 
    RegisterComponents('Sample', [TPpListBoxItem]); 
    RegisterComponents('Sample', [TPpComboBox]); 
    RegisterComponentEditor(TPpComboBox, TComboComponentEditor); 
end; 

Remplacer la méthode ExecuteVerb du TComponentEditor du composant parent (trouver le code dans ma question où la première édition est):

la viande est essentiellement:

... 
PpComboItem := (TPpListBoxItem(Designer.CreateComponent(TPpListBoxItem, PpCombo, 10, 10, 100, 100))); 
PpComboItem.Parent := PpCombo; 
Designer.Modified; 
... 

Voila!