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 :

Panel aligné à droite d'une cellule d'une StringGrid


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut Panel aligné à droite d'une cellule d'une StringGrid
    Bonjour à tous,

    J'ai besoin de mettre un panel dans les cellules de la colonne 0 d'une StringGrid. Le panel est invisible jusqu'à ce que le pointeur de la souris arrive dans le dernier quart (approx) de la cellule. Le panel doit se mettre comme si nous pouvions faire un .Left (à droite sur la hauteur totale de la cellule). Chaque cellule de la colonne 0 est concernée. Le panel se comportera comme un bouton dans lequel je vais cliquer.

    Nom : Sans titre.png
Affichages : 78
Taille : 401 octets

    Je tourne en rond.
    J'arrive à mettre mon panel, à détecter ma position mais c'est de le caler style .left dans la cellule qui pose problème. Je n'arrive pas à avoir la position gauche exacte de la cellule.

    Je vous passe mon code, si quelqu'un à une idée.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    procedure TForm1.StringGrid1MouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
    Var
        ACol, ARow: Longint;
        ARect: TRect;
        ScreenPoint : TPoint;
        ClientPoint : TPoint;
        GridPoint : TPoint;
    begin
        StringGrid1.MouseToCell(X, Y, ACol, ARow);
     
        GetCursorPos(ScreenPoint);
        ARect:=StringGrid1.CellRect(ACol,ARow);
        ClientPoint := Panel5.ScreenToClient(ScreenPoint);
        GridPoint := StringGrid1.ScreenToClient(ScreenPoint);
     
    // Pour suivre la position et comprendre le truc
    Label7.Caption:=Format('Largeur %d - Left %d - Pt.X %d' ,[aRect.width, aRect.Left, ClientPoint.Y]);
    Label7.Update;
    Label8.Caption:=Format('Top %d - Bottom %d - Pt.Y %d - Panel.top %d' ,[aRect.Top, aRect.Bottom, ScreenPoint.Y, Panel_Liste1.Top]);
    Label8.Update;
     
    if (ARow>0)
        then begin
            if (ACol=0)
            then begin
                if (ClientPoint.X>=ARect.Left+ARect.width + StringGrid1.GridLineWidth - Image_Liste1.Width)
                and (ClientPoint.X<=ARect.Left+ARect.width)
                then begin
                    Panel_Liste1.Visible:=true;
                    Panel_Liste1.BringToFront;
                    Panel_Liste1.Width:=Image_Liste1.Width;
                    Panel_Liste1.Left:=aRect.Left + aRect.width + StringGrid1.GridLineWidth - Image_Liste1.Width;
                    Panel_Liste1.Top:= ClientPoint.Y; //(ScreenPoint.Y div (StringGrid1.DefaultRowHeight + StringGrid1.GridLineWidth))*(StringGrid1.DefaultRowHeight + StringGrid1.GridLineWidth)+1;
                    Panel_Liste1.Height:=StringGrid1.DefaultRowHeight;
                    StringGrid1.Invalidate;
                end
                else begin
                    Panel_Liste1.Visible:=False;
                    StringGrid1.Invalidate;
                end;
            end
            else begin
                Panel_Liste1.Visible:=False;
                StringGrid1.Invalidate;
            end;
        end;
    end;
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Faudra prévoir une largeur suffisante pour éviter que le Panel masque le texte.
    En général, je dessinais directement et gérer manuellement le Clic, ton besoin ressemble à faire un InplaceEditor de type ComboBox que l'on voit dans un TDBGrid via le TColumn.PickList

    CellRect(ACol, ARow) est plutôt fiable, je l'utilise aussi à la place du Rect fourni par OnDrawCell
    Cependant, je n'ai que mis des CheckBox au centre de la Cellule comme dans ce sujet


    Panel_Liste1 le plus simple c'est du lui affecter au RunTime le StringGrid1 comme Parent, cela évite des conversions de coordonnées Client<->Screen
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Merci ShaiLeTroll,
    tout fonctionne parfaitement du coup.

    Pour ceux que ça interesse :
    Suite à l'intervention de ShaiLeTroll j'ai mis dans le onCreate de la fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Panel_Liste1.Parent := StringGrid1;
    Puis j'ai corrigé le code comme suit (ligne corrigée en gras) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    procedure TForm1.StringGrid1MouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
    Var
        ACol, ARow: Longint;
        ARect: TRect;
        ScreenPoint : TPoint;
        ClientPoint : TPoint;
    begin
        StringGrid1.MouseToCell(X, Y, ACol, ARow);
     
        GetCursorPos(ScreenPoint);
        ARect:=StringGrid1.CellRect(ACol,ARow);
        ClientPoint := Panel5.ScreenToClient(ScreenPoint);
     
    // Pour suivre la position et comprendre le truc
    Label7.Caption:=Format('Largeur %d - Left %d - Pt.X %d' ,[aRect.width, aRect.Left, ClientPoint.Y]);
    Label7.Update;
    Label8.Caption:=Format('Top %d - Bottom %d - Pt.Y %d - Panel.top %d' ,[aRect.Top, aRect.Bottom, ScreenPoint.Y, Panel_Liste1.Top]);
    Label8.Update;
     
    if (ARow>0)
        then begin
            if (ACol=0)
            then begin
                if (ClientPoint.X>=ARect.Left+ARect.width + StringGrid1.GridLineWidth - Image_Liste1.Width)
                and (ClientPoint.X<=ARect.Left+ARect.width)
                then begin
                    Panel_Liste1.Visible:=true;
                    Panel_Liste1.BringToFront;
                    Panel_Liste1.Width:=Image_Liste1.Width;
                    Panel_Liste1.Left:=aRect.Left + aRect.width + StringGrid1.GridLineWidth - Image_Liste1.Width;
                    Panel_Liste1.Top:= (ClientPoint.Y div (StringGrid1.DefaultRowHeight + StringGrid1.GridLineWidth))*(StringGrid1.DefaultRowHeight + StringGrid1.GridLineWidth)+1;
                    Panel_Liste1.Height:=StringGrid1.DefaultRowHeight;
                    StringGrid1.Invalidate;
                end
                else begin
                    Panel_Liste1.Visible:=False;
                    StringGrid1.Invalidate;
                end;
            end
            else begin
                Panel_Liste1.Visible:=False;
                StringGrid1.Invalidate;
            end;
        end;
    end;
    Ainsi, le panel est coincé sur le coté droit de la cellule peu importe la position en Y de la souris.
    Top! Merci encore
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

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

Discussions similaires

  1. Centrer et aligner à droite sur une même ligne
    Par Frednight dans le forum Mise en forme
    Réponses: 2
    Dernier message: 05/07/2012, 12h25
  2. Alignement droite dans une jList
    Par RouRa22 dans le forum Composants
    Réponses: 1
    Dernier message: 03/11/2008, 17h39
  3. Alignement verticale dans une cellule td de tableau table
    Par Longrais dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/09/2005, 11h37
  4. Aligner du texte à gauche et à droite sur une même ligne ?
    Par pontus21 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 11h25
  5. aligner verticalement dans une cellule
    Par mic79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/12/2004, 10h52

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