par , 07/03/2021 à 14h40 (1228 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.
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.
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.
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
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).
* 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.
1 2 3 4
| Image1.Picture.LoadFromStream(mStream);
finally
mStream.Free;
end; |

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