Pb utilisation Tlabel

bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004 - 22 sept. 2004 à 12:52
bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004 - 23 oct. 2004 à 16:01
Bonjour a tous,

Je suis nouveau sur ce forum. Je suis debutant en delphi je n'ai commence a programmer que depuis 2 mois. Voila mon probleme.

J'ai une form. A l'ouverture de cette form je cree plusieurs Tlabel et je leurs affecte un certain nombre de proprietes et d'evenements. Voici un morceau de code que j'utilise pour cela:

var quitter:Tlabel

quitter:=tlabel.create(nil);
quitter.Parent:=menu_principal;
quitter.Caption:='Quitter';
quitter.Transparent:=true;
quitter.alignment:=taleftjustify;
quitter.Width:= 281;
quitter.Height:=81;
quitter.Top:=704;
quitter.Left:=760;
quitter.Font.Color:=clwhite;
quitter.Font.Size:=48;
quitter.Font.Name:='@Arial Unicode MS';
quitter.OnClick:=menu_principal.quitterclick;
quitter.OnMouseMove:=menu_principal.quittermousemove;

jusque la pas de soucis, tout fonctionne bien.

Mon pb est que j'aimerais modifier les proprietes des autres label si par exemple je clique sur quitter. Par exemple changer leur nom.

Dans quitterclick je mets

label2.caption:='toto';

et cela ne marche pas.

Est ce que vous avez une explication (certainement tres simple) a cela.

merci a tous

Bubba92

9 réponses

Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
22 sept. 2004 à 13:58
salut bubba92,

j'ai de la peine à comprendre ton problème ???
tu crées tes Label dynamiquement, mais en utilisant toujours la même variable (Quitter) ou une par TLabel ?
ta variable "Quitter" est une variable globale ou appartenant à ta procedure de création ?

A quoi correspond Label2 ?

je vais tout de même te donner une piste qui pourra peut être t'aider. Dans ton Evenement OnClick, procedure quitterclick tu as un paramètre Sender qui correspond à l'object sur lequel tu viens de cliquer. Si tu désire renomer le caption de celui-ci, il te suffit de faire : TLabel(Sender).Caption := 'toto';

Bonne Prog,

Olivier.
0
bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004
22 sept. 2004 à 14:23
Salut olivier,

Je vais etre plus precis. Disons qu'a l'ouverture de ma form je cree 2 labels qui se nomme quitter et label2.

Les 2 labels ont ete declare dans var juste sous implementation comme suit:

var quitter, label2 :Tlabel;

Le code de creation de ces labels est dans la procedure formcreate et correspond a celui presente au-dessus(label2 possede bien sur le meme).

Ce que j'aimerais faire c'est en fait changer le caption de label2 en cliquant sur quitter.

Sinon, l'info que tu m'as donne marche tres bien et je pourrais en avoir besoin, merci beaucoup, mais elle ne correspond pas exactement a mon pb actuel.

merci

bubba92
0
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
22 sept. 2004 à 16:29
Ta procedure menu_principal.quitterclick est déclarer où ?

voici le code que j'ai essayé de retranscrire de se que tu me disais et tout fonctionne ;) bien que je ne trouve pas que se sois une bonne idée de déclarer tes Tlabel ici. est il vraiment nécessaire de les créer dynamiquement ?

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    procedure quittermousemove(Sender: TObject);
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

var quitter, label2:Tlabel;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  quitter:=tlabel.create(nil);
  quitter.Parent:=form1;
  quitter.Caption:='Quitter';
  quitter.Transparent:=true;
  quitter.alignment:=taleftjustify;
  quitter.Width:= 281;
  quitter.Height:=81;
  quitter.Top:=704;
  quitter.Left:=760;
  quitter.Font.Color:=clwhite;
  quitter.Font.Size:=48;
  quitter.Font.Name:='@Arial Unicode MS';
  quitter.OnClick:=form1.quittermousemove;

  label2:=tlabel.create(nil);
  label2.Parent:=form1;
  label2.Caption:='Quitter';
  label2.Transparent:=true;
  label2.alignment:=taleftjustify;
  label2.Width:= 281;
  label2.Height:=81;
  label2.Top:=10;
  label2.Left:=100;
  label2.Font.Color:=clwhite;
  label2.Font.Size:=48;
  label2.Font.Name:='@Arial Unicode MS';
end;

procedure TForm1.quittermousemove(Sender: TObject);
begin
  Label2.Caption := 'toto';
end;


Olivier.
0
lelahel08 Messages postés 36 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 24 octobre 2005
22 sept. 2004 à 17:38
tu ne definit pas la propriété Name de tes composants
0

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

Posez votre question
bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004
24 sept. 2004 à 19:59
Salut,

Merci Olivier, ton code marche tres bien.

En fait, le mien etait tres proche a une difference pres. Dans la procedure formcreate je fais appel a une autre procedure qui cree les labels. Je ne l'avais pas precise avant car je ne pensais pas que le pb venait de la, mea culpa.

En reprenant ton code voila ce que j'ai:

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
procedure quittermousemove(Sender: TObject);
public
{ Déclarations publiques }
end;

procedure creation_label(quitter, label2;tlabel);

var
Form1: TForm1;

implementation

var quitter, label2:Tlabel;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
creation_label(quitter,label2);
end;

procedure TForm1.quittermousemove(Sender: TObject);
begin
Label2.Caption := 'toto';
end;

procedure creation_label(quitter, label2;tlabel);
begin

quitter:=tlabel.create(nil);
quitter.Parent:=form1;
quitter.Caption:='Quitter';
quitter.Transparent:=true;
quitter.alignment:=taleftjustify;
quitter.Width:= 281;
quitter.Height:=81;
quitter.Top:=704;
quitter.Left:=760;
quitter.Font.Color:=clwhite;
quitter.Font.Size:=48;
quitter.Font.Name:='@Arial Unicode MS';
quitter.OnClick:=form1.quittermousemove;

label2:=tlabel.create(nil);
label2.Parent:=form1;
label2.Caption:='Quitter';
label2.Transparent:=true;
label2.alignment:=taleftjustify;
label2.Width:= 281;
label2.Height:=81;
label2.Top:=10;
label2.Left:=100;
label2.Font.Color:=clwhite;
label2.Font.Size:=48;
label2.Font.Name:='@Arial Unicode MS';

end;

Ce code ne marche pas et j'aimerais quand meme bien conserver ma procedure creation_label.
pourquoi le fait de passer par cette procedure fausse le code??

bubba92
0
bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004
24 sept. 2004 à 20:07
j'ai trouve une solution :) . Voila ce que j'ai change dans le code:

procedure creation_label(Sender: TObject);

procedure TForm1.FormCreate(Sender: TObject);
begin
creation_label(owner);
end;

procedure TForm1.quittermousemove(Sender: TObject);
begin
Label2.Caption := 'toto';
end;

Merci beaucoup pour l'aide.

a+

bubba92
0
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 2
7 oct. 2004 à 12:33
Il y a quelques problèmes dans ta façon de penser le code... Si tu débute, c'est assez normal.
Même si ton code marche, il n'est pas "propre", dans le sens où tu n'as apparemment pas compris certaines notions...

Le fait par exemple de créer tes labels avec nil en argument fait que tes labels ne sont pas liés à la Form. Le problème n'est pas génant en soi, puisque, me semble-t-il, Delphi corrige ce types d'erreur... Mais sans la correction automatique, tu polluerais la mémoire car ton label ne serait pas détruit à la destruction de la form.

Pour régler un problème de ce type, deux solutions :
- Le manière la plus répendue est de remplacer nil par Self. Self désigne ta form. En écrivant
label2 := TLabel.Create(Self);
tu crée un lien entre le label et ta form, qui permet à Delphi de détruire le label quand tu détruis la form.

- Si tu préfères laisser nil, il faut alors que tu détruises le label avant de détruire ta form. Dans l'évenement Ondestroy de ta form, je crois, il faut mettre quelque chose du style
label2.free;
ou
label2.destroy;
je ne sais plus trop...

Une autre erreur se trouve au niveau de la portée de tes variables. En les déclarant juste après implementation, tu crées des variables globales. C'est ce qu'il fallait faire. Mais tu n'avais pas besoin de les passer en arguments à ta fonction pour effectuer des transformations. Les variables globales peuvent être atteintes à partir de n'importe quel endroit du code.

J'espère être clair dans mes explications et ne pas trop avoir l'air d'un donneur de leçon !!

Et n'oublie pas de valider la réponse quand elle te convient, afin de voir les messages qui ont été résolus...

Keep Cool & Be Wild
Divad
0
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 2
7 oct. 2004 à 12:33
Il y a quelques problèmes dans ta façon de penser le code... Si tu débute, c'est assez normal.
Même si ton code marche, il n'est pas "propre", dans le sens où tu n'as apparemment pas compris certaines notions...

Le fait par exemple de créer tes labels avec nil en argument fait que tes labels ne sont pas liés à la Form. Le problème n'est pas génant en soi, puisque, me semble-t-il, Delphi corrige ce types d'erreur... Mais sans la correction automatique, tu polluerais la mémoire car ton label ne serait pas détruit à la destruction de la form.

Pour régler un problème de ce type, deux solutions :
- Le manière la plus répendue est de remplacer nil par Self. Self désigne ta form. En écrivant
label2 := TLabel.Create(Self);
tu crée un lien entre le label et ta form, qui permet à Delphi de détruire le label quand tu détruis la form.

- Si tu préfères laisser nil, il faut alors que tu détruises le label avant de détruire ta form. Dans l'évenement Ondestroy de ta form, je crois, il faut mettre quelque chose du style
label2.free;
ou
label2.destroy;
je ne sais plus trop...

Une autre erreur se trouve au niveau de la portée de tes variables. En les déclarant juste après implementation, tu crées des variables globales. C'est ce qu'il fallait faire. Mais tu n'avais pas besoin de les passer en arguments à ta fonction pour effectuer des transformations. Les variables globales peuvent être atteintes à partir de n'importe quel endroit du code.

J'espère être clair dans mes explications et ne pas trop avoir l'air d'un donneur de leçon !!

Et n'oublie pas de valider la réponse quand elle te convient, afin de voir les messages qui ont été résolus...

Keep Cool & Be Wild
Divad
0
bubba92 Messages postés 5 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 23 octobre 2004
23 oct. 2004 à 16:01
salut divadav,

Désolé pour la réponse si tardive mais j'ai ete tres occupe ces derniers temps (pour cause chomage). En tout cas merci pour tes infos que je viens de lire avec grand interet. Et rassure toi pour moi tu n'es pas un donneur de lecon, mais plutot un prof. Je suis debutant et j'apprends seul le delphi donc un conseil est toujours le bienvenue.

merci a tous et a ce forum qui est tres bien

bubba92
0
Rejoignez-nous