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

Delphi Discussion :

Dérivation de classe


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut Dérivation de classe
    Bonjour,

    En FMX, je voudrais dériver la classe d'un composant visuel, TStringGid par exemple.
    Voici mon code où aucune erreur n'est détectée à la compilation mais je ne sais pas faire apparaître ma StringGrid. Quelqu'un peut-il m'aider ?
    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
    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.TMSBaseControl,
      FMX.Platform, FMX.StdCtrls, System.Rtti, FMX.Layouts, FMX.Grid;
     
    type
      TmyStringGrid = class(TStringGrid)
      private
        FProp: boolean;
        FList: TStrings;
      public
        constructor Create(AOwner:TComponent); override;
        destructor Destroy; override;
      published
        property Prop: boolean read FProp write FProp;
      end;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
     
       private
        { Déclarations privées }
     
       public
        { Déclarations publiques }
     
     end;
     
    var
      Form1: TForm1;
      Grid1 : TmyStringGrid;
    implementation
     
     
    {$R *.fmx}
     
    constructor TmyStringGrid.Create(AOwner:TComponent);
    begin
      inherited Create(AOwner);
      FProp := true;
      FList := TStringList.Create;
    end;
     
    destructor TmyStringGrid.Destroy;
    begin
      Flist.Free;
      inherited;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Grid1 := TmyStringGrid.Create(Self);
    end;
    Merci. Zac.

  2. #2
    Membre confirmé
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut
    Oups ! J'étais obnubilé par les styles et je pensais que là résidait le problème.
    En réalité, il manque un simple
    Quel nigaud !

  3. #3
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut Insérer les controles
    Il faut déterminer la propriété Parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Grid1 := TmyStringGrid.Create(Self);
      Grid1.Parent := Form1;
    end;
    ;

  4. #4
    Membre confirmé
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut
    • Form1 plutôt que Self. Ici ce n'est pas la même chose ?
    • Sinon avec Form1 ou Self, j'ai été un peu présomptueux. Je vois la Grid mais pas ses colonnes, ni l'entête et donc pas les cellules. Pourtant je récupère bien leur contenu si je fais par exemple
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Showmessage(Grid1.Cells[1, 1]);

  5. #5
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Zacheus Voir le message
    • Form1 plutôt que Self. Ici ce n'est pas la même chose ? ...
      [/CODE]
    J'étais en train de te répondre je n'avais pas vu ton deuxième message.
    Pour ce qui est de ta deuxième question. Copies nous le code du composant TStringGrid de base dans ton fichier FMX je vais regarder.

  6. #6
    Membre éclairé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 231
    Par défaut
    Salut,

    Je te conseil de prendre l'habitude de créer des classes dans une unité delphi à part : pour plus de lisibilité, de clarté.

    Voici un exemple de classe que je t'ai fais.
    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
    unit CustomComposant;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
      Generics.collections;
     
    type
      TPanelCustom = class(TPanel)
     
        LBL_Test : TLabel;
     
      private
        F_sTest : String;
     
      public
        Constructor CustomCreate(Owner : TComponent; sTest : String);
     
      published
        property ReadTest : String read F_sTest;
     
    end;
     
    implementation
     
    constructor TPanelCustom.CustomCreate(Owner : TComponent; sTest : String);
    begin
     
      inherited Create(Owner);
      Parent := Owner As TFmxObject;
     
      StyleLookup := 'blocpanel';
     
      F_sTest := sTest;
     
      LBL_Test := TLabel.Create(Self);
      With LBL_Test do
      begin
        Parent := Self as TFmxObject;
        Text := 'Test : ' + Chr(9) + sTest;
        Align := TAlignLayout.Center;
        TextSettings.Font.Size := 8;
      end;
    end;
     
    end.
    Et dans ta Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    uses CustomComposant;
     
    [...]
     
    procedure TForm1.OnShow(Sender: TObject);
    var
      CustomPanel : TPanelCustom;
    begin
      CustomPanel := TPanelCustom.CustomCreate(Self, 'Panel custom créer avec succès');
      CustomPanel.Align := TAlignLayout.Top;
    end;
    Voilà,
    Bonne chance pour la suite.

    @ALWEBER: Ne serait-il pas préférable de déterminer le parent dans le Constructeur ; plutôt que lors de la création du TmyStringGrid ? Car si l'on en crée plusieurs à différents endroits il faudra à chaque fois le ré-renseigné ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut
    Merci pour ces informations.

  8. #8
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut Question de parent
    Citation Envoyé par Martin Lestas Voir le message
    Salut,
    @ALWEBER: Ne serait-il pas préférable de déterminer le parent dans le Constructeur plutôt lors de la création du TmyStringGrid ? Car si l'on en crée plusieurs à différents endroits il faudra à chaque fois le ré-renseigné ?
    En général je dissocie les informations Owner et Parent car suivant le contexte l'information peut différer et le Owner peut être par exemple à NIL.
    Mais tu peux effectivement positionner cette information par défaut dans le create si owner n'est pas à nil

  9. #9
    Membre confirmé
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut Résultat obtenu par votre aide pour éventuelle(s) correction(s)
    Cela semble être rentré dans l'ordre :
    Unit1.pas
    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
    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti,
      FMX.Layouts, FMX.Grid, Umystringgrid;
     
    type
      TForm1 = class(TForm)
        Grid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        procedure LoadGrid(aGrid: TStringGrid; X,Y,W,H: Single);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      Grid2 : TmyStringGrid;
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      LoadGrid(Grid1, 10, 10, 206, 220);
     
      Grid2 := TmyStringGrid.Create(self);
        With Grid2 do
          begin
            Parent := Self;    { Bien lu les remarques - A peser }
            LoadGrid(Grid2, 340, 10, 206, 220);
          end;
    end;
     
    procedure TForm1.LoadGrid(aGrid: TStringGrid; X,Y,W,H: Single);
    var
      aCol, aRow: Integer;
    begin
      with aGrid do
        begin
          Position.X  := X;
          Position.Y  := Y;
          Width       := W;
          Height      := H;
          Options     := Options + [TGridOption.RowSelect];
     
          AddObject(TStringColumn.Create(self));
          AddObject(TStringColumn.Create(self));
          Columns[0].Width  := 100;
          Columns[1].Width  := 100;
          Columns[0].Header := 'NOM';
          Columns[1].Header := 'Prénom';
     
          RowCount := 4;
          aCol := 0;
          for aRow := 0 to 3 do
            Cells[aCol, aRow] := 'DALTON';
          aCol := 1;  aRow  := 0;
          Cells[aCol, aRow] := 'Joe'; inc(aRow);
          Cells[aCol, aRow] := 'William'; inc(aRow);
          Cells[aCol, aRow] := 'Jack'; inc(aRow);
          Cells[aCol, aRow] := 'Averell';
      end;
    end;
     
    end.
    Umystringgrid.pas
    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
    unit Umystringgrid;
     
    interface
     
    uses
      System.Classes, System.UITypes, FMX.Types, FMX.Graphics, FMX.objects,
      System.SysUtils, System.Types,   System.Variants,
      FMX.Controls, FMX.Forms,  FMX.Dialogs,
      FMX.Platform, FMX.StdCtrls, System.Rtti, FMX.Layouts, FMX.Grid;
     
    type
      TmyStringGrid = class(TStringGrid)
      private
        FProp: boolean;
        FList: TStrings;
      public
        constructor Create(AOwner:TComponent); override;
        destructor Destroy; override;
      published
        property Prop: boolean read FProp write FProp;
      end;
     
    implementation
     
    constructor TmyStringGrid.Create(AOwner:TComponent);
    begin
      inherited Create(AOwner);
      FProp := true;
      FList := TStringList.Create;
    end;
     
    destructor TmyStringGrid.Destroy;
    begin
      Flist.Free;
      inherited;
    end;
     
    end.
    Les uses ont servi à d'autres choses. Certaines classes ne sont peut-être (même certainement) pas nécessaires.

    J'ai 2 questions supplémentaires : j'ai utilisé Lazarus avec lequel j'ai créé des composants. J'avais un peu oublié après un "petit" mais intense passage par C#. L'inspecteur d'objet est quand même bien pratique pour concevoir. Donc pouvoir intégrer la classe dérivée comme composant est à envisager.
    • Je n'ai pas besoin de changer les styles de mon composant myStringrid, plus exactement je veux pouvoir bénéficier de ceux de TStringGrid. Il y a quelque chose à faire, à préciser ? En clair, est-ce qu'on hérite des styles automatiquement, en ajoutant quelques commandes ? Ou pas du tout, il faut construire un (des) fichier(s).style à la main ?
    • Ensuite, j'aimerais trouver un pas à pas complet pour intégrer le composant dans l'IDE. J'ai bien lu celui d'Embarcadero mais je le trouve superficiel. Par exemple l'icône du composant, quel format, on l'intègre comment ? Que met-on exactement dans le fichier ressource (hormis l'icône et éventuellement les styles) ?

    Sachant que je n'ai aucune expérience à ce niveau avec Delphi VCL et que la procédure d'intégration en Lazarus me semble très différente de ce que j'ai lu, je vous sollicite à nouveau.

    Encore merci. Zac

  10. #10
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut Création de composant
    Citation Envoyé par Zacheus Voir le message
    ...
    Sachant que je n'ai aucune expérience à ce niveau avec Delphi VCL et que la procédure d'intégration en Lazarus me semble très différente de ce que j'ai lu, je vous sollicite à nouveau.
    Encore merci. Zac
    Je vais en préparer une partie dans la journée à partir de ton code.
    Tu es sur quelle version de Delphi ?
    Peux tu mettre à disposition le bitmap que tu veux voir en tant qu'icone.
    Ensuite on le mettra en tutoriel.

Discussions similaires

  1. typedef et dérivation de classe
    Par CLeBeR dans le forum C++
    Réponses: 6
    Dernier message: 22/05/2015, 19h53
  2. Dérivation de classe template == using à gogo
    Par Captain'Flam dans le forum Débuter
    Réponses: 1
    Dernier message: 21/01/2015, 15h22
  3. "operator =" et dérivation de classe
    Par ram-0000 dans le forum C++
    Réponses: 25
    Dernier message: 09/07/2008, 10h58
  4. Problème de dérivation d'un class abstraite
    Par the big ben 5 dans le forum Delphi .NET
    Réponses: 8
    Dernier message: 20/07/2006, 20h04
  5. Dérivation de classe template en visual c++ 2003
    Par fabienpot dans le forum MFC
    Réponses: 7
    Dernier message: 23/11/2005, 16h31

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