Conception de classes de composants visuels

Résolu
frbos Messages postés 27 Date d'inscription vendredi 4 novembre 2011 Statut Membre Dernière intervention 4 novembre 2011 - 22 avril 2010 à 14:49
frbos Messages postés 27 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

9 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
22 avril 2010 à 17:57
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;
3
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
22 avril 2010 à 18:09
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
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
22 avril 2010 à 20:40
@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
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
22 avril 2010 à 15:56
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 !
0

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

Posez votre question
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
22 avril 2010 à 16:26
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
0
frbos Messages postés 27 Date d'inscription vendredi 4 novembre 2011 Statut Membre Dernière intervention 4 novembre 2011
22 avril 2010 à 17:45
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
22 avril 2010 à 18:11
Désolé Guillemouze, tu as été plus rapide que moi !
0
frbos Messages postés 27 Date d'inscription vendredi 4 novembre 2011 Statut Membre Dernière intervention 4 novembre 2011
22 avril 2010 à 18:40
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
0
frbos Messages postés 27 Date d'inscription vendredi 4 novembre 2011 Statut Membre Dernière intervention 4 novembre 2011
22 avril 2010 à 21:30
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
0
Rejoignez-nous