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 :

Déplacement de Composant


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut Déplacement de Composant
    Bonsoir tout le monde.

    J'essai de faire déplacer des panels qui sont enfant d'un strinGgrid selon le scroll horizontale.
    Voilà mon code :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, ExtCtrls, ComCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        Panel1: TPanel;
        Panel2: TPanel;
        StringGrid1: TStringGrid;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid1TopLeftChanged(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      Panel : Tpanel;
      MemoRow : Integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var
    i: Integer;
    begin
      StringGrid1.colCount := 63;
      StringGrid1.RowCount := 63;
      StringGrid1.DefaultColWidth := 20;
      StringGrid1.DefaultRowHeight := 20;
      For i:=1 to 62 do
      Begin
        StringGrid1.Cells[i,0] := IntToStr(i);
        StringGrid1.Cells[0,i] := IntToStr(i);
      end;
     
    Panel := TPanel.Create(Self);
    Panel.Parent := Self.StringGrid1;
    Panel.Name := 'ici1';
    Panel.Caption := 'ici1';
    Panel.Height := 20;
    Panel.Width := 30;
    Panel.Left := StringGrid1.ColWidths[1]*2;
    Panel.Top := StringGrid1.DefaultRowHeight;
     
    Panel := TPanel.Create(Self);
    Panel.Parent := Self.StringGrid1;
    Panel.Name := 'ici2';
    Panel.Caption := 'ici2';
    Panel.Height := 20;
    Panel.Width := 30;
    Panel.Left := StringGrid1.ColWidths[1]*10;
    Panel.Top := StringGrid1.DefaultRowHeight*2;
     
    Panel := TPanel.Create(Self);
    Panel.Parent := Self.StringGrid1;
    Panel.Name := 'ici3';
    Panel.Caption := 'ici3';
    Panel.Height := 20;
    Panel.Width := 30;
    Panel.Left := StringGrid1.ColWidths[1]*5;
    Panel.Top := StringGrid1.DefaultRowHeight*5;
     
     
    MemoRow := StringGrid1.LeftCol;
     
    end;
     
    procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
    Var
    OldRow : Integer;
    begin
     
      oldRow := StringGrid1.TopRow;
      if oldRow > MemoRow then
        Panel.Top := Panel.Top - StringGrid1.DefaultRowHeight
      else
        Panel.Top := Panel.Top + StringGrid1.DefaultRowHeight;
     
     
      MemoRow := oldRow;
      StringGrid1.Refresh;
    end;
     
    end.
    J'ai fais simple pour la création dynamique des panels. (En réalité je fais cela dans une boucle et je renseigne plus de paramètre).

    Le but de l'opération est que si je descend ou monte à l'aide de l'ascenseur, il faut que les objets enfant du StringGrid suivent proportionnellement.
    Donc à un moment ils disparaissent vers le haut ou vers le bas et réapparaissent etc...


    J'ai 2 problèmes :
    Le premier : Si vous utiliser les petits fleches noires du bas ou du haut Horizontale, seul le dernier Panel bouge et pas les 2 autres. Si j'essai de détecter les composants par components count, alors la le TOP des Panels est multiplié par 3.
    Est-il possible de faire ce que je cherche ? Déplacer les 3 Panels en même temps sachant qu'ils ont un TOP différent ?

    Le deuxième : Lorsque l'on clique sur les petits fleches noires du StrinGrid le déplacement est normale (hors Problemes 1) mais si on clique au milieu de la bar le déplacement le top des composants devient incohérent. Je n'arrive pas a trouver la bonne formule qui me garantirais le placement correcte des composants Enfants.

    Peut-être je fais une enorme erreur, n'hésiter pas de me dire si c'est idiot de ma part de faire cela !!!

    Merci de votre aide.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Je ne suis pas sûr que l'utilisation d'un StringGrid soit le plus adapté.

    Cepandant tu devrait essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Panel.BoundsRect := StringGrid.CellRect[aCol, aRow];

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Bonjour AndNotOr

    J'ai mis ta proposition sous cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Panel := TPanel.Create(Self);
    Panel.Parent := Self.StringGrid1;
    Panel.Name := 'ici3';
    Panel.Caption := 'ici3';
    Panel.Height := 20;
    Panel.Width := 120;
    //Panel.Left := StringGrid1.ColWidths[1]*5;
    //Panel.Top := StringGrid1.DefaultRowHeight*5;
    Panel.BoundsRect := StringGrid1.CellRect(5,5);
    Juste pour esseayer.

    Le problème cest que le Panel.Width n'ai pas respecté, la taille du panel est égale à la taille de la cellule. Tu le mettrais où le Panel.BoundsRect ?


    Tu dis que ce n'ai pas justicieux de prendre le StringGrid pour faire cela, a quoi pensez tu ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Le BoundsRect va setter la position et les dimensions du panel à la taille et positionnement de la cellule en une seule opération.

    Maintenant, il est clair que la cellule devrait avoir la taille finale souhaitée. Sinon tu dois t'amuser avec des modulos pour déterminer le TopLeft de la bonne cellule en fonction du facteur d'échelle (Panel/Cellule).

    Si le StringGrid sert uniquement à positionner les panels, tu devrais plutôt utiliser un TPanelGrid (en D2007) ou un TScrollBox (en D7). Les scrollings seraient ainsi gérés automatiquement.

    Dans le cas du TScrollBox, tu gères toi-même des lignes et des colonnes "virtuelles".

    Voici un exemple complet. Crée un nouveau projet, pose un TScrollBox et remplace le contenu de l'unité par ce code:
    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
    48
    49
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        ScrollBox1: TScrollBox;
        procedure FormCreate(Sender: TObject);
      public
        function CreatePanel(aCol, aRow :integer) :TPanel;
      end;
     
    var
      Form1: TForm1;
     
    const
      PanelSize :TPoint = (x:120; y:20);  //Taille des Panels
     
    implementation
     
    {$R *.dfm}
     
    { TForm1 }
     
    function TForm1.CreatePanel(aCol, aRow: integer): TPanel;
    begin
      Result := TPanel.Create(ScrollBox1);
      Result.Parent := ScrollBox1;
      Result.Left   := aCol *PanelSize.X;
      Result.Top    := aRow *PanelSize.Y;
      Result.Width  := PanelSize.X;
      Result.Height := PanelSize.Y;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Col :Integer;
      Row :Integer;
    begin
      for Col := 0 to 61 do
        for Row := 0 to 61 do
          CreatePanel(Col, Row);
    end;
     
    end.

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Merci pour tes réponses et proposition.

    Alors j'ai bien compris avc ton exemple l'avantage ici de placer les panels dans un scroolbox parent.

    Mais si tu veux je me sert du StringGrid pour plusieur raison
    - avoir des ligne et colonne fixed dans lequel je mets de titre
    - pour gere la position exxct de la souris pour permettre une saisie de tache, qui genere un Panel dont la principal utilisation est l'apparence d'une tache.

    regarde cela :


    Là tu as le StringGrid avec colonne et ligne, et par dessus des taches (colorées) qui sont en fait des PAnels (c'est beaucoup plus beau avec la verison acuelle hihihi).
    Mais je limite le nombre de ligne à 22 car si je laisse à l'infini je ne peut pas faire remonter mes panels ou l'inverse avec le scrollVert.

    Qu'est-ce que je peux faire ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Ok, je comprend mieux

    La première chose, remplace tes TPanel par des TShape. Tu y gagneras en rapidité. Seul le Caption devra être géré manuellement (avec DrawText pour un centrage).

    Ensuite, ne gère que la cellule 1 (lundi). Rien ne t'empêche de dessiner toute la ligne sur l'événement d'une seule cellule.

    Ne t'occupe pas des scrollbars. A la repeinture de la cellule 1 (OnDrawCell) Rect devrait te donner le positionnement correct (Top/Left).

    Il y aura tout de même une petite boucle à faire pour savoir si la cellule est visible ou non et le cas échéant, masquer le Panel (Shape).

    La taille du Shape (Panel) à un rapport Pixel/heure connu. Profites-en et ne t'occupe pas des cellules.

    Mais personnellement, je n'utiliserais pas du tout d'objet et ne gérerais que la peinture des cellules dans la couleur que je veux et le OnSelect ou un MouseDown pour déterminer si je suis sur une zone définie (occupée) et pour quelle personne

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

Discussions similaires

  1. NetBeans Visual Design: Modifier le pas de déplacement des composants
    Par JerryMouse dans le forum NetBeans Platform
    Réponses: 0
    Dernier message: 20/02/2011, 13h10
  2. Problème de déplacement de composants après updateUI()
    Par phoenix420 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 28/06/2010, 11h09
  3. Déplacement de composant hérité
    Par gudul dans le forum Delphi
    Réponses: 5
    Dernier message: 19/04/2007, 10h42
  4. [Image] scintillement lors déplacement sur autre composant
    Par lilou77 dans le forum Interfaces Graphiques en Java
    Réponses: 21
    Dernier message: 07/12/2005, 09h27
  5. Déplacement dynamique de composants à l'exécution
    Par tekilx dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/07/2005, 10h46

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