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 :

StringGrid


Sujet :

Composants VCL Delphi

  1. #21
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut, ...et surtout merci pour ces éloges

    Le type TZoneFusionnée est un type enregistrement (record), donc celà se gère comme un type de variable tout simple comme peuventt l'être un integer, un boolean...,
    ... mais ce n'est pas une classe. C'est pour celà que tu ne peux pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaZone := TZoneFussionnee.create(self);
    Bref, un type TZoneFussionnee se déclare comme un integer ou un boolean, et après, c'est près à l'emploi ! Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var MaZone:TZoneFussionnee;
    begin
      MaZone.ColLeft:=2;
    end;

    Si tu veux gérer une Liste de Zones, tu peux creer une classe dérivée de TList qui fonctionne comme un TStringList :

    Dans la partie interface de ton code, tu déclares :
    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
     
    type
      TZoneList = class( TList )
      private
        procedure SetZone( Index: Integer; Value: TZoneFusionnee );
        function  GetZone( Index: Integer ): Integer;
      public
        procedure Add( AZone: TZoneFusionnee );
        function  First: TZoneFusionnee;
        function  Last: TZoneFusionnee;
        function  IndexOf( AZone: TZoneFusionnee ): Integer;
        procedure Insert( Index: Integer; AZone: TZoneFusionnee );
        function  Remove( AZone: TZoneFusionnee ): Integer;
     
        property Integers[Index: Integer]: Integer read GetZone write
    SetZone; default;
      end;
    Dans la partie implementation de ton code, tu déclares :
    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
    //Implementation de TZoneList
    procedure TZoneList.SetZone( Index: Integer; Value: TZoneFusionnee );
    begin
      inherited Items[Index] := Pointer( Value );
    end;
     
    function TZoneList.GetZone( Index: Integer ): Integer;
    begin
      Result := Integer( inherited Items[Index] );
    end;
     
    procedure TZoneList.Add( AZone: TZoneFusionnee );
    begin
      inherited Add( Pointer(AZone) );
    end;
     
    function TZoneList.First: TZoneFusionnee;
    begin
      //if (Count > 0) then
        Result := Integers[0];
    end;
     
    function TZoneList.Last: TZoneFusionnee;
    begin
      //if (Count > 0) then
        Result := Integers[Count-1];
    end;
     
    function TZoneList.IndexOf( AZone: TZoneFusionnee ): Integer;
    begin
      Result := inherited IndexOf( Pointer(AZone) );
    end;
     
    procedure TZoneList.Insert( Index: Integer; AZone: TZoneFusionnee );
    begin
      inherited Insert( Index, Pointer(AZone) );
    end;
     
    function TZoneList.Remove( AZone: TZoneFusionnee ): Integer;
    begin
      Result := inherited Remove( Pointer(AZone) );
    end;
    Tu peux bien sur mettre tout ça dans une unité séparée, ou mieux, l'ajouter a l'unité UnitFusionStringGrid que j'ai déjà développé dans ce thread.

    Bon dev
    Bidouilleuse Delphi

  2. #22
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Merci beucoup waskol .C'est exactement le code dont j'ai besoin.
    Par contre j'ai quelques erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Integers[Index: Integer]: Integer read GetZone write SetZone; default;
    me renvoyait une erreur, j'ai remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Integers[Index: Integer]: TZoneFusionnee read GetZone write SetZone; default;
    Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inherited Items[Index] := Pointer( Value );
    me renvoit transtypage incorrect. (idem pour d'autres lignes suivantes)

    J'ai regardé l'aide de delphi sur TList et sur les pointeurs, cela m'a permis de m'éclairer; un pointeur peut pointer sur n'importe quel type, mais je t'avoue que j'ai beaucoup de mal avec les pointeurs

  3. #23
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Oui, j'ai "pondu" le code à lamain avec NotePad (vite fait mal fait ).

    J'étais un peu préssé, donc...

    En tout cas voici le code pour de bon et qui marche (j'ai enlevé l'inutile) :
    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
     
    Type
      PZoneFusionnee=^TZoneFusionnee;
      TZoneList = class( TList )
      private
        procedure SetZone( Index: Integer; Value: TZoneFusionnee );
        function  GetZone( Index: Integer ): TZoneFusionnee;
      public
        procedure Add( AZone: TZoneFusionnee );
        function  First: TZoneFusionnee;
        function  Last: TZoneFusionnee;
        procedure Insert( Index: Integer; AZone: TZoneFusionnee );
        property Zones[Index: Integer]: TZoneFusionnee read GetZone write
    SetZone; default;
      end;
    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
    procedure TZoneList.SetZone( Index: Integer; Value: TZoneFusionnee );
    begin
      inherited Items[Index]:=@Value;
    end;
     
    function TZoneList.GetZone( Index: Integer ): TZoneFusionnee;
    begin
      Result := TZoneFusionnee( inherited Items[Index]^ );
    end;
     
    procedure TZoneList.Add( AZone: TZoneFusionnee );
    var P: PZoneFusionnee;
    begin
      New(P);
      P^ := AZone;
      inherited Add(P);
    end;
     
    function TZoneList.First: TZoneFusionnee;
    begin
      if (Count > 0)
      then result := Zones[0];
    end;
     
    function TZoneList.Last: TZoneFusionnee;
    begin
      if (Count > 0)
      then result := Zones[Count-1];
    end;
     
    procedure TZoneList.Insert( Index: Integer; AZone: TZoneFusionnee );
    var P: PZoneFusionnee;
    begin
      New(P);
      P^ := AZone;
      inherited Insert(Index,P);
    end;
    Avec ça, tu devrais t'en sortir
    Bidouilleuse Delphi

  4. #24
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    MERCI BEAUCOUP!!!!!!!

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Désolé de m'inviter dans votre post mais moi je veux simplement centrer les données de ma StringGrid.

    Dites moi que le code est plus simple que ce que j'ai lu jusqu'à maintenant, non ?

    merci

  6. #26
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Caro
    Bonjour,

    Désolé de m'inviter dans votre post mais moi je veux simplement centrer les données de ma StringGrid.

    Dites moi que le code est plus simple que ce que j'ai lu jusqu'à maintenant, non ?

    merci
    Oui, c'est beaucoup plus simple

    D'ailleurs, tu aurais pu trouver la réponse dans la , ici :
    Comment centrer le texte d'un TStringGrid ?

    Sinon, tu peux toujours réutiliser 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
    type
      TAlignementVertical=(alVTop,alVCenter,alVBottom);
      TAlignementHorizontal=(alHLeft,alHCenter,alHRight);
      TJustification=(JustLeft,JustCenter,JustRight);
     
    ...
    procedure DessineTexteMultiligne(AString: string;ACanvas:TCanvas;ARect: TRect;
                           AlignementHorizontal:TAlignementHorizontal;
                           AlignementVertical:TAlignementVertical;
                           TextJustification:TJustification);
    var
      AHeight,AWidth:integer;
      Rect,oldClipRect:TRect;
      ATop,ALeft,H,W:Integer;
      AText:string;
      JustificationDuTexte:Integer;
      MyRgn:HRGN;
    begin
      with ACanvas do
      begin
        Lock;
        AHeight:=ARect.Bottom-ARect.Top;
        AWidth:=ARect.Right-ARect.Left;
        //on calcule la taille du rectangle dans lequel va tenir le texte
        W:=TextSize(AString,ACanvas.Font).X;
        H:=TextSize(AString,ACanvas.Font).Y;
     
        //on calcule la position (Haut,Gauche) du rectangle dans lequel va tenir le texte
        //en fonction de l'alignement horizontal et vertical choisis
        ATop:=ARect.Top;
        ALeft:=ARect.Left;
     
     
        case AlignementVertical of
          alVBottom : ATop:=ARect.Bottom-H;
          alVCenter : ATop:=ARect.Top+((AHeight-H) div 2);
          alVTop    : ATop:=ARect.Top;
        end;
     
        case AlignementHorizontal of
          alHLeft  : ALeft:=ARect.Left;
          alHCenter: ALeft:=ARect.Left+(AWidth-W) div 2;
          alHRight : ALeft:=ARect.Right-W;
        end;
     
        //Fin du calcul du rectangle, on met le resultat dans Rect
        Rect:=Bounds(ALeft,ATop,W,H);
     
        //On rempli le rectangle de la zone sinon on voit le texte que delphi à dessiné
        FillRect(ARect);
     
        //On détermine les paramètres de justification à passer à Windows
        case TextJustification of
          JustLeft  : JustificationDuTexte:=DT_LEFT;
          JustCenter: JustificationDuTexte:=DT_CENTER;
          JustRight : JustificationDuTexte:=DT_RIGHT;
        end;
     
        //Si le texte est plus grand que notre zone, on prend cette précaution (Clipping)
        with ARect do MyRgn :=CreateRectRgn(Left,Top,Right,Bottom);
        SelectClipRgn(Handle,MyRgn);
     
        //On dessine le texte
        DrawText(Handle,PChar(AString),-1,Rect,JustificationDuTexte or DT_NOPREFIX or DT_WORDBREAK );
     
        //On a plus besoin de la zone de clipping
        SelectClipRgn(Handle,0);
        DeleteObject(MyRgn);
        Unlock;
      end;
    end;
    Et l'utiliser 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
    19
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);
    begin
      With Sender As TStringGrid Do With Canvas Do
      Begin
        { Sélection de la couleur de fond }
        If gdFixed in State Then
          Brush.Color := clBtnFace
        Else If gdSelected In State Then
                Brush.Color := clNavy
              Else Brush.Color := clWhite;
     
        { Sélection de la couleur de texte }
        If gdSelected In State Then
          SetTextColor(Canvas.Handle,clWhite)
        Else SetTextColor(Canvas.Handle,clBlack);
     
        { Dessin du texte }
        DessineTexteMultiligne(Cells[ACol,ARow],Canvas,alHCenter,alVCenter,JustCenter);
    end;
    Voilà, voilà...
    Bidouilleuse Delphi

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Points : 61
    Points
    61
    Par défaut
    Ca y est une partie est faite ... quoi dire ? Merci tout simplement, car ca marche nickel !!!! Ton premier code, ne reactualisait pas les cellules, le nouveau si !!!

    Bon boulot !!!

  8. #28
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Merci à toutes et à tous pour vos remerciements, ça fait plaisir de voir que l'on a fait plaisir

    Sinon, pour yanba : je crois que ça mérite un petit tag non ?
    Bidouilleuse Delphi

  9. #29
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tu es toujours aussi génial

    Tu nous le mets quand en sources? Avec documentation et tout ce qu'il faut?


  10. #30
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Caine
    Tu es toujours aussi génial

    Tu nous le mets quand en sources? Avec documentation et tout ce qu'il faut?

    Merci,merci...

    Pour les sources et tout et tout, il va falloir attendre un peu, ça vient doucement...
    Je passe un examen professionnel dans 2 semaines, donc sérieux, je suis ces prochains jours replongé dans mes bouquins...

    Ca va venir, j'ai plein de "trucs" sur le feu en ce moment donc je sérialise....
    Bidouilleuse Delphi

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Points : 61
    Points
    61
    Par défaut
    Excuse moi, c'est fait ! Résolu ...

    Décidemment, pour une question toute bete, que d'emules et d'éloges !!!

    J'en suis jaloux !!!

  12. #32
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Petite mise à jour !

    l'unité qui je vous ai proposé en page 1 de ce thread a été mise à jour, vous la localiserez avec ceci :
    [Mis à Jour le 4/3/2006]
    Maintenant, les cellules sont correctement dessinées même si elles ne sont visibles que partiellement grace à l'ajout d'une procedure CalcRect qui remplace plus qu'avantageusement la méthode TStringgrid.CellRect()

    Vous pouvez donc jouer maintenant avec les scrollbars de votre StringGrid sans que ce soit moche à voir... On arrète pas le progrès.

    Pour les Sources du site www.developpez.com, je prépare un "petit" composant TFusionStringGrid qui intègrera tout ça pour une utilisation plus simple de la "chose"...

    Bon dev
    Bidouilleuse Delphi

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. StringGrid sort
    Par clovis dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/10/2004, 21h46
  2. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  3. Déplacer la sélection d'une ligne dans un stringgrid
    Par jer64 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/03/2003, 00h57
  4. Multi lignes dans un StringGrids ?
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/11/2002, 23h15
  5. StringGrid et colonnes
    Par Delph dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/08/2002, 11h35

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