Bonjour à tous
Savez-vous en Firemonkey comment faire pour lister les polices de caractères.
En VCL on récupérait la liste des polices avec cette commande.
Merci d'avance pour votre aideCode:
1
2 Screen->Fonts;
Version imprimable
Bonjour à tous
Savez-vous en Firemonkey comment faire pour lister les polices de caractères.
En VCL on récupérait la liste des polices avec cette commande.
Merci d'avance pour votre aideCode:
1
2 Screen->Fonts;
Salut
la FireMonley étant multi plateforme c'est au développeur d'écrire un peu plus de code
ex:bien cordialementCode:
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 le .H #ifndef Unit47H #define Unit47H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <FMX.Controls.hpp> #include <FMX.Forms.hpp> #include <FMX.ListBox.hpp> #include <FMX.Types.hpp> #include <FMX.Dialogs.hpp> #include <FMX.Printer.hpp> #include <FMX.Controls.Presentation.hpp> #include <FMX.Edit.hpp> //--------------------------------------------------------------------------- class TForm47 : public TForm { __published: // Composants gérés par l'EDI TComboBox *ComboBox1; TEdit *Edit1; void __fastcall ComboBox1Change(TObject *Sender); private: // Déclarations utilisateur public: // Déclarations utilisateur __fastcall TForm47(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm47 *Form47; //--------------------------------------------------------------------------- #endif //le.cpp #include <fmx.h> #pragma hdrstop #include <FMX.Graphics.hpp> #include "Unit47.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm47 *Form47; //--------------------------------------------------------------------------- __fastcall TForm47::TForm47(TComponent* Owner) : TForm(Owner) { Fmx::Printer::TPrinter* myPrinter=Fmx::Printer::Printer();// retourne une instance globale de l'object Printer ComboBox1->Items->Assign(myPrinter->Fonts); // remplissage d'une ComboB0x avec toutes les polices trouvées dans la property Font attention sous OSX cette propriété ne retourne tien } //--------------------------------------------------------------------------- void __fastcall TForm47::ComboBox1Change(TObject *Sender) { Edit1->Text=ComboBox1->Items->Strings[ComboBox1->ItemIndex]; // on remplit une EditBox avec la séléction effectuée dans la COmboBox } //---------------------------------------------------------------------------
Merci pour ton aide DjmSoftware
Je me suis donc créé un composant dérivé de TComboBox ou à la construction je remplit le ComboBox avec la Liste des Polices.
ComboBoxPolice.h
ComboBoxPolice.cppCode:
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 //--------------------------------------------------------------------------- #ifndef ComboBoxPoliceH #define ComboBoxPoliceH //--------------------------------------------------------------------------- #include <System.SysUtils.hpp> #include <System.Classes.hpp> #include <FMX.Controls.hpp> #include <FMX.ListBox.hpp> #include <FMX.Types.hpp> #include <FMX.Printer.hpp> //--------------------------------------------------------------------------- // ComboBoxPolice class PACKAGE TComboBoxPolice : public TComboBox { private: // Méthode qui retourne l'indice ou ajouter la Police int __fastcall IndicePolice(String Police, TStringList *ListePolice); protected: public: __fastcall TComboBoxPolice(TComponent* Owner); __published: }; //--------------------------------------------------------------------------- #endif
Cela fonctionne bien mais lorsque j'utilise mon composant et que je veux lui affecter l'ItemIndex -1 pour ne selectionné aucune police, j'ai une violation d'accès.Code:
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
99
100
101
102
103
104
105
106
107
108
109
110
111 //--------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "ComboBoxPolice.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck est utilisée pour garantir que les composants créés n'ont pas // de fonctions virtuelles pures. // static inline void ValidCtrCheck(TComboBoxPolice *) { new TComboBoxPolice(NULL); } //--------------------------------------------------------------------------- // Constructeur __fastcall TComboBoxPolice::TComboBoxPolice(TComponent* Owner) : TComboBox(Owner) { // On récupère une instance globale de l'object Printer Fmx::Printer::TPrinter* myPrinter=Fmx::Printer::Printer(); // On crée la Liste des Polices TStringList *ListePolices = new TStringList(); // on crée la Liste des Polices trillées TStringList *ListePolicesTrillees = new TStringList(); // On affecte la Liste des Fonts à la Liste des Polices ListePolices->Assign(myPrinter->Fonts); // On balaye la Liste des Polices for(int i = 0; i < ListePolices->Count; i++) { // On récupère la Police à l'indice i String Police = ListePolices->Strings[i]; // On récûpère l'indice ou l'on doit ajouter la Police int Indice = IndicePolice(Police, ListePolicesTrillees); // Si l'indice retourné est -1 if(Indice == -1) { // on ajoute la Police à la fin de la Liste ListePolicesTrillees->Add(Police); } // Sinon l'indice retourné n'est pas -1 else { // on insère la Police à l'indice Indice ListePolicesTrillees->Insert(Indice, Police); } } // On assigne la Liste des Polices trillées au ComboBox Items->Assign(ListePolicesTrillees); // On va sélectionné la Police Arial par défaut ItemIndex = Items->IndexOf("Arial"); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // PRIVATE //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Méthode qui retourne l'indice ou ajouter la Police int __fastcall TComboBoxPolice::IndicePolice(String Police, TStringList *ListePolice) { // on balaye las Elements de Fonts for(int i = 0; i < ListePolice->Count; i++) { // Si la chaine de la Police à l'indice est supérieure à celle de la Police courante if(Police.Compare(ListePolice->Strings[i]) < 0) { // On retourne l'indice return i; } } // On retourne donc -1 return -1; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- namespace Comboboxpolice { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TComboBoxPolice)}; RegisterComponents(L"Mes Composants", classes, 0); } } //---------------------------------------------------------------------------
Saurais-tu d'où pourrais venir le problème
Salut
2 Remarques
1.Attention à ne pas oublier de détruire les objets TStringList aprés utilisation dans le cas contraire tu va créer des fuites mémoires
2. tu te compliques singulièrement la tâche les objets TStringList ont la possibilités d’être trié...
ma proposition de modification ci-dessous
et voila le tour est jouéCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 __fastcall TComboBoxPolice::TComboBoxPolice(TComponent* Owner) : TComboBox(Owner) { // On récupère une instance globale de l'object Printer Fmx::Printer::TPrinter* myPrinter=Fmx::Printer::Printer(); // on crée la Liste des Polices trillées TStringList* SortedList=new TStringList(); SortedList->Sorted=true; // on active le tri automatique SortedList->Assign(myPrinter->Fonts); SortedList->Sort(); // tri de la liste ComboBox1->Items->Assign(SortedList);// Assignation du résultat delete SortedList;// destruction de la liste triée }
cordialement
Tu me l'apprend qu'on pouvais trier une StringList, je ne savais pas, c'est clair que du coup ca simplifie les choses.
Je vais modifer cela de suite.
Et du coup mon problème mémoire est résolu, cela venait donc de ne pas avoir détruit la StringList
Merci à toi.