Bonjour,
pour une démonstration , voilà comment je rempli ma collection. Le but ? Remplacer les données du TProtypeBindSource au démarrage de l'application
de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm14.ContactsCreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter); begin {$IFDEF DATA} P_DonneesInternes; ABindSourceAdapter:=TListBindSourceAdapter<TContact>.Create(self,MesContacts, True); ControlList1.ItemCount:=MesContacts.Count; {$ENDIF} end;
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 unit UCtrlListContacts; interface uses System.SysUtils // nécessaire pour obtenir la date système, le type TFileName ,System.Generics.Collections // nécessaire pour la déclaration de liste d'objets ,System.Generics.Defaults ,System.Classes ,System.DateUtils // nécessaire pour EncodeDate ,VCL.graphics,VCL.Imaging.pngimage // ajout autres formats si besoin VCL.imaging.jpeg .... ,System.UITypes; type TContact = Class strict private FNom : String; FDate : String; FPhoto : TPicture; private procedure SetNom(const Value : String); procedure SetDate(const Value: String); procedure SetPhoto(const Value: TPicture); public constructor Create(); overload; constructor Create(Nom: String; UneDate: String; Photo: TPicture); overload; property ContactNom : String read FNom write SetNom; property ContactDate : String read FDate write SetDate; property ContactPhoto : TPicture read FPhoto write SetPhoto; end; procedure P_DonneesInternes; var MesContacts : TObjectList<TContact>; implementation { TEvenement } constructor TContact.Create; // création par défaut begin FNom:='<A faire>'; FDate:=FormatDateTime('dd/mm/yyyy',date); FPhoto:=nil; end; constructor TContact.Create(Nom: String; UneDate: String; Photo : TPicture); // création objet begin FNom:=Nom; FDate:=UneDate; FPhoto:=Photo; end; procedure TContact.SetDate(const Value: String); begin FDate := Value; end; procedure TContact.SetNom(const Value: String); begin FNom:=Value; end; procedure TContact.SetPhoto(const Value: TPicture); begin FPhoto := Value; end; procedure P_DonneesInternes; // Chargement de valeurs internes begin MesContacts.Add(TContact.Create('Enfant 1','01/01/2021',TPicture.Create)); MesContacts[0].ContactPhoto.loadFromFile('..\..\Child_1.png'); MesContacts.Add(TContact.Create('Enfant 2','02/01/2021',TPicture.Create)); MesContacts[1].ContactPhoto.loadFromFile('..\..\Child_2.png'); MesContacts.Add(TContact.Create('Enfant 3','03/01/2021',TPicture.Create)); MesContacts[2].ContactPhoto.loadFromFile('..\..\Child_3.png'); MesContacts.Add(TContact.Create('Enfant 4','04/01/2021',TPicture.Create)); MesContacts[3].ContactPhoto.loadFromFile('..\..\Child_4.png'); MesContacts.Add(TContact.Create('Enfant 5','05/01/2021',TPicture.Create)); MesContacts[4].ContactPhoto.loadFromFile('..\..\Child_5.png'); MesContacts.Add(TContact.Create('Japonaise','06/01/2021',TPicture.Create)); MesContacts[5].ContactPhoto.loadFromFile('..\..\Japan_2.png'); MesContacts.Add(TContact.Create('Enfant 7','07/01/2021',TPicture.Create)); MesContacts[6].ContactPhoto.loadFromFile('..\..\Child_7.png'); end; initialization MesContacts:=TObjectList<TContact>.Create; finalization // MesContacts.Free; // inutile car MesEvenements est libéré à la destruction du TProtypeBindSource // si OwnsObject est égal à True au moment de la création de l'adaptateur end.
Cela fonctionne très bien mais, je me posai la question de savoir s'il n'y avait pas un moyen de mettre les images directement sans avoir à faire un loadfromfile ?
Autre question du même acabit comment faire une sauvegarde (csv, xml ou autre) de cette collection d'objet ?
En fait je pense que le TPicture n'est pas le mieux adapté à remplacer par quoi ?
En Nota Bene, je n'ai jamais réussi à affichier correctement des images générées dans le protypebindsource avec les générateurs ContactBitmaps ou ContactBitmapsL (tous mes éléments ont la même tronche ! A priori un bogue ) et mes tentatives d'accès aux données générées avec ces générateurs
sont inefficaces (alors que cela fonctionne pour le générateur Bitmaps)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 try avar:=Contacts.DataGenerator.FindField('ContactPhoto').GetTValue.AsType<TBitmap>; if assigned( avar) then begin avar.savetostream(astream); aStream.Position:=0; Photo.Picture.LoadFromStream(aStream); end; except on e:Exception do Showmessage(e.Message) end;
Partager