Bonjour,
(dev sous tokyo)
j'affiche des remises avec code barre associé dans un listbox dont le design des TListBoxItem est défini via le concepteur de style. la génération du code barre fonctionne plutôt bien à condition de ne pas trop "jouer" avec le défilement du listbox, sinon, il y a un problème de rafraichissement des images et les codebarres sont "dupliqués".
Pour résoudre ce bug de rafraichissement, il faudrait (je pense) soit :
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 procedure TForm1.afficherdonnees_btClick(Sender: TObject); var item_lis : TListBoxItem; codebarreremise_im : TImage; begin // [...] while (not remises2_memtb.Eof) do begin item_lis := TListBoxItem.Create(remise_lis); item_lis.Parent := remise_lis; item_lis.StyleLookup := 'designitem_ly'; // [...] item_lis.StylesData['valeur_txt'] := '-' + remises2_memtb.FieldByName('valeur').AsString + ''; item_lis.StylesData['salon_txt'] := remises2_memtb.FieldByName('salon').AsString; item_lis.StylesData['client_txt'] := 'Pour vous ou pour un proche' + #13 + #10 + 'De la part de Marie Dupond'; codebarreremise_im := TImage.Create(item_lis.FindStyleResource('codebarre_im')); affiche_codebarre_remise(remises2_memtb.FieldByName('codebarre').AsString, codebarreremise_im); // item_lis.FindStyleResource('codebarre_im') as TImage); item_lis.StylesData['codebarre_im.Bitmap'] := codebarreremise_im.Bitmap; //(item_lis.FindStyleResource('codebarre_im') as TImage).Bitmap.CopyFromBitmap(codebarreremise_im.Bitmap); item_lis.StylesData['numoffre_txt'] := 'Offre n°' + remises2_memtb.FieldByName('codebarre').AsString; item_lis.StylesData['textecompl_txt'] := remises2_memtb.FieldByName('texte_complementaire').AsString; // [...] item_lis.StylesData['envoyerticket_bt.OnClick'] := TValue.From<TNotifyEvent>(envoyer_ticket_sms); end; remises2_memtb.Next; end; procedure TForm1.affiche_codebarre_remise(numoffre_st : string; var codebarredessin_im : Timage); var R :TRect; W :integer; const BarSize = 1; begin try //largeur width : Taille totale (Nb cara + StartB + CheckSum +Stop +2x QuietZone) W := ((Length(numoffre_st) +3) *11 +10) * (BarSize); //Rectangle à 0mm des bords de page, hauteur 64mm R := Rect((0), (0), (0) +W, (64)); //Espacement entre cadre et code de 2mm InflateRect(R, 0, -2); // initialisation du canvas de l'image bitmap codebarredessin_im.Bitmap := TBitmap.Create(W, 64); //Code barres avec un trait de 1mm codebarredessin_im.Bitmap.Clear($FFFFFF); // trait noir codebarredessin_im.Bitmap.Canvas.Fill.Kind := TBrushKind.Solid; codebarredessin_im.Bitmap.Canvas.Fill.Color := claBlack; // appelle codebarre_128.drawbarcode128 pour remplissage du canvas DrawBarCode128(numoffre_st, codebarredessin_im.Bitmap.Canvas, BarSize, R, ctB); except on E : Exception do ShowMessage('Erreur création code barre n° ' + numoffre_st + '(' + E.Message + ').'); end;
- passer en paramètre de la procedure affiche_codebarre_remise() item_lis.FindStyleResource('codebarre_im') as TImage mais un objet constante ne peut être passé comme paramètre Var
- faire une vraie copie du genre (item_lis.FindStyleResource('codebarre_im') as TImage).Bitmap.CopyFromBitmap(codebarreremise_im.Bitmap); mais violation d'accès.
je pense avoir trouvé un début de réponse ici :mais impossible de mettre en place une solution...vous devez savoir que dans FireMonkey, les composants sont stylés à la demande et que les styles peuvent également être supprimés à la demande. Ceci est fait pour économiser de l’espace mémoire en ne stylisant que les composants réellement visibles. Par exemple, les éléments d'une zone de liste ne peuvent être stylés que lorsqu'ils défilent et leurs styles peuvent être supprimés lorsqu'ils défilent.
voici un exemple compilable sous windows. en réduisant la largeur de la fenêtre et en la ré-augmentant, le 3ème code barre se rafraichit mal (duplication du 2ème). recliquez sur le bouton et il s'affiche de nouveau correctement (même pb sous ios avec l'effet ressort en faisant défiler les slides en butée) :
10.2 tokyo - smartphone - code barre design item listbox.zip
un coup de pouce n'est pas de refus
Partager