Conception de classes de composants visuels [Résolu]

Messages postés
28
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
- - Dernière réponse : frbos
Messages postés
28
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
- 22 avril 2010 à 21:30
Bonjour
Je cherche depuis 1 mois a créer des classes de composants visuels.
Par exemple, j'ai un treeview gérant le drag and drop, en liaison avec une BD, gerant l'ajout et la suppression de noeuds, etc, que je voudrais utiliser dans plusieurs fiches de mon projet, voire dans plusieurs projets.
Est-il possible de creer de telles classes dans des unit seulement ?
Je ne souhaite pas passer par la création de composants.

Est-ce possible ?
Merci
frb
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
3
Merci
En fait, je rectifie ce que j'ai dit, tu peu utiliser un compo non installé au designtime en passant par une TFrame.

pour ce qui est de la creation dynamique :
unit Compo;
...
TMonEdit = class(TEdit)
...
end;


unit unit1;
...
procedure TForm1.Button1Click(...);
var
  edt: TMonEdit;
begin
  edt := TMonEdit.Create(self);
  edt.parent := self;
  ...
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2
3
Merci
Re-bonjour.

Voici un simple exemple d'un composant dérivé de TEdit qui accepte la touche Enter pour passer au composant suivant.

Unité du composant : MyEdit.pas

type
  TMyEdit = class(TEdit)
  protected
      procedure WMChar(var Message: TWMChar); message WM_CHAR;
  end;

//...
procedure TMyEdit.WMChar(var Message: TWMChar);
begin
  if Message.CharCode = VK_RETURN then
  begin
    Message.CharCode:= 0;
    PostMessage(Parent.Handle, WM_NEXTDLGCTL, 0, 0);
  end
  else
    inherited;
end;


Création dynamique dans l'unité de Form1. Je le fais dans l'événement OnCreate, mais tu peux le faire autre part, quand tu as besoin du composant.

uses MyEdit;

var
   Edit1: TMyEdit;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Edit1:TMyEdit.Create(Self)   // Self, ici Form1
    with Edit1 do
    begin
        Parent:= Self;
        Left:= 100;
        Top:= 100;
        //...
        // tu peux assigner ici des événements
        // OnChange:= Edit1Change  (procedure à déclarer et à implémenter)
    end;
end;


Remarque sur la création :
Bien distinguer le Owner (propriétaire) du composant du Parent.
Create(Self) = le propriétaire de Edit1 est Form1. C'est Form1 qui sera chargé de libérer (free) le composant. Tu peux aussi faire un Create(nil) --> pas de propriétaire, donc c'est à toi à libérer le composant, p.ex, dans l'événement OnClose de Form1.
Le parent = le composant qui contient (visuellement) le Edit.
Rien ne t'empêche de faire :
Edit1:= TMyEdit.Create(Form1);
Edit1.Parent:= Panel1;

Voilà, je ne sais pas si j'ai été clair...
A +
Thierry

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ThWilliam
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
3
Merci
@th : c'est marrant, on a le même exemple, sauf que le mien est plus pourrit :p

@frb:
Les frame, c'est comme un TPanel, sauf que tu peux le concevoir graphiquement (a la manière d'une TForm). Ca revient en gros à faire une Form, et a pouvoir la placer dans d'autres forms.

Petit exemple, avec ton treeview (valable pour D7):
Fichier->Nouveau->Cadre
Tu place ton TreeView dessus, tu modifie les propriétés, tu affecte les comportements (OnDragEnd, ...) que tu implémente dans la TFrame comme tu le ferai dans une form.
Et voila, ta frame est créée, disons qu'on la sauve sous MaFrame.

Maintenant tu ouvre une form dans laquelle tu veux poser ton treeview, tu va dans la palette de composants standard, tu click sur cadre (un rectangle blanc), et tu click ou tu veux la poser dans ta form (ou un panel, ...). Là, une fenêtre s'ouvre pour te permettre de choisir MaFrame.
Voila, ton "compo" est posé. Tu peux l'ajouter autant de fois que tu veux

3 choses importantes a savoir :
[list]
[*] Les frames que delphi te propose d'insérer sont celles qui appartiennent au dpr. Tu peux les rendre disponibles dans tous les projets en faisant un click droit dans la frame->ajouter au référentiel.
[*] Les propriétés published de ta frame ne sont pas visibles dans l'inspecteur, mais tu peux les manipuler par le code
[*] tu peux hériter une autre frame en faisant fichier->nouveau->autre. Tu trouvera la frames ajoutées au référentiel, et celles appartenant aux projets présents dans le groupe de projet courant (sous les différents onglets). N'oublies pas de bien sélectionner heriter et pas copier
/list

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
si tu veux poser ta treeview au designtime, tu es obligé de creer un composant. Par contre, si tu les pose dynamiquement au runtime, alors pas de probleme !
Commenter la réponse de Guillemouze
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2
0
Merci
Bonjour.

"Je cherche depuis 1 mois a créer des classes de composants visuels."
"Je ne souhaite pas passer par la création de composants."

Il y a un peu contradiction !
Ne confonds pas : création de composant et installation de composant.
Dans les 2 cas, le composant est dans son unité propre.
L'installation n'est nécessaire, comme l'a précisé Guillemouze, que si tu veux l'utiliser en mode design.
Sinon tu le crées dynamiquement. Perso, c'est ce que je fais avec des composants "non généralistes".

A +
Thierry
Commenter la réponse de ThWilliam
Messages postés
28
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
0
Merci
Merci, ca me rassure un peu...
Je ne savais pas que l'on était pas oblige d'installer un composant. J'ai effectivement fais l'amalgame entre création et installation de composant.
Actuellement, je teste sur un composant dérivé de TEdit mais possédant un label en plus. Je peine un peu
L'un de vous aurai-t-il un exemple très simple d'un composant visuel crée dans une classe et son utilisation en dynamique ?
Cela me permettrai d'extrapoler pour mon projet

frb
Commenter la réponse de frbos
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2
0
Merci
Désolé Guillemouze, tu as été plus rapide que moi !
Commenter la réponse de ThWilliam
Messages postés
28
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
0
Merci
Merci beaucoup a vous deux, cela va beaucoup m'aider
Une dernière question à Guillemouze,

peux-tu m'expliquer ?

En fait, je rectifie ce que j'ai dit, tu peu utiliser un compo non installé au designtime en passant par une TFrame.



frb
Commenter la réponse de frbos
Messages postés
28
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
0
Merci
Un grand grand merci a vous 2 !
Je viens de faire mon treeview dans une frame, ca marche nickel !
Je vais aussi tester les composant.
Vous m'avez franchement enlevé une grosse épine du pied !

Au hasard de mes recherche, j'ai trouvé ca tuto Composants
Si je l'avais lu avant, j'aurais aussi eu des réponses
En tout cas grace a vous, je suis sur la voie
Encore merci

frb
Commenter la réponse de frbos