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 FMX Delphi Discussion :

Héritage avec FMX


Sujet :

Composants FMX Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Héritage avec FMX
    Bonjour,

    j'ai commencé à travailler sur un composant TmyGrid dérivé de TGrid. Et j'ai besoin d'utiliser mes propres colonnes héritées de TColumn et mes propres "header" hérités de THeader.
    J'ai déjà fait un travail similaire avec succès sur les TStringGrids de Lazarus.

    Or avec FMX, je n'arrive à rien. Il m'était difficile de comprendre pourquoi cela ne fonctionne pas comme attendu... jusqu'au moment où j'ai lu ceci... qui explique en partie mes déboires. J'ai bien l'impression que malgré mes efforts je vais encore faire un break avec Firemonkey. D'une part cela dépasse mes compétences, et d'autre part j'en reviens toujours à mes conclusions... malheureusement. Une TGrid FMX ce n'est pas fait pour être dérivée... Or ce qu'elle offre est largement insuffisant pour mes besoins. Evidemment je peux la bricoler de l'extérieur avec des objets et des méthodes extérieures à la Grid mais c'est in-maintenable, lourd, compliqué s'il y a plusieurs Grids sur la Form...

    Cordialement. Gilles
    Dernière modification par Invité ; 03/05/2020 à 11h22.

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

    après une nuit de repos et la dépression passée, je reprends à zéro :

    Pour l'instant voici la base du composant. Je l'ai appelé TlzGrid (en souvenir de ce bon vieux lazarus et des composant que j'y ai écrits qui commençaient tous par lz) dans l'unité FMX.lzGrid.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
    unit FMX.LzGrid;
     
    interface
     
    uses
      System.SysUtils, System.Classes,
      FMX.Grid.Style, FMX.Presentation.Factory, FMX.Presentation.Style,
      FMX.Types, FMX.Controls, FMX.Grid;
     
     
    type
      TlzGrid = class(TGrid)
      private
        { Déclarations privées }
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
    	constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        { Déclarations publiées }
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('AdditionLz', [TlzGrid]);
    end;
     
    constructor TlzGrid.Create(AOwner: TComponent);
    begin
      inherited;
    end;
    destructor TlzGrid.Destroy;
    begin
      inherited;
    end;
     
    {https://www.delphipraxis.net/190465-delphi-10-1-berlin-komponente-ableiten.html}
    initialization
      TPresentationProxyFactory.Current.Register(TlzGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);
     
    finalization
      TPresentationProxyFactory.Current.Unregister(TlzGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);
     
    end.
    C'est l'unité minimale. Je pourrais partir d'un TCustomGrid mais je n'ai qu'à ajouter quelques méthodes protected ou private dans TGrid. Donc TGrid conviendra.
    initialization et finalization sont requises sinon :
    Nom : 02.png
Affichages : 210
Taille : 6,3 Ko

    J'installe mon composant (voir zip) et je crée un projet :
    Nom : 01.PNG
Affichages : 212
Taille : 26,0 Ko

    • Alors 1er problème simple probablement mais que je n'ai pas résolu faute de connaître l'IDE : Mon composant est dans un répertoire séparé de celui de delphi. En lazarus je n'ai pas besoin. Tout va dans son sous-dossier "components" sachant que quand je désinstalle Lazarus, les dossiers perso ajoutés dans "components" ne sont pas effacés... ce qui est très pratique. Comme pour l'instant, j'ai toujours galéré pour changer de version de Delphi, j'ai placé mes composants ailleurs que dans le répertoire par défaut de Delphi.
      J'aurais voulu que le chemin du composant s'ajoute par défaut lors de son installation... Pour l'instant il faut que j'ajoute ce dossier dans Projet >> Ajouter... Un peu comme l'imposait Indy dans Lazarus à ses débuts. C'est jouable mais peu pratique.


    • le 2ème problème est au cœur du composant... Dans mes Tcolumn et des classes qui en dérivent, je veux ajouter des published properties (bSort, bSearch, FSerach) tout en conservant la possibilité de lier ces colonnes une à une à mon Datasource par LiveBinding évidemment. Dans tous mes essais, je n'ai pas réussi à concilier les 2. J'ai obtenu les propriétés mais le LiveBinding ne fonctionne pas.


    Je veux bien apprendre cette interface mais encore faudrait-il disposer d'une documentation suffisamment exhaustive pour ne pas tâtonner de trop (i.e. perdre son temps à utiliser le hasard).

    Donc en résumé : il faudrait créer des TlzColumn. Ce ne sera pas suffisant car les "dissidences" que l'on trouve dans C:\Program Files (x86)\Embarcadero\Studio\20.0\source\fmx\FMX.Grid.pas ne dérivent pas toutes directement de TColumn
    • TFloatColumn = class(TCustomNumberColumn)
    • TIntegerColumn = class(TCustomNumberColumn)
    • TGlyphColumn = class(TColumn)
    • TStringColumn = class(TColumn);
    • TProgressColumn = class(TColumn)
    • ...


    Bref, si quelqu'un a une idée pour au moins proposer lors de la création d'un item dans TlzGrid des TlzColumn, TlzStringColumn et autres je suis preneur. Il ne s'agit pas de créer ses propres classes en recopiant celles que l'on trouve dans FMX.Grid.pas. Il me faut dériver les classes existantes. J'ai appris à mes dépens avec Lazarus, compte tenu des rustinages permanents de leurs développeurs, que c'était la seule approche envisageable. Sinon, il faut tout réécrire à chaque mise à jour officielle. Or chez "Embarcadero", les codes des différentes versions sont souvent incompatibles. Donc la bonne approche est l'héritage... même si ce n'est pas une garantie.

    Merci. Cordialement. Gilles
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 03/05/2020 à 12h06.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Toujours le même problème à l'arrivée :

    Sans LiveBinding, j'arrive à créer ce que je cherche :
    Nom : 03.png
Affichages : 209
Taille : 55,4 Ko
    J'ai gardé TColumn, créé TLzColumn et TlzStringColumn (en "débranchant" les autres).
    Il va falloir que je teste en faisant le LiveBindings du DataSourcex au colonnes de la TGrid à la main. Il va fallor apprendre mais normalement le tuto de Serge devrait grandement me faciliter la tâche.

    Si j'utilise le Livebinding visuel :
    Nom : 04.png
Affichages : 217
Taille : 156,6 Ko
    Plus de TlzColumn... Dans l'éditeur je vois les colonnes et même les données dans la lzGrid, sans que cela ne fonctionne réellement (i.e. une fois compilé)... Quand je vois les objets incorporés automatiquement dans la Grid (résultant du LiveBinding visuel), je comprends pourquoi mais je ne sais pas pallier ce problème.

    Cordialement. Gilles

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 619
    Points : 39 775
    Points
    39 775
    Billets dans le blog
    59
    Par défaut
    Bonjour,

    Non, bien que cela me tente, je ne mettrai pas mon nez dedans pour l'instant le nombre de tâches s'accumulant, il faut d'abord que je vide ma liste
    Citation Envoyé par Selzig Voir le message
    Il va falloir apprendre mais normalement le tuto de Serge
    oui mais pas celui sur les grilles, va plutôt fouiller dans celui sur l'écriture de composant observable parties en II.B ou III.B rendre observable la partie III.C qui parle des convertisseurs
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

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

    j'ai réglé définitivement -enfin je l'espère - mon problème de LiveBindings sur les Grids FMX... en n'utilisant pas LiveBindings

    Je dispose sous Lazarus des composants FNC... et notamment la FNCGrid -que j'ai déjà un peu dérivée- et qui correspond beaucoup plus à mes approches que la TMSFMXLiveGrid...

    J'étais en discussion avec TMS pour le TMSWebCore et je leur demandais s'il fonctionnait aussi sous Lazarus (réponse affirmative) parce que finalement mon développement Pascal était plus orienté Lazarus que Delphi à cause justement de ses Grids.
    Plus exactement ce manque de souplesse de LiveBindings (pour les Grids) se retrouve tout autant dans leur TMSFMXLiveGrid alors que je suis parfaitement satisfait sous Lazarus du couple TTMSFNCGrid et TTMSFNCGridAdapter. Et j'ai appris que le composant FNCGrid était compatible FMX et se liait sans LiveBindings souplement avec, par exemple un UniDatasource, par un TMSFNCGridDatabaseAdaptater exactement comme sous Lazarus.

    Nom : TMS01.PNG
Affichages : 171
Taille : 64,0 Ko

    J'ai testé... Yes... Yes... Yes !
    Bon, il ne me manque plus qu'on éditeur de reports comme NCReports pour égaler Qt au niveau de mes développements. Mais on peut passer par PDF... C'est moins commode, plus chronophage mais possible...
    Dernière modification par Invité ; 18/05/2020 à 14h59.

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

Discussions similaires

  1. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37
  2. héritage avec sql server
    Par yohann007 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 30/08/2007, 21h30
  3. Héritage avec tables liées à une autre base
    Par b_steph_2 dans le forum Access
    Réponses: 13
    Dernier message: 27/02/2007, 11h17
  4. Generics et héritage avec Java 5.0 Tiger
    Par euyeusu dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2007, 11h41
  5. Utiliser un héritage avec exclusion mutuelle correctement
    Par akecoocoo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 20/11/2005, 22h54

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