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 :

TStringGrid et Objects[aCol aRow]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut TStringGrid et Objects[aCol aRow]
    Bonjour,

    Suite à diverses discussions engagées récemment sur ce forum, j'ai regardé l'utilisation de TStringGrid et Objects[aCol, aRow]. J'ai obtenu un code qui fonctionne mais je comprends mal sa mécanique.

    Dans mon composant :
    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
    unit myStringGrid;
     
    {$mode objfpc}{$H+}    
    TClassAddOn = class(TObject)
       private
         Selected : Boolean;
       public
       ID       : string[20];
       StrBlob  : string;
     //  constructor Create(???); virtual;
      end;
     
      TmyStringGrid = class(TStringGrid)
      private
        { Private declarations }
      protected
        { Protected declarations }
        procedure SizeChanged(OldColCount, OldRowCount: Longint); override;
      public
        { Public declarations }
       published
        { Published declarations }
     end;
     
    {constructor TClassAddOn.Create(????);
    begin
       Selected := False;
       StrBlob:= '';
    end; }  
     
    constructor TmyStringGrid.Create(AOwner: TComponent);
    begin
        Inherited Create(AOwner);
    end;
     
    destructor TmyStringGrid.Destroy;
    begin
      inherited Destroy;
    end;    
     
    procedure TmyStringGrid.SizeChanged(OldColCount, OldRowCount: Longint);
    var
     i : integer;
    begin
     inherited;
     if not (csDesigning in ComponentState) then begin
      if OldRowCount < RowCount then
       for i := OldRowCount to RowCount -1 do
        if TClassAddOn(Objects[0,i]) = nil then Objects[0,i] := TClassAddOn.Create();
     end;
    end;   
    end.
    Utilisé ainsi par exemple de la Form,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin
     with myStringGrid1 do begin
     for i := FixedRows to RowCount -1 do
     Cells[2,i] := TClassAddOn(Objects[0,i]).StrBlob;
     end;
    end;
    Alors plusieurs questions :
    • Cela fonctionne sans le constructeur pour TClassAddOn. Est-ce normal ?
    • En supposant que l'on utilise un constructor TClassAddOn.Create(???), comment devrait-il être déclaré ?
    • Lors des appels à DeleteRows, le TClassAdOn[Objects[0,Arow]).Free est exécuté automatiquement. Normal ?
    • Le corollaire à ces 3 questions : est-ce pour cela qu'il me faut déclarer if TClassAddOn(Objects[0,i]) = nil then Objects[0,i] := TClassAddOn.Create(); dans TmyStringGrid.SizeChanged ?

    En résumé, je suis dans les clous ou à côté ? Et question subsidiaire et habituelle : où trouve-t-on de la Doc Lazarusienne... J'aimerais un peu structurer mes connaissances éparses en la matière. J'apprécie l'empirisme mais, même si j'ai la chance de disposer de pas mal de temps, il me semble inutile dans ce cas précis de le gaspiller.

    Doc Lazarusienne...et pas nécessairement "Delphienne", car par exemple, le code fourni par Mick605 (que je salue en passant) fonctionne probablement sous Delphi -si j'ai bien compris les quelques Posts que j'ai lus ici et là- mais pas sous Lazarus (ça c'est une certitude )
    Citation Envoyé par mick605 Voir le message
    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;
    L'erreur est provoquée par l'utilisation de TAnObject(TMyStringGrid.Objects[ACol,ARow]) pour être plus précis par le TMyStringGrid en lignes 22 et 27. Pourquoi ?
    Cordialement. Gilles
    Dernière modification par Invité ; 12/11/2011 à 11h51.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    cette discussion aborde les class helpers : http://www.developpez.net/forums/d11...elphi-amusant/ à voir si ça ne peut pas aider dans ton cas

    pour le constructeur, les champs de l'objet AddOn n'en nécessitant pas, celui de l'ancêtre (TObject) suffit s'il n'y a pas d'initialisations à faire

    sinon, pour ton projet, ne serait-il pas plus rentable de reprendre (presque) toute l'unité Grids en MyGrids, pour y transformer les getters, setters à loisir, en ayant accès aux méthodes et champs privés, etc ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Merci pour votre réponse.

    Partir de /lcl/grids.pas serait-il suffisant quant aux 2 problèmes rencontrés ?
    • Malgré son "apparentement" à une String, une Cells n'en est pas une : elle n'accepte pas les caractères nuls. Or TCellProps est défini dans Grids.pas. Cela se "patche" ? Désolé pour le manque de vocabulaire.
    • Le multiselect non contigu n'est pas géré naturellement. La propriété Objects ne semble pas adaptée car Public. Le TanObject de Mick605 qu'il qualifie lui-même de "pas spécialement propre" présente un problème sous Lazarus. Une colonne invisible peut-être ?

    Je continue à penser que le Grid.pas n'est pas le bon parent (le parent naturel) de TStringGrid qui est sa "fille pauvre". Il est adapté et probablement conçu au départ pour dbGrid...

    La Kgrid est "Written as TCustomControl descendant, this is not a TCustomGrid enhancement". Ses Cells sont de vraies String : elles acceptent les caractères nuls. J'ai testé la 1.7. L'affichage du Multiselect est géré dans la FixedRows mais reste forcément contigu.

    Je ne l'adopte pas pour plusieurs raisons :
    • La licence
      This code is distributed as a freeware. You are free to use it as part of your application for any purpose including freeware, commercial and shareware applications. The origin of this source code must not be misrepresented; you must not claim your authorship. You may modify this code solely for your own purpose. Please feel free to contact the author if you think your changes might be useful for other users. You may distribute only the original package. The author accepts no liability for any damage that may result from using this code.
    • Des bugs résiduels sous Gtk2 (d'ailleurs évoqués par son auteur)
    • Parfois des bugs avec les Svn même sous Windows
    • Incomplet pour mes besoins
    • La pérennité... et compte tenu de la licence.


    Donc pour l'instant, je pars de la StringGrid et je me débrouille tant bien que mal avec la doc. Cette page est significative : les liens qui y sont inclus ne mènent nul part...

    Le code que j'ai produit répond à mes besoins. Le seul moyen de l'optimiser et d'intégrer de nouvelles fonctions est de le comprendre parfaitement. Les invalidates, les constructions et libérations. Il y a des choses implicites... encore faut-il qu'elles soient inscrites quelque part... D'où ma demande et mon recours "massif" à ce forum.

    Maintenant, comme je l'avais un temps proposé à Chris, si certains veulent s'attaquer au problème des StringGrids communautairement, je suis prêt à participer. Ce qui me laisse perplexe chez les Lazarusiens, c'est que disposant d'un composant à mon avis mal abouti (au bout de 10 ans... et encore qui ne gère les colonnes invisibles que depuis 2 ans, cf une vieille discussion), comment ce problème est-il résolu par les utilisateurs de Lazarus ? Personne ne fait de multiselect non contigu ? Ou tout le monde a une solution évidente ? ... Ou trop peu utilisent Lazarus de manière assidue ? Ceci pourrait être la bonne explication.

    Cordialement. Gilles
    Dernière modification par Invité ; 12/11/2011 à 21h05.

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/11/2011, 13h31
  2. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  3. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21
  4. Delphi 7 et les TStringGrid
    Par Claude HENRY dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/05/2003, 09h18
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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