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 - 1, un peu d'apnée

Noter ce billet
par , 07/03/2021 à 13h40 (1286 Affichages)
Ce billet fait suite à https://www.developpez.net/forums/bl...-1-decouverte/

Il est temps de retenir un peu son souffle (pas d'inquiètude les deux premières seront courtes) et apprendre quels sont les moyens de remplissage d'un TControlList.
La première, vu lors de notre découverte, ne nécessitait aucun code. Il existe également la manière plus "codeur" que nous allons explorer ici.
Retirons donc les deux composants BindSourceDB1 et BindingsList1 et voyons comment remplir la liste sans cette fonctionnalité.
Il nous faut tout d'abord déterminer le nombre d'éléments que le contrôle devra contenir.
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
procedure TForm1.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
ControlList1.ItemCount:=ClientDataset1.RecordCount;
end;

Puis, nous allons faire appel à un évènement de TControlList : OnBeforeDrawItem et nous interesser à son premier paramètre : AIndex.
Code pascal : 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
procedure TForm14.ControlList1BeforeDrawItem(AIndex: Integer; ACanvas: TCanvas;
  ARect: TRect; AState: TOwnerDrawState);
var mStream : TMemoryStream;
begin
ClientDataset1.RecNo:=AIndex+1;
Label1.Caption:=ClientDataset1.FieldByname('Common_name').asString;
Label2.Caption:=ClientDataset1.FieldByname('Notes').asString;
mStream:=TMemoryStream.Create;
try
 TGraphicField(ClientDataSet1.FieldByName('Graphic')).SaveToStream(mStream);
 mStream.Position:=8;
 Image1.Picture.LoadFromStream(mStream);
finally
 mStream.Free;
end;
end;
La première ligne de code de cette procédure ClientDataset1.RecNo:=AIndex+1; permet de se positionner au sein du fichier. Toutefois, c'est l'éternel histoire entre tableau de base 0 et tableau de base 1, le composant TControlList est de base 0 tandis que le TClientDataset est de base 1, pour se positionner correctement il faut donc ajouter 1 au paramètre Aindex.

Le remplissage de l'image demande un un peu plus d'attention. Tout d'abord il faut passer par un stream (TMemoryStream) pour récupérer le dessin.
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
mStream:=TMemoryStream.Create;
try
 TGraphicField(ClientDataSet1.FieldByName('Graphic')).SaveToStream(mStream);
* si vous déclarez les colonnes du dataset vous n'aurez pas besoin de transtyper [CODEINLINE=pascal]ClientDataset1.FieldName('Graphic')[/CODEINLINES] vous indiquerez, plus simplement
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
ClientDataset1Graphic.SaveToStream(mstream)
puis, c'est là la complication se positionner après une partie de l'entête de l'image (ici à partir de la position 8).
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
mStream.Position:=8;
* Oui, je suis d'accord avec vous sur ce point, la portabilité est remise en question. Il faut certainement faire une plongée plus poussée dans ce coin. J'ai, avant tout, voulu me calquer au plus près de la présentation d'Alister Chistie que vous pourriez retrouver sur YouTube.

pour finalement charger le tampon mémoire dans l'image et libérer ce dernier.
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 Image1.Picture.LoadFromStream(mStream);
finally
 mStream.Free;
end;

Nom : Capturespot1_apnee.PNG
Affichages : 164
Taille : 62,2 Ko

Ce sera tout pour cette première journée sur le "spot".

Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Viadeo Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Twitter Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Google Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Facebook Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Digg Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Delicious Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog MySpace Envoyer le billet « [Dephi][VCL]Carnet de plongées : TControlList - 1, un peu d'apnée » dans le blog Yahoo

Mis à jour 16/03/2021 à 11h52 par SergioMaster

Catégories
Programmation , Delphi

Commentaires