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 :

[0.9.31] Composant héritier de TStringGrid et RowCount


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut [0.9.31] Composant héritier de TStringGrid et RowCount
    Bonjour,

    Supposons un composant TmyStringGrid = class(TStringGrid)
    J'aimerais "surveiller" RowCount.

    Pour l'instant, j'override :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure ColRowDeleted(IsColumn: Boolean;index: Integer); override;
    procedure ColRowInserted(IsColumn: Boolean;index: Integer);override;         
    (* qui évidemment modifient RowCount si isColumn = False *)
    couplées à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure SizeChanged(OldColCount, OldRowCount: Longint); override;
    (* qui n'est pas modifiée par un appel à ColRowInserted : Curieux *)
    Naïvement, j'avais pensé qu'il était possible d'overrider SetRowCount... mais cela semble ne pas l'être.

    Dans mon composant, je modifie un SetLength(aArray, RowCount) où aArray est un tableau de Boolean si RowCount varie (d'où la "surveillance")... et ceci dès l'évènement Loaded. Y a-t-il une autre méthode que celle que j'utilise et que je trouve peu élégante ?

    Merci. Cordialement.
    Gilles
    Dernière modification par Alcatîz ; 29/10/2011 à 10h58. Motif: balises code

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Plutôt que de créer et gérer un second tableau, on peut associer un objet à chaque cellule, ou dans ton cas à chaque première cellule de chaque ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaTable.Objects[0,MaLigne] := TMonObjet.Create( MesParametres);
    Il faut évidemment penser à libérer les objets en même temps que les lignes ou colonnes.

    Cela se fait très bien dans un descendant, et rend inutile la "surveillance" de RowCount, qui semble effectivement problématique.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En effet, cela semble nettement plus élégant. je vais essayer d'intégrer cette approche.

    Cordialement. Gilles

  4. #4
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    L'inconvénient de cette méthode est que l'utilisateur risque de modifier la valeur de Object, et donc déclencher une erreur. Tu peux soit rendre cette propriété privée, soit il te faut trouver une solution de contournement ...

    Pour ton probleme, je ne vois pas comment faire par contre ...

    Bonne chance

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Mick605,

    Pour contourner j'utilise actuellement
    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
    private
        { Private declarations }
           bLineSelected : array of boolean; 
     
    procedure TmyStringGrid.SizeChanged(OldColCount, OldRowCount: Longint); {override}
    begin
     inherited;
     if not (csDesigning in ComponentState) then begin
      nbRow := RowCount;
      if nbRow > 0 then
       SetLength(bLineSelected, nbRow)
      else
       SetLength(bLineSelected, 1);
      FocusOnLine(FixedRows); {Nécessaire si FixedCols := 0; Bug Lazarus}
     end;
    end;
    Cela donne satisfaction mais... il faut gérer les
    • procedure ColRowDeleted(IsColumn: Boolean;index: Integer); override;
    • procedure ColRowInserted(IsColumn: Boolean;index: Integer);override;
    • procedure ColRowMoved(IsColumn: Boolean;FromIndex: Integer; ToIndex: Integer); override;
    ...si on veut maintenir la sélection persistante. L'avantage qu'aurait la méthode de Tintinux, c'est que si on associe l'objet à la ligne, je suppose qu'il la "suit" en cas de mouvement de la ligne, suppression...

    Je n'ai pas eu le temps de regarder et je ne comprends pas pleinement le problème que vous évoquez... Je vais chercher un peu de Doc, là-dessus.
    Cordialement. Gilles

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    La propriété Objects est une propriété publique. Et la méthode de Tintinux utilise la proprété Objects de la grille. Mais cette propriété est souvent utilisée par les utilisateurs. Donc, avec cette méthode, tu dois condamner l'utilisation de la propriété Objects par l'utilisateur (cad mettre cette propriété en private), sinon l'utilisateur risque de modifier tes valeurs.

    Mais je comprends tres bien que tu ne puisse faire autrement. C'est juste pour te prevenir des risques.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    OK, j'ai compris. Donc je ne l'utiliserai pas puisque ce "confort" ampute un autre potentiel. La gestion du Tableau de booleans ne pose pas vraiment de problème.

    Cordialement. Gilles

  8. #8
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Il existe quand même une technique pour pallier a ca. C'est pas spécialement propre, mais tu peux le faire :

    Le truc c'est de créer un TAnObject pour chaque case de ta grille, et de faire pointer la propriété Object de ta grille sur une propriété Data du TAnObject.

    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
      TAnObject = class
      private
        FMonBoolean : boolean;
        FData : TObject;
      public
        property MonBoolean : boolean read FMonBoolean write FMonBoolean;
        property Data : TObject read FData write FData ;
      end;
     
      TMyStringGrid = class
      private
        function GetObject(ACol, ARow : integer):TObject;
        procedure SetObject(ACol, ARow : integer; AObject : TObject);
      public
        property Objects [ACol, ARow : integer] : TObject read GetObject write   SetObject;
      end;
     
    ...
     
    function TMyStringGrid.GetObject(ACol, ARow : integer):TObject;
    begin
      Result:=TAnObject(TMyStringGrid.Objects[ACol,ARow]).Data;
    end;
     
    procedure TMyStringGrid.SetObject(ACol, ARow : integer; AObject : TObject);
    begin
      TAnObject(TMyStringGrid.Objects[ACol,ARow]).Data:=AObject;
    end;
    C'est peut être pas tres clair ...

    Bonne chance en tout cas

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/09/2014, 16h51
  2. Le composant TStringGrid
    Par ZenZiTone dans le forum Composants VCL
    Réponses: 3
    Dernier message: 02/04/2014, 14h41
  3. [Lazarus] [0.9.31] Override dans un composant TStringGrid. Questions diverses
    Par Invité dans le forum Lazarus
    Réponses: 4
    Dernier message: 04/11/2011, 09h40
  4. Rudiment composant TStringGrid
    Par bleuerouge dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/06/2008, 10h39
  5. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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