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 :

Shape sur Stringgrid spécifique (probleme de calcul du visible)


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 Shape sur Stringgrid spécifique (probleme de calcul du visible)
    Bonjour à toutes et à tous

    Suite à cette discution :

    http://www.developpez.net/forums/d63...ent-composant/

    Voici mon problème.

    Je pose dynamiquement des Shapes sur un stringgrid, la taille de ces Shapes peuvent varier.
    Si mon StringGrid fait par exemple 200 colonnes et que je scroll horizontalement, au fur et à mesure que j'avance mes Shapes disparaissent (normal) mais sur des Shapes de grand taille (aussi grand que 6 colonnes par exemple) ils disparaissent automatiquement du fait du traitement spécifique que j'impose, mais je n'arrive pas à résoudre ce problème faire en sorte qu'ils disparaissent progressivement.

    Voilà mon StringGrid spécifique

    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
    type
     
      TStringGridRu = class(TStringGrid)
      private
        { Déclarations privées }
      protected
        { Déclarations protégées }
         procedure WMVSCROLL(var Message :TMessage); message WM_VSCROLL;
         procedure WMHSCROLL(var Message :TMessage); message WM_HSCROLL;
         procedure WMMOUSEWHEEL(var Message :TMessage); message WM_MOUSEWHEEL;
         procedure WMKEYDOWN(var Message :TMessage); message WM_KEYDOWN;
      public
        { Déclarations publiques }
          procedure CheckInBounds;
      published
        { Déclarations publiées }
        property Option : Byte read foption write foption;
      end;
     
    procedure Register;
     
    implementation
     
    procedure  TStringGridRu.WMHSCROLL(var Message :TMessage);
    begin
      inherited;
      CheckInBounds;
      Invalidate;
    end;
     
    procedure  TStringGridRu.WMVSCROLL(var Message :TMessage);
    begin
      inherited;
      CheckInBounds;
      Invalidate;
    end;
     
    procedure TStringGridRu.WMMOUSEWHEEL(var Message: TMessage);
    begin
      inherited;
      CheckInBounds;
      Invalidate;
    end;
     
    procedure TStringGridRu.WMKEYDOWN(var Message: TMessage);
    begin
      inherited;
      case Message.WParam of
        33,34,35,36,37,38,39,40:
        begin
          CheckInBounds;
          Invalidate;
        end;
      end;
    end;
     
     
    procedure TStringGridRu.CheckInBounds;
    var
      i,j   :Integer;
      RowDebut :integer;
      RowFin   :integer;
      NbLigneinvisible :integer;
     
      Row :integer;
      Col :integer;
     
    begin
     
    // inventer par AndNotOr, retouché par Buzz
     
         //Liste des Shapes
          for i := 0 to ControlCount -1 do
          begin
            Col := HiWord(Controls[i].Tag);
            Row := LoWord(Controls[i].Tag);
     
          //Liste des Shapes
    //Cache le Shape si la ligne est masquée ou le positionne
            Controls[i].Visible := CellRect(Col,Row).Top > 0;
            Controls[i].Left    := CellRect(Col,Row).Left;
            Controls[i].Top     := CellRect(Col,Row).Top;
     
          end;
     
    end;
     
    procedure Register;
    begin
      RegisterComponents('RuCompos', [TStringGridRu]);
    end;
    Donc admettons que mon Stringgrid face 200 colonnes et que je créé dessus dynamiquement des shapes:

    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
    // ...
            while not Eof do
            Begin
              Shape1 := TShapeRu.Create(StringGridSynthese);
              With Shape1 do
              Begin
                ParentFont        := False;
     
                Caption           := '';
     
                Height := StringGridSynthese.DefaultRowHeight;
                Width  := FieldByName('Taille').AsInteger;
     
                Tag               := MakeLong
                  (
                  CalculRow(FieldByName('CodeWhere').AsString),
                  (DaysBetween(xDateDebutPlusTot,FieldByName('DateDebut').AsDateTime)+1)
                  );
     
                ParentShowHint    := False;
                ParentCustomHint  := True;
                ShowHint          := True;
     
                Hint := Hint + 'Double-clique pour plus de détail.';
     
                OnMouseDown       := Self.ShapeSyntheseMouseDown;
                OnMouseUp         := Self.ShapeSyntheseMouseUp;
                OnMouseMove       := Self.ShapeSyntheseMouseMove;
                OnMouseLeave      := Self.ShapeSalarieMouseLeave;
     
                Parent            := StringGridSynthese;
              End;
              next;
            End;
            StringGridSynthese.CheckInBounds;
          End;
    // ...
    end;
    Ici la taille (le Width) peut varier de ColWidthdefaut * 1 à *6
    Le tag quand à lui retourne la colonne (de début) et la ligne où se trouvera le shape apres l'evenement Checkinbounds.

    Donc lorsque je scroll en horizontal, le shape ou les shape se déplacent normalement, ensuite si les colonnes disparaissent au fur et à mesure ou je me déplace les shapes également disparaissent lorsque leur début de colonne est <= 0 mais si le shape est sur 5 colonnes il disparait tout de suite au lieu d'avoir quelquechose de progressif.

    J'ai réussi à le faire dans le Scroll Vertical comme ceci :

    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
          for i := 0 to ControlCount -1 do
          begin
            RowDebut := Controls[i].Tag;
            RowFin   := (Controls[i].Height div DefaultRowHeight) + RowDebut;
     
            nbligneinvisible := 0;
            for j := RowDebut to RowFin  do
            begin
              if CellRect(0,j).bottom = 0
              then nbLigneinvisible := nbligneinvisible + 1
              else break;
            end;
     
            if nbligneinvisible > 0
            then Controls[i].Top := -(DefaultRowHeight * nbligneinvisible)
            else Controls[i].Top := CellRect(0, RowDebut).Top;
     
          end;
    Mais en horizontal, c'est le délire...

    Merci pour vos lumières.

  2. #2
    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
    Toujours pas réussi

    Avez-vous un exemple de code qui permettrait lors d'un scroll horizontal d'un stringgrid de cacher progressivement les controls ?

  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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/02/2013, 04h31
  2. [Débutant] probleme pour calcul d'une somme et questions sur methologie
    Par le beauceron dans le forum C#
    Réponses: 4
    Dernier message: 05/03/2012, 11h02
  3. probleme de calcul sur un champs monétaire
    Par tarmo57 dans le forum Débuter
    Réponses: 2
    Dernier message: 30/10/2008, 11h11
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 16h52
  5. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 17h46

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