Identifier une form

cs_seeev Messages postés 12 Date d'inscription jeudi 12 décembre 2002 Statut Membre Dernière intervention 3 février 2003 - 26 déc. 2002 à 09:52
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 30 déc. 2002 à 13:40
Bonjour à tous

Voilà, je crée des fenêtres dynamiquement à partir d'un type de fenetre que j'ai appeleé FormGraph enfin peu importe...
Le fait est que je crée un nombre indéfini de fenetres de ce type. A chaque fois qu'une fenetre est crée, elle est stoquée dans un tableau de form. Lors d'un évenement, j'ai besoin de connaitre les caractéristiques de la form en question pour la comparer à celles stoquées dans le tableau

Comment je peux donc identifier une form?
j'ai essayé tableau[i]=sender, tableau[i]=formgraph, de le faire à partir du caption qui est différent pour chaque form, ... mais rien n'y fait, il semble que les données ne se présentent pas de la meme maniere.

Quelqu'un peut-il m'expliquer ce phenomène que je n'arrive vraiment pas à comprendre et me proposer une solution ?

Merci d'avance et bonnes fetes

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 déc. 2002 à 11:16
Pour info, la variable Screen de type TScreen contient déjà un tableau des fiches présentes à l'écran dans une de ses propriétés (Screen.Forms).

Il suffit donc de créer une procédure dans ta fiche principale à laquelle tu passes comme paramètre la référence Sender reçue dans tes fiches TFormGraph.

Supposons que l'unité déclarant Fom1 de type TForm1 soit nommée UForm1 et que la déclaration de la classe de la fiche TFormGraph soit contenue dans UFormGraph :

procedure TForm1.MaProc(Sender : TObject);
begin

end;

Ensuite, dans cette procédure, tu exploites cette référence de la manière suivante :
begin
With TFormGraph(Sender) do
begin
...
end;
end;

Bien entendu, il te faudra déclarer l'utilisation de l'unité UFormGraph dans UForm1 mais aussi UForm1 dans UFormGraph.

Supposons que tu gères l'évènement double clic dans la classe TFormGraph, alors tu transmets la référence à la procédure déclarée dans UForm1 :

procedure TFormGraph.FormGraphDblClick(Sender: TObject);
begin
UForm1.MaProc(Sender);
end;

Ainsi, tu disposes d'une référence sur la fiche de type TFormGraph qui a appelé la procédure.

Il me semble donc inutile de maintenir un tableau, même dynamique. Au pire, utilises une propriété de type TObjectList.

Maintenant, je vais essayer d'expliquer pourquoi ta solution ne peut pas fonctionner, mais effectuons d'abord quelques rappels :

1/- Sender est une référence (un pointeur) sur l'objet qui a déclenché un évènement.

2/- Tableau est un tableau contenant des objets de type TFormGraph. En aucun cas, il ne contient de référence sur les objets qu'il stocke. Il permet tout juste d'accèder aux propriétés et méthodes des objets sur lesquels il pointe. Il stocke une copie des TFormgraph.

C'est surtout cette dernière remarque qui me fait dire qu'il ne sert à rien de stocker les fiches créées dans un tableau.

May Delphi be with you
0
cs_seeev Messages postés 12 Date d'inscription jeudi 12 décembre 2002 Statut Membre Dernière intervention 3 février 2003
30 déc. 2002 à 10:24
Merci pour ton aide
J'ai finalement choisi d'utiliser une TObjectList car j'avais vraiment besoin d'un index qui correspond et à une feuille et à un autre élément.

J'ai une autre question :

je n'arrive pas à libérer la mémoire du tobjectlist de maniere à pouvoir reecrire par dessus
J'ai essayé
someObjList.free;
someObjList:=nil;

for i:=0 to x
someObjList.delete(i);

someObjList.clear;

mais je n'arrive vraiment pas à réécrire par dessus apres.

Merci encore

:big)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2002 à 10:45
Qu'entends-tu par "je n'arrive pas à réécrire par dessus après" ?
Si ton TObjectList est détruit (après un appel à Free), comment veux-tu réécrire dessus puisqu'il n'existe plus ?

Si j'ai mal compris ta question, dis le moi.

May Delphi be with you
0
cs_seeev Messages postés 12 Date d'inscription jeudi 12 décembre 2002 Statut Membre Dernière intervention 3 février 2003
30 déc. 2002 à 11:20
Non, en fait, je veux elever un objet de la liste à partir d'un index donné(c'est mieux mais pas obligatoire)et ensuite réatribuer un autre objet a ce meme index dans la liste

Dans le cas où cet index est 0 et que l'élément à supprimer est le seul de la liste, j'essaie .free (suivi de :=nil et .create) ou .clear sur l'objectList.
Lorsque ensuite, je veux ajouter un objet dans la liste (une formGraph donc), c'est OK mais je ne peux plus fermer cette fenetre. (c'est sur la procedure close que je réiniialise la liste)

Ce que je t'ai donné n'était pas approprié, il est vrai que j'ai du mal à voir d'ou vient le probleme du coup, je m'emmele un peu les pinceaux, j'en suis desole. En y allant pas à pas, il semble que cela vienne des appels à free ou clear.

j'espere que j'ai été plus clair et espere que tu pourras m'aider

:big)
0

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

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2002 à 13:40
Extrait de l'aide en ligne : "TObjectList contrôle la mémoire de ses objets, libérant un objet lorsque son indice est réaffecté".
Pour supprimer un élément de la liste, utilises la méthode Delete(Index : Integer);

May Delphi be with you
0
Rejoignez-nous