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

Langage Delphi Discussion :

[D7] Comment accéder à une Form depuis son nom ?


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [D7] Comment accéder à une Form depuis son nom ?
    Bonjour à tous,

    Dans une appli MDI, je liste toutes les fenêtres créées et j'arrive à récuperer leur noms.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      For i := Screen.FormCount - 1 DownTo 0 do begin // Lister toutes les fenêtres actives
          li := lvEnCours.Items.Add;
          li.Caption := TfrmVm(Screen.Forms[i]).myOffre.lib;
          li.Data := Pointer(i);
      end;
    Dans un 2ème temps, j'aimerais, lors d'un clic sur l'element, remettre la form en avant plan (bringToFront).
    Or, le I n'est pas fiable, il change en fonction de l'ordre affiché... Il n'est lié à aucune fenêtre.
    J'ai pensé à les retrouver à partir de leur noms (qui s'incrémente automatiquement), pouvoir me "rebrancher" sur la Form concernée.
    Seulement, je n'y arrive pas.

    En quelques sortes, il me faudrait un FindComponent, mais pour les forms.

    L'appli MDI par défaut reproduit bien ce comportement dans le menu "Fenêtre", mais le code n'est pas accessible.

    Pouvez vous m'aider ?

    Merci d'avance.
    David.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    normalement quelque chose de ce genre devrai fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    forI :=MDIChildCount-1 downto0 do begin
      if MDIChildren[I].Caption = NomDeLaForm then
        MDIChildren[I].BringToFront;
    end;
     
    end;

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Suffit d'utiliser FindComponent sur l'objet Application, qui est le propriétaire de toutes tes fiches, normalement.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    et si tu stock directement ta form?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      For i := Screen.FormCount - 1 DownTo 0 do begin // Lister toutes les fenêtres actives
          li := lvEnCours.Items.Add;
          li.Caption := TfrmVm(Screen.Forms[i]).myOffre.lib;
          li.Data := Screen.Forms[i];
      end;

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour Jean-François,
    Merci pour le MDIChildCount, je ne connaissait pas, je vais l'utiliser.
    Et C'est en gros ce que j'ai fait depuis mon post.
    J'ai gardé le nom des forms dans un tableau dynamique de correspondance.

    Bonjour sjrd,
    Cette solution aurait été idéale, j'y ai pensé mais la valeur retournée et de type tComponent, et je n'arrive pas à le caster en type tForm, il me fait une erreur mémoire.

    Bonjour guillemouze,
    Oui, j'y ai bien pensé, mais la propriété Data ne peut prendre qu'un objet de type pointer... Donc du numérique, nan ?

    Voici ce que j'ai fait lors de la première lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      SetLength(tabForms, j); // Tableau dynamique de correspondance pour stoker le nom des forms
      For i := MDIChildCount-1 DownTo 0 do begin // Lister toutes les fenêtres actives
        if Pos('frmVm', MDIChildren[i].Name)=1 then begin // Si c'est une fenêtre de VM
          li := lvEnCours.Items.Add;
          li.Caption := TfrmVm(MDIChildren[i]).myOffre.lib;
          SetLength(tabForms, j+1);
          tabForms[j] := MDIChildren[i].Name; // Stoquer le nom de la form
          li.Data := Pointer(j); // Garder l'index dans le tableau
          Inc(j);
         end;
      end;
    Lors du clic sur l'élement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TfrmMain.lvEnCoursSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
    var i: Integer;
    begin
      inherited;
      if Selected then begin
        For i := MDIChildCount-1 DownTo 0 do begin // Lister toutes les fenêtres actives
          if (tabForms[Integer(lvEnCours.Selected.Data)]=MDIChildren[i].Name) then begin
            TfrmVm(MDIChildren[i]).BringToFront;
            Break;
           end;
        end;
      end;
    end;
    Pas mieux ?
    David.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par dacid Voir le message
    Bonjour guillemouze,
    Oui, j'y ai bien pensé, mais la propriété Data ne peut prendre qu'un objet de type pointer... Donc du numérique, nan ?
    oui mais nan.

    Pointer, TObject (et ses descendants), et integer, ne sont qu'un seul et meme type (en gros).

    • un pointer est codé sur 4 octets, et represente une adresse memoire (un entier quoi)
    • un tobject est codé sur 4 octets, et représente un object (qui n'est rien d'autre qu'un pointeur)
    • un integer est codé sur 4 octets, et represente ... un chiffre (attention de ne pas caster un integer en pointer, tu "risque" l'EAccessViolation).


    tu peux donc faire sans aucun probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    li.Data := Pointer(MDIChildren[i]);
    ...
    TfrmVm(li.Data).BringToFront; //Attention au cas ou li.Data = nil
    PS: regarde TObjectList.Sort : la SortFunction prend en parametre des pointers qui sont en fait des TObect

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    pour reprendre ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      //le tableau ne sert plus
      For i := MDIChildCount-1 DownTo 0 do begin // Lister toutes les fenêtres actives
        if MDIChildren[i] is TFrmVm then  //verif que le child herite de TFrmVm
        begin
          li := lvEnCours.Items.Add;
          li.Caption := TfrmVm(MDIChildren[i]).myOffre.lib;
          li.Data := Pointer(MDIChildren[i]); // stock directement le pointeur vers la form
         end; //if
      end; //for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TfrmMain.lvEnCoursSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
    var i: Integer;
    begin
      inherited;
      if Selected then 
      begin
        if Assigned(Item) and Assigned(Item.Data) then
        begin
          TfrmVm(Item.Data).BringToFront;
        end;
      end;
    end;
    ce qui me parrait nettement plus simple

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Effectivement,

    Merci à tous pour votre participation.

    David.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/09/2009, 10h35
  2. envoyer du texte à une forme par son nom
    Par lucfrfr dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/11/2007, 11h28
  3. Réponses: 3
    Dernier message: 02/04/2007, 20h37
  4. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34

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