thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011
-
17 août 2011 à 15:42
Whismeril
Messages postés18608Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention25 septembre 2023
-
18 août 2011 à 21:35
bonjour,
je travaille actuellement sur un projet Application Windows Forms, qui à pour but de permettre de visualiser le texte que l'on a écrit dans une textbox sous la police que l'on a sélectionné dans une listbox. Le projet permet aussi d'ajouter/supprimer une police.
je code actuellement le bouton de suppression. j'essaye d'appliquer une condition, à savoir avant de supprimer un élément de la listbox, il faut vérifier qu'un élément a bien été sélectionné.
j'ai donc fais :
if (listbox.SelectedItem)
{
...
}
mais j'ai une erreur : Impossible de convertir implicitement le type 'object' en 'bool'. Une conversion explicite existe (un cast est-il manquant ?)
Whismeril
Messages postés18608Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention25 septembre 2023629 17 août 2011 à 16:42
Bonjour
tu peux aussi rendre ton bouton invisible (ou !enabled au choix) au démarrage.
Dans l'évenement click (ou selecteditemchanged si tu peux selectionner depuis le code) de ta listbox tu le rend visible.
Quand tu effaces une police, te le rends à nouveau invisible.
Ainsi l'utilisateur n'a accès au bouton que si il a sélectionné une police.
BunoCS
Messages postés15392Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 septembre 2023102 17 août 2011 à 17:48
Pas besoin de recherche: tu connais l'élement sélectionné, donc également son index dans la liste. Tu n'as qu'à aller chercher la font à cet index dans le tableau fontfamill
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 16:16
Merci Buno !
Voilà le code du bouton :
private void btSupprimer_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
lsbPolice.Items.Remove(lsbPolice.SelectedItem);
}
else
{
MessageBox.Show("Veuillez sélectionner une police à supprimer dans la liste !");
}
}
ça fonctionne, mais est-ce correct ? je trouve la solution trop simple, ou alors je vois du compliqué partout.. ^^'
Vous n’avez pas trouvé la réponse que vous recherchez ?
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 17:13
Re,
je cherche maintenant à faire un autre bouton, pour changer la police d'écriture du texte d'un label avec la police sélectionnée dans ma liste.
Le bouton s'appelle 'afficher'.
Voilà ce que j'ai fais :
private void btAffiche_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
lblVisu.Font = lsbPolice.SelectedItem;
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}
comment plus haut, j'ai une erreur de conversion de type : Impossible de convertir implicitement le type 'object' en 'System.Drawing.Font'. Une conversion explicite existe (un cast est-il manquant ?)
mais là, je vois pas trop comment la résoudre.. un cast Font fais planter mon programme :(
Whismeril
Messages postés18608Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention25 septembre 2023629 17 août 2011 à 17:30
Xxxx.Name est souvent(toujours?) un string.
Le plus simple serait que tu stockes directement tes polices. Sinon tu dois récupérer un font en fonction du nom sélectionné.
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 21:39
Re bonsoir,
voilà où j'en suis :
private void btAffiche_Click(object sender, EventArgs e)
{
bool tr = false;
int i = fontfamill.GetLowerBound(0);
int pos = -1;
if (lsbPolice.SelectedItem != null)
{
pos = lsbPolice.SelectedIndex;
while (i <fontfamill.GetUpperBound(0) && (tr false))
{
if (i == pos)
{
lblVisu.Font = fontfamill[i].Font;
}
}
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}
il m'affiche que fontfamill n'existe pas dans le contexte actuel.. pourtant mon array fontfamill charge en même temps que le formulaire, le bouton devrait le connaitre ?
de plus, je ne suis pas très sur de mon code comme je ne peux pas encore le tester..
le voici en entier :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Visualisation
{
public partial class frmVisu : Form
{
public frmVisu()
{
InitializeComponent();
}
private void frmVisu_Load(object sender, EventArgs e)
{
System.Drawing.Text.InstalledFontCollection fonts = new
System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontfamill = fonts.Families;
for (long i = fontfamill.GetLowerBound(0); i <= fontfamill.GetUpperBound(0); i++)
lsbPolice.Items.Add(fontfamill[i].Name);
fontfamill = null;
fonts = null;
lsbPolice.SelectedIndex = 0;
lblVisu.Text = "Voici le résultat";
}
private void btValider_Click(object sender, EventArgs e)
{
bool tr = false;
int i = 0;
int pos = -1;
if (txbPolice.Text != null)
{
while ((i <lsbPolice.Items.Count) && (tr false))
{
if (txbPolice == lsbPolice.Items[i])
{
tr = true;
pos = i;
}
else
i++;
}
if (pos != -1)
{
MessageBox.Show("la police que vous avez saisi existe déjà dans la liste !");
txbPolice.Text = null;
}
else
{
lsbPolice.Items.Add(txbPolice.Text);
txbPolice.Text = null;
}
}
else
MessageBox.Show("Veuillez saisir la police à ajouter dans la liste !");
}
private void btSupprimer_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
lsbPolice.Items.Remove(lsbPolice.SelectedItem);
}
else
{
MessageBox.Show("Veuillez sélectionner une police à supprimer dans la liste !");
}
}
private void btQuitter_Click(object sender, EventArgs e)
{
Close();
}
private void btAffiche_Click(object sender, EventArgs e)
{
bool tr = false;
int i = fontfamill.GetLowerBound(0);
int pos = -1;
if (lsbPolice.SelectedItem != null)
{
pos = lsbPolice.SelectedIndex;
while (i <fontfamill.GetUpperBound(0) && (tr false))
{
if (i == pos)
{
lblVisu.Font = fontfamill[i].Font;
}
}
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}
}
}
private void btAffiche_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
int pos = lsbPolice.SelectedIndex;
lblVisu.Font = fontfamill[pos].Font;
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}
devrait suffire.
Pense à commenter ton code aussi bien pour nous aujourd'hui que pour toi dans quelques mois, quand on te demandera une modif.
Je suis le premier à rager sur mon manque de rigueur de ce coté!
Je crois comprendre que le bouton Valider te sers à ajouter des polices. Comme au démarrage tu les charges toutes, je suppose que c'est après en avoir supprimer? Je pense qu'on peut rationnaliser aussi.
Whismeril
Messages postés18608Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention25 septembre 2023629 17 août 2011 à 22:19
Et dans l'ergonomie que je t'ai proposée tout à l'heure: l'accés des buttons qu'au moment opportun, tu peux créer une méthode qui gére tous tes boutons.
Tu l'appelles au démarage et à des évenement judicieusement choisis
(lsbPolice_SelectedItemChanged par exemple)
Cela t'éviterait tes if (moins de code au final) et tes messages (à mon sens contraignants pour l'utilisateur) dans chaque méthode.
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 22:23
Ok, pour faire un test en attendant que le code du bouton soit correct j'ai c/coller le code de frmVisu_Load (je sais que ce n'est pas bien, puisque du coup fontfamill est déclaré et initialisé deux fois dans mon formulaire).
puis j'ai modifié le code en conséquence :
private void btAffiche_Click(object sender, EventArgs e)
{
System.Drawing.Text.InstalledFontCollection fonts = new
System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontfamill = fonts.Families;
for (long i = fontfamill.GetLowerBound(0); i <= fontfamill.GetUpperBound(0); i++)
lsbPolice.Items.Add(fontfamill[i].Name);
fontfamill = null;
fonts = null;
lsbPolice.SelectedIndex = 0;
lblVisu.Text = "Voici le résultat";
int pos = -1;
if (lsbPolice.SelectedItem != null)
{
pos = lsbPolice.SelectedIndex;
lblVisu.Font = fontfamill[pos].Name;
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}
seulement maintenant, je ne peux pas faire lblVisu.Font = fontfamill[pos].Font car ca n'existe pas, il n'y a que .Name de disponible, mais .Name indique un type string, hors .Font est un type Font.
Je pensais que mon code chargeait les polices type font et insérait le nom de ses polices dans ma listbox, ai-je hormis qlqchose ?
& si je mets 'using System.Drawing.Text.InstalledFontCollection;' au début de mon code ?
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 22:24
j'aime beaucoup l'idée du bouton invisible tant que la condition n'est pas remplie, mais je cherche déjà à coder ce bouton Afficher.. Chaque chose en son temps, sinon je vais plus m'y retrouver ^^'
thibaultlavoisey
Messages postés11Date d'inscriptionsamedi 12 mars 2011StatutMembreDernière intervention18 août 2011 17 août 2011 à 23:31
Bon, je vais me pendre.. :(
lblVisu.Font fontfamill[pos];
> Erreur 1 Impossible de convertir implicitement le type 'System.Drawing.FontFamily' en 'System.Drawing.Font'
lblVisu.Font = (Font)fontfamill[pos];
Erreur 1 Impossible de convertir le type 'System.Drawing.FontFamily' en 'System.Drawing.Font'
lblVisu.Font new Font(fontfamill[pos].Name,20);
> Pas d'erreur, mais lors du débug : L'exception NullReferenceException n'a pas été gérée - La référence d'objet n'est pas définie à une instance d'un objet.