IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Les frames, le parent pauvre de Lazarus sous Windows [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Si tu fais une unité module, c'est j'imagine pour piloter ton frame.
    Donc supprime la variable dans l'unité main.
    Et dans main, utilise module pour communiquer avec ton frame.



  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    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.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 496
    Par défaut
    salut

    j'ai un gros doute sur cette ligne

    frmFrame1.Frame1Frm.TestStringlist;
    a mon avis
    frmFrame1.TestStringlist
    devrais suffire

    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

  4. #4
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Salut JP,

    Je rejoins Anapurna : c'est uniquement un problème de redéclaration de variable.
    Dans l'unité de ton Frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      Frame1Frm: TFrame1Frm;
    et dans main.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private
        Frame1Frm: TFrame;
    Supprime cette ligne, et hop tout roule !

    Amicalement
    Thierry

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    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 :
    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 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
    procedure TFrame1Frm.ReceptionDeMessages(var Msg: TLMessage);
    begin
      with TLMessage(Msg) do
        if (WParam = 1) then TestStringlist;
    end;
    et là ça baigne aussi.

    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

  6. #6
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Citation Envoyé par Jipété Voir le message
    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 ;
    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.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    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 ?

  8. #8
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    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 :

    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;
    Quelle est la meilleure pratique ? Peut-être celle-ci ? En tous cas, j'éviterais au maximum l'utilisation de messages.

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    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
    Hé ben voilà !
    C'était ça l'info qui me manquait, bien joué !

    Citation Envoyé par ThWilliam Voir le message
    En tous cas, j'éviterais au maximum l'utilisation de messages.
    Pourquoi ?
    (Tu sais qu'avec moi faut tout expliquer, svp , car j'ai besoin de comprendre !)

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 163
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    Bonjour,

    (Cent fois sur le métier remets-toi à l'ouvrage, qu'il disait...)
    Citation Envoyé par ThWilliam Voir le message
    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
    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 :
    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.
    Ouch !
    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...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Son dans les frames
    Par mr.t dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 03/01/2005, 17h29
  2. [Débutant] Dialogue Java entre les frames pour client HTML
    Par Carrel dans le forum Général Java
    Réponses: 4
    Dernier message: 03/06/2004, 11h39
  3. Les interruptions sous Windows et Linux
    Par Descartes dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 07/06/2003, 23h42
  4. Utiliser les frames
    Par laury dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/05/2003, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo