Création dynamique d'un combobox

develomagaly Messages postés 46 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 3 mai 2006 - 5 avril 2006 à 17:14
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 7 avril 2006 à 15:11
Alors je comprend pas pourquoi sa marche pas !!
help me please

Voici mon code :

*****************DECLARATION*************************
type
Tmonedit = class (Tedit)
Public
constructor create(Aowner : Tcomponent); Override;
procedure MonEditOnEnter(sender : Tobject);
procedure MonEditOnExit(sender : Tobject);
end;

type
TmonCombo = class(TComboBox)
Public
constructor create(Aowner : Tcomponent); Override;
procedure MoncomboChange(sender : Tobject);
end;

***********************IMPLEMENTATION************************
constructor Tmonedit.create(Aowner : Tcomponent);
begin
inherited;
// propriété
width := vg_height_zone;
Height := 21;


// attribution des nouveaux evenements
OnEnter := MonEditOnEnter;
OnExit := MonEditOnExit;
end;

constructor TmonCombo.create(Aowner : Tcomponent);
begin
inherited
OnChange:=MoncomboChange;
end;

********************************************************

Pour un TmonEdit ou un Tcombobox , je fonctionne de la meme maniere ! Ce que je comprend pas c'est que pour un object de type TmonEdit les deux evenement Onenter et onexit s'effectue et je n'ai pas d'erreur a la cration Alors que pour mon object de type TmonCombo , j'ai une erreur a la creation sur l'affectation de ma procedure MonComChange.
message d'erreur : Le projet x à declanche la classe d'exception de type AeAccessViolation avec le messsage "violation d'acces a l'adresse 00000000 ... "

Moi pas comprendre !!!

7 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 avril 2006 à 12:41
Salut,
tu vas pas le croire le seul problème c'est un point virgule qui manquait

Var MCB : TMonCombo;

Implementation
constructor TMonCombo.Create(Aowner: TComponent);
begin
inherited ;
OnChange:= MonComboChange;
end ;


procedure TmonCombo.MonComboChange(Sender: TObject);
begin
ShowMessage('ComboChanged');
end;


utilisation :
procedure TForm1.Button1Click(Sender: TObject);
begin
MCB : = TMonCombo.Create(Self);
With MCB do
Begin
Left := 1;
Top := 1;
Parent := Form1;
Name := 'MCB'; // lors de création dynamique les composants ne sont pas nommés il faut donc le faire soit même
End;
end;

Et bien sur ne pas oublier de liberer la mémoire avant de quitter l'application avec MCB.Free;

@+
Cirec
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
6 avril 2006 à 14:29
C'est normal que ça plante car en mettant inherit tout seul sans paramètres, Delphi va faire hérité TObject au lieu de TComboBox, Hors TCombobox est un descendant de TWinControl c'est à dire que c'est un composant Windows(fenêtres) disposant d'un Canevas ect.., ce composant nécessite un paramètre de type AOwner(propriétaire: généralement c'une fiche TForm) TComponent
donc lorsqu'on surcharge le constructeur Create(AOwner : TComponent) on doit transmettre impérativement ce paramètre à son ancêtre(TComboBox)
dans le cas de la création en dynamique du Composant on peut mettre 'nil' dans le paramètre et par ensuite on affecte son parent

dans Form.Create
Exemple
CB := TComboBox.Create(nil); ou Self peut importe !!!
CB.Parent := Self; <=== obligatoire dans le cadre d'une création dynamrique du Composant Visuel


dans ton interface

voici une instance correcte de TComboBox dans la Classe TmonCombo :

constructor TmonCombo.create(Aowner : Tcomponent);
begin
inherited Create(AOwner); <=== instance correctement intialisé, maintenant c'est son ancêtre TCombobox qui sera chargé de la construction de cette instance
OnChange:=MoncomboChange; <=== inutile il suffit de surchargé la Procedure 'Change' en visiblité "Protected"
end;

Type
TmonCombo = class(TComboBox)
protected
procedure Change;override; <== maintenant fait Ctrl + Maj + Alt en même temps dans l'editeur il faut que le curseur de la souris soit juste au dessus de procedure Change
Public
constructor create(Aowner : Tcomponent); Override;
end;

change n'ayant aucun paramètre là on peut mettre

procedure TMonCombo.Change;
begin
inherited; <== là pas de problème
// ensuite ton code
end;

now ça doit marcher à 100% :)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 avril 2006 à 14:43
Salut Shining,
d'accord avec toi pour le Inherited Create(AOwner) mais le bug provenait uniquement du point virgule manquant.

Fait le teste comme moi je l'ai fait avec le code de DeveloMagaly tel quel et tu verras qu'en ajoutant le point virgule il compile et fonctionne ?

Ensuite pour le OnChange encore une fois d'accord mais ce qui a été fait n'est pas faut c'est juste une autre manière de faire.

Et au lieu de faire un CTRL+MAJ+ALT
il suffit que le cureur soit dans la classe et faire un contextuel puis compléter la classe ...
et la qu'il y ait une où 10 procédures elles seront toutes crées

@+
Cirec
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
7 avril 2006 à 14:05
Bon en effet d'après un test c'est correcte néanmoins il faut prendre l'habitude de faire hérité les paramètres(c'est plus propre !!)

pour le 'OnChange' c'est pas non plus la meilleur méthode , si jamais il diffuse un composant et que l'utilisateur surcharge cette fonction il en perdra la commande !!! tandis que 'procedure change;override' permet à la fois de prendre la 'main' tout en rendant utilisable celle-ci à l'utilisateur grosse nuance donc !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
7 avril 2006 à 14:05
Bon en effet d'après un test c'est correcte néanmoins il faut prendre l'habitude de faire hérité les paramètres(c'est plus propre !!)

pour le 'OnChange' c'est pas non plus la meilleur méthode , si jamais il diffuse un composant et que l'utilisateur surcharge cette fonction il en perdra la commande !!! tandis que 'procedure change;override' permet à la fois de prendre la 'main' tout en rendant utilisable celle-ci à l'utilisateur grosse nuance donc !!!
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
7 avril 2006 à 14:07
oula désolé pour le spam ^_^
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 avril 2006 à 15:11
Oui quand on doit diffuser un composant il faudrait mieux utiliser la surcharge de la fonction pour les raisons que donnes mais ici c’est un composant créer dynamiquement donc aucun risque de diffusion.

Voilà mais il est vrai aussi qu'il vaut mieux prendre les bonnes habitudes tout de suite et d'un autre côté ça permet de connaître une autre méthode qui dans le cas qui nous intéresse produit le même effet

@+
Cirec
0
Rejoignez-nous