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

Composants VCL Delphi Discussion :

position d'une cellule dans un stringgrid


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut position d'une cellule dans un stringgrid
    Bonjour a tous...

    Voici mon problème : je cherche a récupérer dans une variable la position ( top , left) de la cellule sélectionnée dans un stringgrid. J'ai eu beau chercher sur différents forums et examiner pas mal de codes, j'ai pas trouver quelque chose pouvant me mettre sur la voie

    Quelqu'un aurait une idée?

    Merci beaucoup d'avance...

  2. #2
    Membre habitué Avatar de neodelphi2007
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 202
    Points : 179
    Points
    179
    Par défaut
    Salut,

    Tu veux Top et Left en pixel ?

    Voici une proposition de code en utilisant l'évenement OnSelectCell et la méthode CellRect du composant TStringGrid:

    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
     
     
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
                                                   var CanSelect: Boolean);
              var
                 R:TRect;
    begin
         R:=StringGrid1.CellRect(ACol, ARow);
     
         // afficher la valeur Left en pixel de la cellule sélectionnée
         Label1.Caption:='Left:'+IntToStr(R.Left);
     
         // afficher la valeur Top en pixel de la cellule sélectionnée
         Label2.Caption:='Top:'+IntToStr(R.Top);
    end;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut merci
    Citation Envoyé par neodelphi2007 Voir le message
    Salut,

    Tu veux Top et Left en pixel ?

    Voici une proposition de code en utilisant l'évenement OnSelectCell et la méthode CellRect du composant TStringGrid:

    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
     
     
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
                                                   var CanSelect: Boolean);
              var
                 R:TRect;
    begin
         R:=StringGrid1.CellRect(ACol, ARow);
     
         // afficher la valeur Left en pixel de la cellule sélectionnée
         Label1.Caption:='Left:'+IntToStr(R.Left);
     
         // afficher la valeur Top en pixel de la cellule sélectionnée
         Label2.Caption:='Top:'+IntToStr(R.Top);
    end;

    Merci beaucoup... C'est exactement ce dont j'avait besoin...

    En fait le code renvoie la position de la cellule dans le stringgrid.
    Pour savoir la position de la cellule dans la forme, un simple calcul suffit :

    showmessage('cellule top: '+ inttostr(sg1.Top+R.Top));
    showmessage('cellule left: '+ inttostr(sg1.left+R.left));

    Comme quoi je suis encore loin d'avoir fait le tour de Delphi...

    Encore merci a toi neodelphi2007 et bonne journee..

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 698
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 698
    Points : 13 137
    Points
    13 137
    Par défaut
    Ton calcul fonctionne si la fiche est le parent du StringGrid. Sinon ton résultat sera faussé (ex. StringGrid dans un Panel) .

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonsoir,
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
    var CanSelect: Boolean);
    var
    R:TRect;
    begin
    R:=StringGrid1.CellRect(ACol, ARow);

    // afficher la valeur Left en pixel de la cellule sélectionnée
    Label1.Caption:='Left:'+IntToStr(R.Left);

    // afficher la valeur Top en pixel de la cellule sélectionnée
    Label2.Caption:='Top:'+IntToStr(R.Top);
    end;
    showmessage('cellule top: '+ inttostr(sg1.Top+R.Top));
    showmessage('cellule left: '+ inttostr(sg1.left+R.left));
    Ton calcul fonctionne si la fiche est le parent du StringGrid. Sinon ton résultat sera faussé (ex. StringGrid dans un Panel)
    @Andnotor: le calcul fonctionne correctement même si un "StringGrid" est dans un "panel".

    A+

    NABIL74

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    bonsoir,






    @Andnotor: le calcul fonctionne correctement même si un "StringGrid" est dans un "panel".

    A+

    NABIL74
    Dans un panel je ne sais pas mais dans mon cas il se trouve dans pagecontrol et le calcul est bel et bien faussé mais je l'ai corriger depuis en jouant
    sur la position du pagecontrol dans la forme ainsi que sur ses dimensions... Enfin ca marche quoi

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 698
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 698
    Points : 13 137
    Points
    13 137
    Par défaut
    @Andnotor: le calcul fonctionne correctement même si un "StringGrid" est dans un "panel".
    Non parce que le left/top d'un contrôle est relatif à son parent. Dans le cas d'un seul panel (A moins bien sûr que le panel soit en alClient, TopLeft=0,0), ce serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    showmessage('cellule top: '+ inttostr(Panel1.Top +sg1.Top +R.Top));
    showmessage('cellule left: '+ inttostr(Panel1.Left +sg1.left +R.left));
    Dans ce genre de cas, on a meilleur temps de passer par les coordonnées écran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with Form1.ScreenToClient(sg1.ClientToScreen(R.TopLeft)) do
    begin
      Label1.Caption:= Format('Left: %d', [X]);
      Label2.Caption:= Format('Top: %d', [Y]);
    end;

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Non parce que le left/top d'un contrôle est relatif à son parent. Dans le cas d'un seul panel (A moins bien sûr que le panel soit en alClient, TopLeft=0,0), ce serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    showmessage('cellule top: '+ inttostr(Panel1.Top +sg1.Top +R.Top));
    showmessage('cellule left: '+ inttostr(Panel1.Left +sg1.left +R.left));
    Dans ce genre de cas, on a meilleur temps de passer par les coordonnées écran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with Form1.ScreenToClient(sg1.ClientToScreen(R.TopLeft)) do
    begin
      Label1.Caption:= Format('Left: %d', [X]);
      Label2.Caption:= Format('Top: %d', [Y]);
    end;

    Comme quoi on en apprend tous les jours...

    Merci du tuyau, je vais modifier mon code de suite histoire qu'il soit 1 peu plus clair....

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2009, 15h07
  2. selectionner une cellule dans un stringGrid
    Par zanzie dans le forum Débuter
    Réponses: 4
    Dernier message: 07/04/2009, 21h27
  3. ajouter une cellul dans stringGrid
    Par nessing dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2007, 01h19
  4. Editer ou non une cellule dans une stringGrid ?
    Par jamah dans le forum Composants VCL
    Réponses: 3
    Dernier message: 31/03/2006, 17h52
  5. Securiser une cellulle dans une stringGrid .
    Par jamah dans le forum Composants VCL
    Réponses: 2
    Dernier message: 25/01/2006, 15h38

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