Nouveau composant TImage et TLabel

cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011 - 27 févr. 2010 à 23:04
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 15 mars 2010 à 19:38
Salut a tout le monde ,
J'explique au mieux mon soucis , j'ai creer un nouveau composant derive de TImage,et j'ai besoin d'un TLabel dans le nouveau composant , donc j'ai creer une variable:
VLabelMichel : TLabel;
une procedure SetLabelMichel(Value : TLabel);
et une property LabelMichel : TLabel Read VLabelMichel Write SetLabelMichel;

Dans le Constructor de mon composant , je cree
VLabelMichel:=TLabel.Create(Self);
VLabelMichel.Caption:='Michel34';
Etc ...

et le probleme c'est quand je pose mon nouveau composant MichelImage,je n'ais pas mon label
qui apparait, Y a t'il une procedure ou une methode qui ma echappé , comme par exemple dans le constructor
lui dire de dessiner mon TLabel, j'ai cherché et je ne trouve rien .

Alors si il y a une bonne Ame pour me sauver et surtout m'expliquer ou j'ai trebuché , je
suis preneur.

Merci d'avance a toutes et tous.

A+ Michel

13 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
28 févr. 2010 à 01:03
Salut,
faut que le label ait comme parent ton objet :
VLabelMichel.Parent := self;

Mais remarque, un composant dans un autre c'est vraiment très crade. Pourquoi ne pas simplement écrire le texte désiré à l'aide d'un canevas ou même des API windows ? Ca serait mieux je pense.
PS : la convention veut que l'on nomme les champs objet en commençant par F et non par V
PS2 : si tu continues avec un label, n'oublie pas de le libérer à la destruction de ton composant ...

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
28 févr. 2010 à 01:04
Oups, la balise code n'est pas passée :
VLabelMichel.Parent := self;


Cordialement, Bacterius !
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
28 févr. 2010 à 04:07
unit Unit29;

interface

uses
  SysUtils, Classes, Graphics, StdCtrls, ExtCtrls;

type
  TMichelImage = class(TImage)
  private
    fLabel : TLabel;
    procedure SetLabel(const Value: TLabel);
  protected
    procedure DoPictureChange(Sender: TObject);
  published
    property ImageLabel : TLabel read fLabel write SetLabel;
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

{ TmImage }

constructor TMichelImage.Create(aOwner: TComponent);
begin
  inherited;
  fLabel         := TLabel.Create(Self);
  fLabel.Parent  := Self;
  fLabel.Left    := 5;
  fLabel.Top     := 5;
  fLabel.Caption := '0 x 0';

  Picture.OnChange := DoPictureChange;
end;

destructor TMichelImage.Destroy;
begin
  fLabel.Free;
  inherited;
end;

procedure TMichelImage.DoPictureChange(Sender: TObject);
begin
  fLabel.Caption := format('%d x %d',[Picture.Width, Picture.Height]);
end;

procedure TMichelImage.SetLabel(const Value: TLabel);
begin
  if assigned(Value) then
    fLabel.Assign(Value);
end;

end.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
28 févr. 2010 à 04:13
Encore Unit29

Cordialement, Bacterius !
0

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

Posez votre question
cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011
28 févr. 2010 à 09:01
Salut les Supers Matinaux,
merci pourvos reponses mais ca ne fonctionne pas.
j'avais deja pense a : VLabelMichel.Parent:=Self;
Mais c'a me met une erreur a la compilation:
//// [DCC Erreur] MDImage.pas(140): E2010 Types incompatibles : 'TWinControl' et 'TImageMichel' ////

pour eviter cette erreur il me faut ecrire : VLabelMichel.Parent:=Self.Parent;
mais mon TLabel ne s'affiche toujours pas;

J'ais installé ton Compo et j'ai bien une image mais pas de TLabel:

/////////
unit MichelImage;

interface

uses
SysUtils, Classes, Graphics, StdCtrls, ExtCtrls;

type
TMichelImage = class(TImage)
private
fLabel : TLabel;
procedure SetLabel(const Value: TLabel);
protected
procedure DoPictureChange(Sender: TObject);
published
property ImageLabel : TLabel read fLabel write SetLabel;
public
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('michel34', [TMichelImage]);
end;
constructor TMichelImage.Create(aOwner: TComponent);
begin
inherited;
fLabel := TLabel.Create(Self);
fLabel.Parent := Self.Parent; /// TU VOIS J'AI DU MODIFIER AUSSI ICI , SINON ERREUR.
fLabel.Left := 5;
fLabel.Top := 5;
fLabel.Caption := '0 x 0';

Picture.OnChange := DoPictureChange;
end;

destructor TMichelImage.Destroy;
begin
fLabel.Free;
inherited;
end;

procedure TMichelImage.DoPictureChange(Sender: TObject);
begin
fLabel.Caption := format('%d x %d',[Picture.Width, Picture.Height]);
end;

procedure TMichelImage.SetLabel(const Value: TLabel);
begin
if assigned(Value) then
fLabel.Assign(Value);
end;

end.
/////////

Pour ce qui est dd'ecrire directement sur le Canvas ,pas de soucis c'est ce que j'avais fait a l'origine
mais en realite j'ai 2 label a poser et j'aurais voulu que la fonte , la couleur et la taille soit differente.
et la impossible de faire autrement quedeprendre le TFont du parent.

Autre chose , je travaille depuis peu avec Delphi RAD 2010,Comme je suis passé a Windows Seven , j'avais incompatibilité
avec Delphi 7 , et l'Occasion faisant le Larron ,mon fils avec sa carte d'etudiant m'a fait profiter d'un achat a prix reduit.

A+ Michel
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
28 févr. 2010 à 10:45
VLabelMichel.Parent := TWinControl(self);


Cordialement, Bacterius !
0
cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011
28 févr. 2010 à 11:58
Salut Bacterius ,

J'ai testé et ca plante ,

---------------------------
Erreur d'application
---------------------------
Exception EAccessViolation dans le module Project2.exe en 000030A6.

Violation d'accès à l'adresse 004030A6 dans le module 'Project2.exe'. Ecriture de l'adresse 00000004.


---------------------------
OK
---------------------------

Je rage , d'etre coincé pour une broutille , j'en suis persuadé.
Comme c'etait juste pour avoir une fonte , taille et couleur pour chaque label
j'avais commencer par ca : VLabel1Font : TFont; VLabel2Font : TFont;
Et les memes procedures que mon TLabel , mais a l'arrivée meme Soucis,
Pas que je ne voyais pas les proprietés ,elle existait , mais impossible de les utiliser
dans le canvas de mon image.

A+ Michel
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
28 févr. 2010 à 12:04
C'est normal. Tu crées un TLabel, mais tu proposes en même temps de le modifier par l'inspecteur d'objets. Soit tu choisis de "lier" un label qui existe déjà sur la fiche, soit tu crée un label interne au composant qui ne sera pas modifié par l'utilisateur. Que veux-tu faire exactement ?

Cordialement, Bacterius !
0
cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011
28 févr. 2010 à 14:42
Salut Bacterius,

Je veux tout simplement a l'interieure de mon composant TMichelImage ,avoir des
1 ou des Textes(String) Modifiable par l'utilisateur [ couleur , Fonte , Style ]
et positionnable par l'utilisateur dans le canvas TMichelImage.

pour l'instant , je vais terminer mon composant avec meslimites , je le posterais
et j'espere que des declicksseproduiront pour le peaufiner.

en tout cas merci pour votre coup de main a toutes et tous.

A+ Michel
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
1 mars 2010 à 18:49
ah mais je sais pourquoi, TImage est bien un TWinControl mais il n'accepte pas les controls.
Il suffirait de modifier le ControlStyle du TImage avec csAcceptControl.
ou un truc du genre. peu pas tout retenir.
0
cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011
1 mars 2010 à 22:19
Salut foxi ,
je n'ais pas tout compris , en principe demain soir , je poste le composant que je mettrais avec unprogrammede test ,pour pouvoir l'evaluer au mieux , et par la meme occasion , je ferais un bilan de ce que je n'ai pas reussi a faire.
ca ne me tracasse pas des masses dans le sens ou je voulais juste comprendre les subtilités qui m'empeché de dormir a 100 %.
Bonne continuation.

A+ Michel
0
delphinovice Messages postés 6 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 15 mars 2010
15 mars 2010 à 18:25
Hein monseur Dr.who TImage n'est pas un TWincontrol
Label.Create(nil) 
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 9
15 mars 2010 à 19:38
...

Cordialement, Bacterius !
0