J'ai raconté des bêtises cet aprème, et elles sont hélas incorporées dans le .zip.
Voilà les corrections :
le Timer était Enabled à True dans l'inspecteur d'objets, je l'ai passé à False dans mon test d'il y a 5 minutes, et il n'était pas activé à la fin du FormCreate contrairement à ce que je disais dans ma réponse à Thierry (j'ai dû confondre avec un autre projet) : j'y ai donc rajouté cette ligne MainTimer.Enabled:=True;.
Ensuite j'ai refait un test : rajouté un label sur la Frame, ça à la fin de FrameCreate : slTest.Add(DateToStr(Now)); et ça au début de Frame.TestStringList : label1.Caption := slTest[0]; et que croyez-vous qu'il arrivât ?
AV sur cette ligne...
À mes yeux c'est juste complètement insensé, ce comportement.
salut
j'ai un gros doute sur cette ligne
a mon avisfrmFrame1.Frame1Frm.TestStringlist;
devrais suffirefrmFrame1.TestStringlist
le compilateur est mis en defaut tu lui dis d'utiliser frmFrame1.Frame1Frm qui n'est pas instancier alors
que tu as créer sur la mainform frmFrame1
tout l’intérêt de renommer ses variable et ne pas utiliser le même nom que celui par defaut
Salut JP,
Je rejoins Anapurna : c'est uniquement un problème de redéclaration de variable.
Dans l'unité de ton Frame:
et dans main.pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2var Frame1Frm: TFrame1Frm;
Supprime cette ligne, et hop tout roule !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2private Frame1Frm: TFrame;
Amicalement
Thierry
Merci les copains.
Cependant, deux mots d'explication (après m'être relevé, car je suis tombé par terre en lisant vos posts) :
je suis bêtement parti des explications du wiki où on voit bien que la ligne que tu veux me faire supprimer, Thierry, vient de là.
Et pourquoi j'ai "inventé" la déclaration de la variable dans l'unité de la Frame ?
parce que sinon, la mainform ne connait pas la procédure déclarée (même en "public") dans l'unité de la frame que j'aimerais voir appelée par le timer ;
et j'ai suivi ce chemin parce qu'après, l'autocomplétion le valide !
C'est quand même bizarre qu'il faille que je supprime une ligne présente dans le tuto et que je rajoute cette "var" absente lors de la création de l'unité (à la différence de la création d'une form) alors que l'inverse ne fonctionne pas.
Enfin, si, il existe une manière de faire fonctionner tout ça tout en restant conforme au tuto : c'est d'envoyer un message à la frame pour lui faire appeler la procédure plutôt que de vouloir l'appeler directement !
Dans la form :
et dans la frame (où j'ai commenté la ligne "var Frame1Frm: TFrame1Frm;") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure Tmainform.MainTimerTimer(Sender: TObject); begin if mainform.Visible then begin MainTimer.Enabled := False; // frmFrame1.Frame1Frm.TestStringlist; // frmFrame1.TestStringlist; Frame1Frm.Perform(LM_FROMOFFICE, 1, 0); // +1 ! /!\ MainTimer.Enabled := True; end; end;
et là ça baigne aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TFrame1Frm.ReceptionDeMessages(var Msg: TLMessage); begin with TLMessage(Msg) do if (WParam = 1) then TestStringlist; end;
Je me suis (et je vous ai) bien pris la tête avec ces histoires de messages il y a qq jours mais, comme on dit, tout sert à tout, dans la vie![]()
Non, il n'était pas nécessaire de créer une variable dans l'unité de la frame.
Il te suffit de déclarer une variable dans l'unité de mainform, mais dans la section implémentation, puisque c'est dans celle-ci qu'on trouve le uses frmFrame1.
Et bien sûr, supprimer la ligne Frame1Frm: TFrame dans la section private de TMainForm.
Au total : une seule variable Frame1Frm, soit dans l'unité du frame, soit dans mainform.
et donc, si dans mainform, soit dans la partie Private si on veut rester en phase avec le tuto (et il faudra utiliser les messages), soit dans la partie Implementation (adieu le tuto) et on pourra appeler les méthodes publiques de la frame.
J'ai tout bon ?
Mais comment je choisis ? Quelle est la meilleure pratique ? La meilleure manière de coder ?
Si tu veux rester en phase avec le tuto (déclarer Frame1Frm: TFrame dans la section private de mainform) :
tu peux accéder aux méthodes publiques par transtypage :
Quelle est la meilleure pratique ? Peut-être celle-ci ? En tous cas, j'éviterais au maximum l'utilisation de messages.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure Tmainform.FormCreate(Sender: TObject); begin if not Assigned(Frame1Frm) then Frame1Frm := TFrame1Frm.Create(Self); Frame1Frm.Parent := TabSheet1; maintimer.enabled:= true; end; procedure Tmainform.MainTimerTimer(Sender: TObject); begin if mainform.Visible then begin MainTimer.Enabled := False; TFrame1Frm(Frame1Frm).TestStringlist; // transtypage MainTimer.Enabled := True; end; end;
Bonjour,
(Cent fois sur le métier remets-toi à l'ouvrage, qu'il disait...)
Puis-je revenir deux minutes sur cette histoire de transtypage ?
Car autant je le comprends quand il s'agit d'accorder des variables de types différents (http://pascal.developpez.com/faqtemp...#LGTranstypage), autant ici je ne vois pas : je n'arrive pas à mettre des mots pour dire en une phrase bien française avec sujet verbe et complément ce qui se cache sous TFrame1Frm(Frame1Frm).TestStringlist; dans la mesure où Frame1Frm est connu de la Form, sinon la création de la Frame dans FormCreate ne passerait pas la compil...
Je rappelle que si j'enlève le transtypage sans rien toucher d'autre, le message d'erreur est Error: identifier idents no member "TestStringlist" sur la ligne Frame1Frm.TestStringlist; dans la proc du Timer de la Form, avec le curseur clignotant entre le point et le T.
Merci de vos lumineuses explications, car j'ai quand même fait des recherches avant de poster cette dernière question, et partout on me parle de conversion de type, mais surtout avec les nombres (ou les string).
Ou alors, l'explication est là : http://fbeaulieu.developpez.com/guide/?page=page_11, tout à la fin de la page :Ouch !Les transtypages sont surtout utilisés avec les composants qui permettent d'adjoindre aux éléments contenus un ou des pointeurs. Ces pointeurs sont toujours de type "pointer", ce qui les rend impossibles à utiliser directement pour pointer quelque chose. Il faudra transtyper ces pointeurs en un type pointeur déclaré pour pouvoir accèder aux éléments pointés par le pointeur.
Faut lire ça plusieurs fois,!
Ce qui est ennuyeux (pour moi), c'est la phrase suivante : "Pour des exemples de transtypages, referrez-vous au (futur) chapitre sur les types abstraits de données, qui regorgera d'exemples et expliquera concrètement le transtypage des pointeurs."
Le lien vers le chapitre en question se trouve juste dessous, j'y suis allé voir (c'est dément), j'ai fait une recherche sur le mot "transtypage", résultat : rien !
D'où *cette* question...
Partager