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 :

Equivalent usage QTableView


Sujet :

Composants FMX Delphi

  1. #1
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut Equivalent usage QTableView
    Bonjour,

    je cherche à réaliser la même chose en FMX (Windows-Linux et mac OS) qu'en Qt.

    J'utilise une QtableView (une sorte de TGrid) dont les cellules d'une même ligne contiennent des objets différents : Par exemple, la première colonne contient un ID (caché), la seconde un TLabel et la troisieme un TMemo (HTML ). En Qt, je promeus une QTableview classique. Par essence même, son approche est "ouverte" pour réaliser ce genre d'approche.

    En Lazarus, je doute que cela soit possible et je n'ai pas d'idée de contenant ? Un espèce de TFlowPanel avec ScrollBar ? Cela existe cela ?

    Mais en FMX, est-il possible d'encapsuler dans les cellules d'une ????, des objets différents, objets évidemment que je peux rendre actifs (i.e. dans lesquels je peux travailler notamment le TMemo) ? Un TGridPanel semble envisageable mais sans aucune certitude. J'aimerais voir les images

    Pourriez-vous m'orienter ?

    Merci. Cordialement. Gilles

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Un TDBCtrlGrid en VCL resemble-t-elle un peu à un QTableview ?

    Si oui
    En FMX comme tout peut être parent d'un composant, il faut utiliser un TListView, on peut mettre des checkbox, progressebar ... c'est Appearances

    A lire Customizing FireMonkey ListView Appearance

    Si non,
    Une maquette de la grille souhaitée peut-être ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour Gilles,
    Alors si tu veux pouvoir faire de la saisie ce n'est pas un TListView qu'il faut choisir.
    Un scrollbox contenant des Frames me semble plus adapté (bien qu'il faille gérer beaucoup de choses "à la main") s'il s'agit d'un ensemble d'enregistrements

    Un FlowPanelLayout ou un GridPanelLayout (plus complexe à mon avis), serait pour un enregistrement unique (pourquoi pas dans une Frame d'ailleurs).

    Quant à l'HTML rien dans la parie Embarcadero, mais il y a toujours les composants tiers (https://github.com/digao-dalpiaz/DzHTMLText)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    Bonjour,

    merci pour ces réponses.

    Alors va pour un TScrollBox, même un TVertScrollBox chez Delphi.
    J'avais regardé en Lazarus et je trouvais la solution fastidieuse : Il m'aurait fallu déclarer un array de TspeedButton, un autre de TMemo,... et j'aurais créé mes lignes [TEdit-TMemo-TSpeedButton1-TSpêedButton2] dynamiquement à partir du parcours des tables de la BDD. Et comme je voulais pouvoir modifier la hauteur de chaque TMemo à la souris, pour garder une structure "ligne par ligne", la gestion des ancrages des objets les uns par rapport aux autres aurait nécessité pas mal de lignes de code. Mais avec Lazarus, les ancrages sont assez performants et surtout ne nécessitent pas de composant supplémentaire... La création dynamiquement (ie le code de leur création) est facile à produire.

    Avec Delphi, il va falloir que j'ajoute au moins un voire plusieurs composants (des layouts ?) pour gérer la géométrie de l'ensemble à l'intérieur du TVertScrolllBox notamment quand je vais modifier la hauteur d'un des TMemo. Je crains que cela n'ait une grande influence sur le TVertScrollBox (ie sur son SCrollBar). Mais ce n'est qu'une crainte pour l'instant.

    Je regarde cela de plus près.
    Cordialement. Gilles

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour Gilles,

    en fait je ne comprends pas vraiment le besoin. Tout ce que j'ai vu de QTableView ressemble furieusement à un TGrid .
    Sauf bien sûr ce problème de HTML, je vais mettre ça dans ma todolist "dans un an" : "créer un nouveau type de colonne contenant un dzHTMLText" ça pourrait être sympa
    de même que "ajouter un autre type d'objet (un dzHTMLText) a un TListview"
    à moins qu'un style (une de tes bêtes noires) + un Tlistbox soit une solution
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    Bonjour Serge,

    oui, à la base un QTableView est un TGrid sauf que le premier tient les promesses reprécisées par ShaïLeTroll pour Delphi... que je ne parviens pas à réaliser en FMX
    Citation Envoyé par ShaiLeTroll Voir le message
    [...]En FMX comme tout peut être parent d'un composant[...]
    sauf que dans la même phrase cela se gâte :
    Citation Envoyé par ShaiLeTroll Voir le message
    [...]il faut utiliser un TListView, on peut mettre des checkbox, progressebar,...
    Donc un TGrid, puisque le TGrid fait partie de "tout", on peut pas mettre n'importe quel objet dans une cellule, par exemple un TMemo. Je demande à voir. D'autant que la "liaison" -je ne sais pas comment appeler cela en Firemokey, disons, le placement du TMemo dans la TCell- cela se fait (ferait) par LiveBinding bien entendu. En Qt c'est simplement du C++ à la main. La difficulté est non pas d'incorporer l'objet mais de le faire réagir par exemple au redimensionnement de son composant ou l'inverse.

    Voila ce que j'essaie en vain de faire depuis très longtemps en Pascal. C'est en Qt. Je l'ai fait en 2016 [en Qt 5.5]. Il n'y a aucun composant. Tout est fait à la main... en pur C++ : c'est une "promotion" classique d'un widget de base.
    https://www.ixaw.fr/video/qtableview-220511.mp4
    Évidemment, le code fonctionne sous Windows, Linux et mac OS. J'ai le même en QTreeview

    Je déplore vraiment d'être incapable de faire cela en Firemonkey. Je ne vois pas pourquoi techniquement je serais capable de le faire en Qt et pas en FMX alors que j'ai appris le Pascal avant le C++ . Et comme le dit Paul, l'utilisation de composants (comme TMS) ce n'est pas vraiment "le mieux". Mais faute de mieux, justement... Je me demande d’ailleurs pourquoi je m'obstine ? Peut-être parce que j'aime tout simplement le Pascal...

    Donc Serge, pour en revenir à ma demande et préciser les choses, incapable de modifier une TGrid en Firemonkey pour obtenir le résultat escompté, j'élimine aussi les TMSFNCGrid [qui n'ont pas vraiment les mêmes capacités] et de ce fait, je cherche une autre solution pour obtenir quelque chose de fonctionnel et d'esthétique fonctionnant sous les 3 OS desktop que j'utilise.
    Cordialement. Gilles

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Ah, avec cette petite vidéo je comprends mieux le besoin.
    on peut pas mettre n'importe quel objet dans une cellule, par exemple un TMemo.
    Une colonne peut très bien contenir un memo ça ce n'est pas un problème, par contre autant je sais comment gérer une largeur de colonne "élastique" je n'ai jamais testé une hauteur de ligne variable (ce qu'il est possible de faire avec un TListView).
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    oui, enfin quand je dis un TMemo, je pense à un TMemo affichant le HTML. Je vais regarder avec les TMS ce que je peux faire en développement "classique" dans un TVertScrollBox.

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HTML-Dev Voir le message
    oui, enfin quand je dis un TMemo, je pense à un TMemo affichant le HTML.
    J'avais compris pour le HTML mais modifiable ou non ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Sans type de colonne particulier
    Citation Envoyé par SergioMaster Voir le message
    autant je sais comment gérer une largeur de colonne "élastique" je n'ai jamais testé une hauteur de ligne variable.
    Je ne crois pas que la hauteur variable soit possible, sur le Grid de base tout au plus ai-je réussi à retailler au plus grand.

    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
    procedure TForm1.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
      const Column: TColumn; const Bounds: TRectF; const Row: Integer;
      const Value: TValue; const State: TGridDrawStates);
    var  ATextLayout : TTextLayout;
         h : single;
     
    function GetTextHeight(const L: TTextLayout; const Width: single; const
                             Text: string): Integer;
    var
      Layout: TTextLayout;
    begin
      Layout := TTextLayoutManager.DefaultTextLayout.Create;
      try
        Layout.BeginUpdate;
        try
          Layout.Font.Assign(L.Font);
          Layout.VerticalAlign := TTextAlign.Leading;
          Layout.HorizontalAlign := TTextAlign.Leading;
          Layout.WordWrap := True;
          Layout.Trimming := TTextTrimming.Word;
          Layout.MaxSize := TPointF.Create(Width,
                          TTextLayout.MaxLayoutSize.Y);
          Layout.Text := Text;
        finally
          Layout.EndUpdate;
        end;
        Result := Round(Layout.Height);
        Layout.Text := 'm';
        Result := Result + Round(Layout.Height);
      finally
        Layout.Free;
      end;
    end;
     
    begin
     
    if SameText(Column.Header,'notes') then
    begin
      h:=GetTextHeight(Column.Layout,column.AbsoluteWidth,Value.ToString);
      if h>Grid1.RowHeight then Grid1.RowHeight:=h; // au plus grand
      ATextLayout:=TTextLayoutManager.TextLayoutByCanvas(Canvas.ClassType).Create(Canvas);
      ATextLayout.BeginUpdate;
      ATextLayout.Text:=Value.ToString;
      ATextLayout.Color:=TAlphaColors.Black;
      ATextLayout.TopLeft:=Bounds.TopLeft;
      ATextLayout.MaxSize := PointF(Bounds.Width, h);
      ATextLayout.WordWrap:=true;
      ATextLayout.VerticalAlign:=TTextAlign.Leading;
      ATextLayout.EndUpdate;
      ATextLayout.RenderLayout(Canvas);
    end
    else Column.DefaultDrawCell(Canvas,bounds,row,value,state);
    end;

    Maintenant si lors du premier remplissage c'est au plus grand pour toutes les lignes j'ai remarqué qu'ensuite seule les lignes affichées étaient re-traitées.
    Il y a peut être moyen de faire quelque chose avec cette notion de retraitement (bien que je ne vois, pour l'instant, pas comment) test à suivre ...

    Je pense qu'afficher du html pourrait se faire via le Canvas mais c'est encore un test à faire.

    Pour l'edition il y a l'évènement OnCretaeCustomEditor qui me fait de l'oeil
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut


    comme tu l'aurais fait pour la VCL on se sert du inplaceditor ... je ne sais pas trop si cela existe toujours en fmx
    mais a mon avis cela est toujours d'actualité

    a vérifier
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Alors, j'ai peaufiné mon code en ce qui concerne les hauteurs.
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
      private
        { Déclarations privées }
        modifierhauteur : boolean;
        hauteurligne : single;  // hauteur par défaut
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.fmx}
     
    uses FMX.TextLayout, system.Math;
     
     
    function GetTextHeight(const L: TTextLayout; const Width: single; const
                             Text: string): Integer;
    var
      Layout: TTextLayout;
    begin
      Layout := TTextLayoutManager.DefaultTextLayout.Create;
      try
        Layout.BeginUpdate;
        try
          Layout.Font.Assign(L.Font);
          Layout.VerticalAlign := TTextAlign.Leading;
          Layout.HorizontalAlign := TTextAlign.Leading;
          Layout.WordWrap := True;
          Layout.Trimming := TTextTrimming.Word;
          Layout.MaxSize := TPointF.Create(Width,
                          TTextLayout.MaxLayoutSize.Y);
          Layout.Text := Text;
        finally
          Layout.EndUpdate;
        end;
        Result := Round(Layout.Height);
        Layout.Text := 'm';
        Result := Result + Round(Layout.Height);
      finally
        Layout.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    modifierhauteur:=true;
    Grid1.Repaint;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    memo1.Lines.Clear;
    memo1.Lines.Add('toprow    '+Grid1.TopRow.ToString);
    memo1.Lines.Add('visible   '+grid1.VisibleRows.ToString);
    memo1.Lines.Add('rowheight '+grid1.RowHeight.ToString);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    modifierhauteur:=true;
    hauteurligne:=grid1.RowHeight;
    end;
     
    procedure TForm1.Grid1CellClick(const Column: TColumn; const Row: Integer);
    begin
     showmessage(GetTextHeight(Column.Layout,column.AbsoluteWidth,ClientDataSet1Notes.AsString).ToString);
    end;
     
    procedure TForm1.Grid1CreateCustomEditor(Sender: TObject; const Column: TColumn;
      var Control: TStyledControl);
    begin
    showmessage('custom editor');
    end;
     
    procedure TForm1.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
      const Column: TColumn; const Bounds: TRectF; const Row: Integer;
      const Value: TValue; const State: TGridDrawStates);
    var  ATextLayout : TTextLayout;
         h,r : single;
    begin
     
    if SameText(Column.Header,'notes') then
    begin
    h:=GetTextHeight(Column.Layout,Bounds.Width,trim(Value.ToString));
    if modifierhauteur then begin
      if row=Grid1.TopRow then r:=Max(h,Hauteurligne);
      if (h>Grid1.RowHeight) AND (row>=Grid1.TopRow) AND (row<=Grid1.TopRow+Grid1.VisibleRows)  then
        begin
          if h>r then grid1.rowheight:=h;
          r:= grid1.rowheight;
        end;
    end;
    ATextLayout:=TTextLayoutManager.TextLayoutByCanvas(Canvas.ClassType).Create(Canvas);
    ATextLayout.BeginUpdate;
    ATextLayout.Text:=Value.ToString;
    ATextLayout.Color:=TAlphaColors.Black;
    ATextLayout.TopLeft:=Bounds.TopLeft;
    ATextLayout.MaxSize := PointF(Bounds.Width,ifthen(modifierhauteur,h,hauteurligne));
    ATextLayout.WordWrap:=true;
    ATextLayout.VerticalAlign:=TTextAlign.Leading;
    ATextLayout.EndUpdate;
    ATextLayout.RenderLayout(Canvas);
    end
    else Column.DefaultDrawCell(Canvas,bounds,row,value,state);
    end;
    Ce n'est pas encore idéal en ouverture de grille
    Nom : Capture.PNG
Affichages : 157
Taille : 53,5 Ko
    mais après un défilement ç'est mieux sans être encore tout à fait juste
    Nom : Capture_1.PNG
Affichages : 155
Taille : 39,1 Ko
    conclusion il reste un petit bogue, certainement dans mon test ligne 90 (à revoir)

    Je vais désormais tenter la partie HTML
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Premiers essais HTML
    Dans cette image seul la première ligne avait été modifiée et seulement des trucs basiques <b></b>, <i><b></b></i> pour la citation
    Nom : Capture.PNG
Affichages : 143
Taille : 54,4 Ko
    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
    procedure TForm1.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
      const Column: TColumn; const Bounds: TRectF; const Row: Integer;
      const Value: TValue; const State: TGridDrawStates);
    var  zHtml : TdzHtmlText;
    begin
     
    if SameText(Column.Header,'notes') then
    begin
     zHTML:=TDzHTMLText.Create(Self);
     try
        zHTML.Width:=Bounds.Width;
        zHTML.AutoHeight:=True;
        zHTML.Text:=Value.ToString.Trim;
        Grid1.RowHeight:=Max(Grid1.RowHeight,zhtml.Height);
        zHTML.PaintTo(Canvas,Bounds);
      finally
       zHtML.Free;
     end;
    end
    else Column.DefaultDrawCell(Canvas,bounds,row,value,state);
    end;
    Il y a encore du boulot (niveau initialisation du TDzHTMLText et de l'instruction Painto) mais cela prouve que c'est possible
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    je pense que la modification dans la méthode draw est bien pour la maquette mais je suppose qu'il faut approfondir les recherches pour en faire quelque chose de générique

    genre spécialiser le type de colonne
    Je vois un truc du genre
    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
     
    type 
      TMemoCell = class(TMemo)
      protected
        ...
        Procedure MyOverideEvent(...);override;
      end;
     
      TMemoColumn = class(TStringColumn)
      protected
        function CreateCellControl: TStyleControl;override;
      end;
     
     
    procedure TMemoCell.MyOverideEvent.... ;
    begin
      inherited;   //Custom stuff here with X,Y
    end;
     
    function TMemoColumn.CreateCellControl: TStyledControl;
    begin
      Result := TMemoCell.Create;
      Result.Parent := Self;
    end;
    ou peut etre modifier le createCustomEditor
    avec ce genre de methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.grd1CreateCustomEditor(Sender : TObject ;
      const Column : TColumn ; var Control : TStyledControl) ;
      varidx : entier ;
    begin
      idx := Column.Model.IndexOfColumn(Column);
      case idx of
      1: begin 
           Control := TMemo.Create(self);
           Control.OnExit    := MymemoExit ;
    	   Control.OnExit    := MymemoChange ;
           Control.OnKeyDown := MymemoKeyDown ;
         End;
      End;
    End;
    je n'ai pas les tenants et les aboutissant de ce que tu veux réaliser mais
    je pense qu'il y a d'autre piste a exploiter
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  15. #15
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par anapurna Voir le message
    je n'ai pas les tenants et les aboutissant de ce que tu veux réaliser
    les tenants et aboutissants, pas les miens, ceux de Gilles, sont assez bien résumés dans la vidéo du Post #6
    Citation Envoyé par anapurna Voir le message
    je pense qu'il y a d'autres pistes à exploiter
    Totalement en fait je n'ai épluché ce week-end que la partie hauteur variable de lignes et affichage HTML

    La piste, que tu suggères "spécialiser le type de colonne", je l'ai déjà envisagée
    Citation Envoyé par SergioMaster
    "créer un nouveau type de colonne contenant un dzHTMLText" ça pourrait être sympa
    mais pas encore abordée. Elle est complexe et dépend des versions Delphi, les versions XE semblaient permettre facilement le truc mais, selon mes recherches, avec les nouvelles cela demanderait une modification d'un source Embarcadero pour la prise en compte du nouveau type


    Mais pour vraiment s'en sortir, je pense qu'un remplissage d'un ScrollBox avec un TFrame (ou TFrameStand ?) serait la solution la plus simple.
    Le remplissage "à la main" est assez facile, le plus compliqué : géré une taille après une modification, le délicat : la vitesse d'exécution du remplissage
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2002, 09h12
  2. equivalent à explode?
    Par djridou dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2002, 11h01
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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