IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

[Dephi][VCL]Carnet de plongées : TControlList - Documentaire

Noter ce billet
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.

Nom : documentaire.png
Affichages : 1298
Taille : 375,4 Ko

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.

Nom : Capture_dbctrlgrid.PNG
Affichages : 109
Taille : 53,8 Ko

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).

Nom : Capture_scrollboxmain.PNG
Affichages : 104
Taille : 204,2 Ko

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.

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;
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
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 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.
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.
Nom : Capture_FMXListView.PNG
Affichages : 113
Taille : 41,4 Ko
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.

Nom : Capture_FMXListView_r.PNG
Affichages : 116
Taille : 51,1 Ko

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

Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Viadeo Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Twitter Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Google Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Facebook Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Digg Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Delicious Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog MySpace Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - Documentaire » dans le blog Yahoo

Catégories
Programmation , Delphi

Commentaires