[Dephi][VCL]Carnet de plongées : TControlList - Documentaire
par
, 23/03/2021 à 10h37 (832 Affichages)
À l'affiche de la salle de cinéma et pour continuer ma comparaison avec la plongée professionnelle voilà mon échelle de temps.
L'objectif de ce billet est un peu de montrer quelles solutions auraient pu être utilisées avant l'apparition de TControlList mais aussi, pour parler avenir, ce que FMX propose. Cela pourrait même intéressé ceux qui n'ont qu'une version Community (encore, à ce jour, au niveau 10.3.3).
Une première solution simple pour pallier au TControlList, à partir du moment où il est question d'un fichier de données : l'utilisation d'un TDBCtrlGrid.
Rapide, simple, pour citer les anciens plongeurs sacaphandrier : "un couteau suffit" (version édulcorée de l'adage)
Seconde solution, plus experte, l'utilisation d'un ScrollBox et de Frames, ce qui sans nul doute serait le plus proche. Cette version demande une certification soudure pour le moins (entendez par là beaucoup plus du code niveau expert).
Le principe en est simple et vous allez y reconnaitre beaucoup de ce qui se fait avec le TControlList. En lieu et place du TControlList nous avons un TScrollBox. Un cadre (frame) est réalisé pour finalisé une future ligne de la liste.
Dans la frame, une fonction permet de définir la hauteur nécessaire.
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 uses UScrollBoxFrame; procedure TuMain.ClientDataSet1AfterClose(DataSet: TDataSet); var I: Integer; begin for I := Scrollbox1.ControlCount-1 downto 0 do ScrollBox1.Controls[i].Free; end; procedure TuMain.ClientDataSet1AfterOpen(DataSet: TDataSet); var Bottom : Integer; index : integer; vFrame : TFrameLigne; begin Bottom:=0; // mémorise la position dans la ScrollBox index:=0; while not ClientDataSet1.Eof do begin // ajouter une nouvelle frame vFrame :=TFrameLigne.Create(Self); vFrame.Name:='Ligne'+index.ToString; vFrame.Label1.Caption:=ClientDataset1.FieldByName('Common_Name').AsString; vFrame.Label2.Caption:=ClientDataset1.FieldByName('Notes').AsString; var vStream : TMemoryStream := TMemoryStream.Create; TBlobField(ClientDataset1.FieldByName('Graphic')).SaveToStream(vStream); vStream.Position:=8; vFrame.Image1.Picture.LoadFromStream(vStream); vFrame.Top:=Bottom; VFrame.Parent:=ScrollBox1; vFrame.Height:= vframe.CalcHeight; // hauteur variable Bottom:=Bottom+vframe.Height; ClientDataSet1.Next; inc(index); end; end; procedure TuMain.ToggleSwitch1Click(Sender: TObject); begin ClientDataset1.Active:=ToggleSwitch1.IsOn; end;
Les pours : Une frame est capable d'accepter tout controle ce qui n'était pas le cas de TControlList limité au seul descendant de TGraphicControl, ni pour de TDBCtrlGrid limité, lui à quelques contrôles uniquement.
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 function TFrameLigne.CalcHeight : integer; var lRect : TRect; lText : string; h : integer; begin lRect.Left := 0; lRect.Right := width - Image1.width; lRect.Top := 0; lRect.Bottom := 0; lText := Label2.Caption; label2.Canvas.TextRect( lRect, //will be modified to fit the text dimensions lText, //not modified, unless you use the "tfModifyingString" flag [tfCalcRect, tfWordBreak] //flags to say "compute text dimensions with line breaks" ); h:=lRect.Bottom; label2.Height:=h; result:=Label2.Top+h; end;
les contres : Adieu la réalisation simple sans code et le wyseewyg.
ℹ Je me suis contenté de faire une liste sur une colonne. Le principe reste identique pour du multicolonne, il suffit de codifier la position de chaque cadres.
Enfin que nous apporte FMX et son TListView.
Peu d'efforts à fournir et déjà au design on obtient plus qu'un équivalent acceptable.
J'ai écrit de nombreux billets et tutoriels sur TListView, le dernier étant sur les éléments de hauteurs variables aussi ne vais-je pas indiquer dans ce billet comment j'obtiens à l'exécution ceci. Toutefois, je signalerai que j'ai frôlé l'accident de plongée pour cet essai, avec la version 10.4.2 le programme figeait complètement ! Après pas mal d'investigation le problème est à l'affichage de l'image (celle-ci ôtée mes tailles variables fonctionnaient). Le résultat que je vous montre a été réalisé avec la version 10.3.2.
Les petits plus de TListView FMX : les groupes, la taille variable, la barre de recherche
Le moins : Pas de colonnes comme peut le proposer la propriété ColumnLayout du TControlList