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 :

Agir sur un composant par ses coordonnées [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Agir sur un composant par ses coordonnées
    Bonjour à tous,

    J'aimerais savoir s'il était possible d'agir sur un composant de type TImage ou autre, en connaissant ses coordonnées ?

    Utiliser son nom aurait été simple, mais j'ignore comment le 'récupérer'. Imaginer une grille sur laquelle vous cliquez sur une case, le nom de la case sélectionnée peut être récupérée, mais pas ceux des cases environnantes, d'où l'utilisation des coordonnées.

    A moins qu'il existe une autre solution.

    Merci

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par sebBastien Voir le message
    J'aimerais savoir si il est possible d'agir sur un Composant de type TImage ou autre, en connaissant ses coordonnées?
    Tous les contrôles descendant de TWinControl (TForm, TFrame, TPanel, TGroupBox, etc) possèdent les méthodes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function ControlAtPos(const Pos: TPoint; AllowDisabled: Boolean): TControl;
    function ControlAtPos(const Pos: TPoint; AllowDisabled, AllowWinControls: Boolean): TControl;
    function ControlAtPos(const Pos: TPoint; Flags: TControlAtPosFlags): TControl;
    ainsi qu'une fonction (à partir des coordonnées de l'écran):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function FindControlAtPosition(const Position: TPoint; AllowDisabled: Boolean): TControl;
    Philippe.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonsoir Philippe et merci pour cette réponse,

    Débutant dans ce langage de programmation, je n'ai pas compris le fonctionnement des fonctions, même avec l'aide de Google. Pourrais tu me donné un exemple dans lequel j'ai les coordonnées => Left : 210 et Top : 56, qui retournerait le nom du Composant qui s'y trouve?

  4. #4
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Voici une recherche de composant placé sur Form1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var
      C: TControl;
    begin
       // cherche un Tcontrol au point left top
       C:= ControlAtPos(Point(210, 56), true);
       if Assigned(C) then ShowMessage(C.Name); // le composant a été trouvé, affichage de son nom
    end;
    Remarque : le point left-top ne doit pas correspondre aux coordonnées exactes du TControl. Il suffit qu'il soit dans le rectangle de celui-ci.

    Thierry

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    En mettant le code dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure TForm1.Button1Click(Sender: TObject);
    Il fonctionne, mais je souhaiterais l'utiliser dans une procedure de ma création, qui ressemblerait à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure changeEmplacement(xLeft, yTop : string);
       var
       C: TControl;
     begin
        C:= ControlAtPos(Point(strToStr(xLeft), strToInt(yTop) ), true);
        if Assigned(C) then C.Left := 300;
    end;
    J'ai comme erreur: Idenfier not found "ControlAtPos".

  6. #6
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Comme l'a signalé Ph.B. , ControlAtPos est une méthode de la classe TWinControl et de ses descendants.

    Donc il faut "préfixer" cette méthode par le nom du composant parent.

    Form1.ControlAtPos --> correct
    Panel1.ControlAtPos --> correct
    ControlAtPos seul mais dans une procedure de Form1 (cfr mon exemple) --> correct, pcq la méthode va s'appliquer à Form1. J'aurais pu écrire "Form1.ControlAtPos, mais c'est superflu.

    Thierry

    Oups, je vois qu'entre temps tu as modifié ton message.
    Mais c'est bien ça ton erreur : pas de déclaration d'un composant utilisant la méthode.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Oups, je vois qu'entre temps tu as modifié ton message.
    Mais c'est bien ça ton erreur : pas de déclaration d'un composant utilisant la méthode.
    Effectivement, mon message à été modifier afin de vous montrer ce que je recherche à faire.

    Etant familier au Java et javaScript, j'ai tenté quelque tests pour déclarer le composant mais sans succès. Pourriez vous me dire comment fait on pour déclarer?

    Merci

  8. #8
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Je suppose que c'est une fiche (TForm) qui est le parent de tes composants (TImage, TShape...).
    Si tu n'as pas modifié le nom de cette fiche, elle s'appelle : Form1.

    Donc ta procedure devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure changeEmplacement(xLeft, yTop : string);
    var
       C: TControl;
    begin
        C:= Form1.ControlAtPos(Point(strToInt(xLeft), strToInt(yTop)), true);
        if Assigned(C) then C.Left := 300;
    end;
    Thierry

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Tout à fait, c'est un TForm1.

    Ce code avait été testé, j'ai comme messages d'erreur:
    Error: Only class class methods, class properties and class variables can be accessed in class methods
    Error: Only class methods, class properties and class variables can be referred with class references


    Mauvaise manipulation de ma part, ça semble fonctionner, je fais quelques tests.

    Grand merci à vous deux, ça fonctionne

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

Discussions similaires

  1. Booter sur kernel créé par ses mains
    Par Invité dans le forum Linux
    Réponses: 2
    Dernier message: 27/01/2011, 19h30
  2. Retrouver et agir sur un composant en ne connaissant que son nom littéral
    Par ProgElecT dans le forum Vos contributions VB6
    Réponses: 0
    Dernier message: 21/08/2010, 22h01
  3. focus sur un composant par defaut
    Par riadhhwajdii dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 19/10/2009, 10h51
  4. Agir sur un champ par la saisie d'un autre champ
    Par picatchou dans le forum Access
    Réponses: 11
    Dernier message: 12/09/2006, 07h41
  5. Placer une image à un endroit identifié par ses coordonnées
    Par sempire dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 16/11/2005, 22h19

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